#include #include #include #include #include #include #include static int dirbug(); int main(int argc, char *argv[]) { return (dirbug()); } #define MAX_TEST_PATH_LEN 1024 int dirbug() { int error; int pid = getpid(); struct stat st; long len; char *buf = NULL; char *cwd = NULL; len = pathconf(".", _PC_PATH_MAX); if (((cwd = (char *)malloc((size_t)len)) == NULL) || ((buf = (char *)malloc((size_t)len + MAX_TEST_PATH_LEN)) == NULL)) { fprintf(stderr, "No memory to place current working dir (Err : %s)\n", strerror(errno)); goto err; } getcwd(cwd, len); sprintf(buf, "./parentdir"); fprintf(stderr, "** [%d] mkdir %s 0777\n", pid, buf); error = mkdir(buf, 0777); if (error && (errno != EEXIST)) { fprintf(stderr, "!! [%d] mkdir %s failed(%s)\n", pid, buf, strerror(errno)); goto err; } sprintf(buf, "./parentdir/sub.0"); fprintf(stderr, "** [%d] mkdir %s 0777\n", pid, buf); error = mkdir(buf, 0777); if (error && (errno != EEXIST)) { fprintf(stderr, "!! [%d] mkdir %s failed(%s)\n", pid, buf, strerror(errno)); goto err; } fprintf(stderr, "** [%d] chdir %s\n", pid, buf); error = chdir(buf); if (error) { fprintf(stderr, "!! [%d] chdir %s failed(%s)\n", pid, buf, strerror(errno)); goto err;; } sprintf(buf, "%s/parentdir", cwd); fprintf(stderr, "** [%d] rmdir %s\n", pid, buf); if (rmdir(buf)) fprintf(stderr, "!! [%d] rmdir %s failed(%s)\n", pid, buf, strerror(errno)); errno = 0; error = stat(buf, &st); fprintf(stderr, "!! [%d] stat() %s %s\n", pid, buf, strerror(errno)); sprintf(buf, "%s/parentdir/sub.1", cwd); fprintf(stderr, "** [%d] mkdir %s\n", pid, buf); error = mkdir(buf, 0777); if (error && (errno != EEXIST)) { fprintf(stderr, "!! [%d] mkdir %s failed(%s)\n", pid, buf, strerror(errno)); goto err; } return 0; err: if (cwd) free(cwd); if (buf) free(buf); return 1; }