#include #include #include #include #include "pppd-private.h" /* globals used in test.c... */ int debug = 1; int error_count; int unsuccess; /* check if path exists and returns its type */ static int file_type(char *path) { struct stat statbuf; if (stat(path, &statbuf) < 0) return -1; return statbuf.st_mode & S_IFMT; } int test_simple() { if (mkdir_recursive("dir")) return -1; if (file_type("dir") != S_IFDIR) return -1; rmdir("dir"); return 0; } int test_recurse() { if (mkdir_recursive("dir/subdir/subsubdir")) return -1; if (file_type("dir/subdir/subsubdir") != S_IFDIR) return -1; rmdir("dir/subdir/subsubdir"); /* try again with partial existence */ if (mkdir_recursive("dir/subdir/subsubdir")) return -1; if (file_type("dir/subdir/subsubdir") != S_IFDIR) return -1; rmdir("dir/subdir/subsubdir"); rmdir("dir/subdir"); rmdir("dir"); return 0; } int test_recurse_multislash() { if (mkdir_recursive("dir/subdir///subsubdir")) return -1; if (file_type("dir/subdir/subsubdir") != S_IFDIR) return -1; rmdir("dir/subdir/subsubdir"); rmdir("dir/subdir"); /* try again with partial existence */ if (mkdir_recursive("dir/subdir/subsubdir///")) return -1; if (file_type("dir/subdir/subsubdir") != S_IFDIR) return -1; rmdir("dir/subdir/subsubdir"); rmdir("dir/subdir"); rmdir("dir"); return 0; } int test_parent_notdir() { int fd = open("file", O_CREAT, 0600); if (fd < 0) return -1; close(fd); if (mkdir_recursive("file") == 0) return -1; if (mkdir_recursive("file/dir") == 0) return -1; unlink("file"); return 0; } int main() { char *base_dir = strdup("/tmp/ppp_utils_utest.XXXXXX"); int failure = 0; if (mkdtemp(base_dir) == NULL) { printf("Could not create test directory, aborting\n"); return 1; } if (chdir(base_dir) < 0) { printf("Could not enter newly created test dir, aborting\n"); return 1; } if (test_simple()) { printf("Could not create simple directory\n"); failure++; } if (test_recurse()) { printf("Could not create recursive directory\n"); failure++; } if (test_recurse_multislash()) { printf("Could not create recursive directory with multiple slashes\n"); failure++; } if (test_parent_notdir()) { printf("Creating over a file appeared to work?\n"); failure++; } rmdir(base_dir); free(base_dir); return failure; }