int dokilldir(char *board) { char hehe[255]; int killed; if (!board[0]) return 0; strcpy(hehe, "boards"); strcat(hehe, "/"); strcat(hehe, board); killed = killdir(hehe, ".DELETED") + killdir(hehe, ".JUNK"); if (killed > 0) newbbslog(BBSLOG_USIES, "deleted %d files in %s board", killed, board); return killed; }
/* * Try getcwd. */ static void test7(void) { char buf[PATH_MAX]; startup(); killdir(); if (getcwd(buf, sizeof(buf))==NULL) { switch (errno) { case EINVAL: case EIO: case ENOENT: break; default: err(1, "getcwd after removing %s", testdir); break; } } else { errx(1, "getcwd after removing %s: succeeded (got %s)", testdir, buf); } finish(); }
/* * Basic test - just try removing the directory without doing anything * evil. */ static void test1(void) { tprintf("Making %s\n", testdir); startup(); tprintf("Removing %s while in it\n", testdir); killdir(); tprintf("Leaving the test directory\n"); finish(); }
/* * Now try listing the directory. */ static void test6(void) { char buf[PATH_MAX]; int fd, len; tprintf("Now trying to list the directory...\n"); startup(); fd = open(".", O_RDONLY); if (fd<0) { err(1, ".: open"); } killdir(); while ((len = getdirentry(fd, buf, sizeof(buf)-1))>0) { if ((unsigned)len >= sizeof(buf)-1) { errx(1, ".: getdirentry: returned invalid length"); } buf[len] = 0; if (!strcmp(buf, ".") || !strcmp(buf, "..")) { /* these are allowed to appear */ continue; } errx(1, ".: getdirentry: returned unexpected name %s", buf); } if (len==0) { /* EOF - ok */ } else { /* len < 0 */ switch (errno) { case EINVAL: case EIO: break; default: err(1, ".: getdirentry"); break; } } finish(); /* close *after* leaving, just for excitement */ if (close(fd)<0) { err(1, "removed %s: close", testdir); } }
static void test2(void) { int fd; tprintf("Now trying with the directory open...\n"); startup(); fd = open(".", O_RDONLY); if (fd<0) { err(1, ".: open"); } killdir(); finish(); /* close *after* leaving, just for excitement */ if (close(fd)<0) { err(1, "removed %s: close", testdir); } }
static void test4(void) { char buf[4096]; int fd; tprintf("Checking if creating files works after rmdir...\n"); startup(); killdir(); fd = open("newfile", O_WRONLY|O_CREAT|O_TRUNC, 0664); if (fd<0) { switch (errno) { case EINVAL: case EIO: case ENOENT: break; default: err(1, "%s", buf); break; } } else { warnx("newfile: creating files after rmdir works"); warnx("(this is only ok if the space gets reclaimed)"); /* * Waste a bunch of space so we'll be able to tell */ memset(buf, 'J', sizeof(buf)); write(fd, buf, sizeof(buf)); write(fd, buf, sizeof(buf)); write(fd, buf, sizeof(buf)); write(fd, buf, sizeof(buf)); close(fd); } finish(); }
static void test5(void) { tprintf("Checking if creating subdirs works after rmdir...\n"); startup(); killdir(); if (mkdir("newdir", 0775)<0) { switch (errno) { case EINVAL: case EIO: case ENOENT: break; default: err(1, "mkdir in removed dir"); break; } } else { warnx("newfile: creating directories after rmdir works"); warnx("(this is only ok if the space gets reclaimed)"); /* * Waste a bunch of space so we'll be able to tell */ mkdir("newdir/t0", 0775); mkdir("newdir/t1", 0775); mkdir("newdir/t2", 0775); mkdir("newdir/t3", 0775); mkdir("newdir/t4", 0775); mkdir("newdir/t5", 0775); } finish(); }
static void test3(void) { char buf[PATH_MAX]; int fd; tprintf("Checking if . exists after rmdir\n"); startup(); killdir(); fd = open(".", O_RDONLY); if (fd<0) { switch (errno) { case EINVAL: case EIO: case ENOENT: break; default: err(1, "."); break; } } else { close(fd); } fd = open("..", O_RDONLY); if (fd<0) { switch (errno) { case EINVAL: case EIO: case ENOENT: break; default: err(1, ".."); break; } } else { warnx("..: openable after rmdir - might be bad"); close(fd); } snprintf(buf, sizeof(buf), "../%s", testdir); fd = open(buf, O_RDONLY); if (fd<0) { switch (errno) { case EINVAL: case EIO: case ENOENT: break; default: err(1, "%s", buf); break; } } else { errx(1, "%s: works after rmdir", buf); } finish(); }