void test_main (void) { int root_fd, a_fd0; char name[READDIR_MAX_LEN + 1]; root_fd = wrap_open ("/"); CHECK (mkdir ("a"), "mkdir \"a\""); a_fd0 = wrap_open ("/a"); CHECK (!readdir (a_fd0, name), "verify \"/a\" is empty"); CHECK (inumber (root_fd) != inumber (a_fd0), "\"/\" and \"/a\" must have different inumbers"); CHECK (chdir ("a"), "chdir \"a\""); msg ("try to remove \"/a\""); if (remove ("/a")) { msg ("remove successful"); CHECK (open ("/a") == -1, "open \"/a\" (must fail)"); CHECK (open (".") == -1, "open \".\" (must fail)"); CHECK (open ("..") == -1, "open \"..\" (must fail)"); CHECK (!create ("x", 512), "create \"x\" (must fail)"); } else { int a_fd1, a_fd2, a_fd3; msg ("remove failed"); CHECK (!remove ("../a"), "try to remove \"../a\" (must fail)"); CHECK (!remove (".././a"), "try to remove \".././a\" (must fail)"); CHECK (!remove ("/./a"), "try to remove \"/./a\" (must fail)"); a_fd1 = wrap_open ("/a"); a_fd2 = wrap_open ("."); CHECK (inumber (a_fd1) == inumber (a_fd2), "\"/a\" and \".\" must have same inumber"); CHECK (inumber (root_fd) != inumber (a_fd1), "\"/\" and \"/a\" must have different inumbers"); CHECK (chdir ("/a"), "chdir \"/a\""); a_fd3 = wrap_open ("."); CHECK (inumber (a_fd3) == inumber (a_fd1), "\".\" must have same inumber as before"); CHECK (chdir ("/"), "chdir \"/\""); CHECK (!remove ("a"), "try to remove \"a\" (must fail: still open)"); } CHECK (!readdir (a_fd0, name), "verify \"/a\" is empty"); }
int main(int argc, char **argv) { if (argc < 2) error_and_exit("not enough arguments"); char* argv_exec[argc]; argv_exec[0] = argv[1]; argv_exec[1] = argv[2]; for (int i = 2; i < argc-1; ++i) { argv_exec[i] = wrap_malloc(FILDES_LEN); memset(argv_exec[i], 0, FILDES_LEN); int fildes = wrap_open(argv[i+1], O_RDONLY); sprintf(argv_exec[i], "%d", fildes); } argv_exec[argc-1] = NULL; pid_t pid = wrap_fork(); if (pid != 0) { int stat; wrap_waitpid(pid, &stat, 0); if (!(WIFEXITED(stat) && WEXITSTATUS(stat) == 0)) error_and_exit("exit status of executed program"); } else { wrap_execvp(argv_exec[0], argv_exec); _exit(EXIT_SUCCESS); } for (int i = 2; i < argc-1; ++i) free(argv_exec[i]); return EXIT_SUCCESS; }