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 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 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 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 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 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 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