1 #include <fcntl.h>
2 #include <string.h>
3 #include <sys/stat.h>
4 #include <unistd.h>
5 
6 #include "pppd-private.h"
7 
8 /* globals used in test.c... */
9 int debug = 1;
10 int error_count;
11 int unsuccess;
12 
13 /* check if path exists and returns its type */
14 static int
file_type(char * path)15 file_type(char *path)
16 {
17     struct stat statbuf;
18 
19     if (stat(path, &statbuf) < 0)
20           return -1;
21 
22     return statbuf.st_mode & S_IFMT;
23 }
24 
25 int
test_simple()26 test_simple() {
27     if (mkdir_recursive("dir"))
28           return -1;
29 
30     if (file_type("dir") != S_IFDIR)
31           return -1;
32 
33     rmdir("dir");
34     return 0;
35 }
36 
37 int
test_recurse()38 test_recurse() {
39     if (mkdir_recursive("dir/subdir/subsubdir"))
40           return -1;
41 
42     if (file_type("dir/subdir/subsubdir") != S_IFDIR)
43           return -1;
44 
45     rmdir("dir/subdir/subsubdir");
46 
47     /* try again with partial existence */
48     if (mkdir_recursive("dir/subdir/subsubdir"))
49           return -1;
50 
51     if (file_type("dir/subdir/subsubdir") != S_IFDIR)
52           return -1;
53 
54     rmdir("dir/subdir/subsubdir");
55     rmdir("dir/subdir");
56     rmdir("dir");
57     return 0;
58 }
59 
60 int
test_recurse_multislash()61 test_recurse_multislash() {
62     if (mkdir_recursive("dir/subdir///subsubdir"))
63           return -1;
64 
65     if (file_type("dir/subdir/subsubdir") != S_IFDIR)
66           return -1;
67 
68     rmdir("dir/subdir/subsubdir");
69     rmdir("dir/subdir");
70 
71     /* try again with partial existence */
72     if (mkdir_recursive("dir/subdir/subsubdir///"))
73           return -1;
74 
75     if (file_type("dir/subdir/subsubdir") != S_IFDIR)
76           return -1;
77 
78     rmdir("dir/subdir/subsubdir");
79     rmdir("dir/subdir");
80     rmdir("dir");
81     return 0;
82 }
83 
84 int
test_parent_notdir()85 test_parent_notdir() {
86     int fd = open("file", O_CREAT, 0600);
87     if (fd < 0)
88           return -1;
89     close(fd);
90 
91     if (mkdir_recursive("file") == 0)
92           return -1;
93     if (mkdir_recursive("file/dir") == 0)
94           return -1;
95 
96     unlink("file");
97     return 0;
98 }
99 
100 int
main()101 main()
102 {
103     char *base_dir = strdup("/tmp/ppp_utils_utest.XXXXXX");
104     int failure = 0;
105 
106     if (mkdtemp(base_dir) == NULL) {
107           printf("Could not create test directory, aborting\n");
108           return 1;
109     }
110 
111     if (chdir(base_dir) < 0) {
112           printf("Could not enter newly created test dir, aborting\n");
113           return 1;
114     }
115 
116     if (test_simple()) {
117           printf("Could not create simple directory\n");
118           failure++;
119     }
120 
121     if (test_recurse()) {
122           printf("Could not create recursive directory\n");
123           failure++;
124     }
125 
126     if (test_recurse_multislash()) {
127           printf("Could not create recursive directory with multiple slashes\n");
128           failure++;
129     }
130 
131     if (test_parent_notdir()) {
132           printf("Creating over a file appeared to work?\n");
133           failure++;
134     }
135 
136     rmdir(base_dir);
137     free(base_dir);
138     return failure;
139 }
140