📄 fstest.c
字号:
TEST_EXPECT_CONDITION(mkdir("yoplait1", S_IRWXALL), RETVAL == 0); TEST_EXPECT_CONDITION(rename("yoplait1", "mouf1"), RETVAL == 0); TEST_EXPECT_CONDITION(fd = open("mouf1/a", O_RDWR | O_CREAT, S_IRWXALL), RETVAL == 19); TEST_EXPECT_CONDITION(unlink("mouf1/a"), RETVAL == 0); TEST_EXPECT_CONDITION(rmdir("mouf1"), RETVAL == 0); TEST_EXPECT_CONDITION(mkdir("yoplait2", S_IRWXALL), RETVAL == 0); TEST_EXPECT_CONDITION(rename("yoplait2", "mouf2"), RETVAL == 0); TEST_EXPECT_CONDITION(fd = open("mouf2/a", O_RDWR | O_CREAT, S_IRWXALL), RETVAL == 20); TEST_EXPECT_CONDITION(rmdir("mouf2"), RETVAL < 0); TEST_EXPECT_CONDITION(mkdir("yoplait3", S_IRWXALL), RETVAL == 0); TEST_EXPECT_CONDITION(rename("yoplait3", "mouf3"), RETVAL == 0); TEST_EXPECT_CONDITION(creat("mouf3/a", S_IRWXALL), RETVAL == 0); TEST_EXPECT_CONDITION(unlink("mouf3/a"), RETVAL == 0); TEST_EXPECT_CONDITION(rmdir("mouf3"), RETVAL == 0); TEST_EXPECT_CONDITION(mkdir("yoplait4", S_IRWXALL), RETVAL == 0); TEST_EXPECT_CONDITION(rename("yoplait4", "mouf4"), RETVAL == 0); TEST_EXPECT_CONDITION(creat("mouf4/a", S_IRWXALL), RETVAL == 0); TEST_EXPECT_CONDITION(rmdir("mouf4"), RETVAL < 0); ls("/", 1, 1); ls("/", 1, 1); ls("..", 1, 1); ls("../", 1, 1); ls("/..", 1, 1); /* subdirs */ TEST_EXPECT_CONDITION(fd = open("yo1/titi1.txt", O_RDONLY), RETVAL < 0); TEST_EXPECT_CONDITION(fd = open("yo1/titi1.txt", O_RDONLY | O_CREAT, S_IRUSR), RETVAL < 0); ls("/", 1, 1); ls("/yo1", 1, 1); TEST_EXPECT_CONDITION(mkdir("yo1", S_IRWXALL), RETVAL == 0); TEST_EXPECT_CONDITION(fd = open("yo1/titi1.txt", O_RDONLY), RETVAL < 0); TEST_EXPECT_CONDITION(fd = open("yo1/titi1.txt", O_RDONLY | O_CREAT, S_IRUSR), RETVAL == 21); ls("/", 1, 1); ls("/yo1", 1, 1); TEST_EXPECT_CONDITION(mkdir("yo2", S_IRUSR | S_IXUSR), RETVAL == 0); TEST_EXPECT_CONDITION(fd = open("yo2/titi1.txt", O_RDONLY), RETVAL < 0); TEST_EXPECT_CONDITION(fd = open("yo2/titi1.txt", O_RDONLY | O_CREAT, S_IRUSR), RETVAL < 0); ls("/", 1, 1); TEST_EXPECT_CONDITION(mkdir("yo3", S_IWUSR | S_IXUSR), RETVAL == 0); TEST_EXPECT_CONDITION(fd = open("yo3/titi1.txt", O_RDONLY), RETVAL < 0); TEST_EXPECT_CONDITION(fd = open("yo3/titi1.txt", O_RDONLY | O_CREAT, S_IRUSR), RETVAL == 22); ls("/", 1, 1); TEST_EXPECT_CONDITION(mkdir("yo4", S_IWUSR), RETVAL == 0); TEST_EXPECT_CONDITION(fd = open("yo4/titi1.txt", O_RDONLY), RETVAL < 0); TEST_EXPECT_CONDITION(fd = open("yo4/titi1.txt", O_RDONLY | O_CREAT, S_IRUSR), RETVAL < 0); ls("/", 1, 1); TEST_EXPECT_CONDITION(chdir("nowhere"), RETVAL < 0); TEST_EXPECT_CONDITION(chdir("yo1"), RETVAL == 0); ls(".", 1, 1); ls("/", 1, 1); ls("..", 1, 1); ls("../../../../", 1, 1); ls("/../../../../", 1, 1); /* Test chroot */ TEST_EXPECT_CONDITION(chroot("nowhere"), RETVAL < 0); TEST_EXPECT_CONDITION(chroot("."), RETVAL == 0); ls(".", 1, 1); ls("/", 1, 1); ls("..", 1, 1); ls("../../../../", 1, 1); ls("/../../../../", 1, 1); /* mount */ TEST_EXPECT_CONDITION(mount(NULL, "nowhere", NULL, 0, NULL), RETVAL < 0); TEST_EXPECT_CONDITION(mount(NULL, "nowhere", "yoplait", 0, NULL), RETVAL < 0); TEST_EXPECT_CONDITION(mount(NULL, "nowhere", "virtfs", 0, NULL), RETVAL < 0); TEST_EXPECT_CONDITION(mkdir("mnt", S_IRWXALL), RETVAL == 0); TEST_EXPECT_CONDITION(mkdir("mnt/subdir0", S_IRWXALL), RETVAL == 0); ls("/", 1, 1); TEST_EXPECT_CONDITION(mount(NULL, "mnt", "virtfs", 0, NULL), RETVAL == 0); ls("/", 1, 1); TEST_EXPECT_CONDITION(mkdir("mnt/subdir_mounted", S_IRWXALL), RETVAL == 0); ls("/", 1, 1); /* Make sure we cannot umount if the FS is in use */ TEST_EXPECT_CONDITION(fd = open("mnt/subdir_mounted", O_DIRECTORY), RETVAL == 23); TEST_EXPECT_CONDITION(umount("mnt"), RETVAL < 0); TEST_EXPECT_CONDITION(close(fd), RETVAL == 0); /* Make sure we cannot umount if the FS is in use */ TEST_EXPECT_CONDITION(chdir("mnt"), RETVAL == 0); TEST_EXPECT_CONDITION(umount("/mnt"), RETVAL < 0); TEST_EXPECT_CONDITION(chdir(".."), RETVAL == 0); ls(".", 1, 1); /* Create another process that chdirs in it */ if (fork() == 0) { bochs_printf("Hello from child\n"); TEST_EXPECT_CONDITION(chdir("mnt"), RETVAL == 0); TEST_EXPECT_CONDITION(fd = open("subdir_mounted", O_DIRECTORY), RETVAL == 23); bochs_printf("Child sleeping...\n"); nanosleep(2, 0); bochs_printf("Bye from child\n"); return 0; } else { bochs_printf("Father sleeping\n"); nanosleep(1, 0); bochs_printf("Father trying to umount, should fail (a process chdir'ed in it)\n"); TEST_EXPECT_CONDITION(umount("mnt"), RETVAL < 0); bochs_printf("Father Resuming normal operation in 3s...\n"); nanosleep(3, 0); } TEST_EXPECT_CONDITION(umount(NULL), RETVAL < 0); TEST_EXPECT_CONDITION(umount("nowhere"), RETVAL < 0); ls("/", 1, 1); TEST_EXPECT_CONDITION(umount("mnt"), RETVAL == 0); ls("/", 1, 1); TEST_EXPECT_CONDITION(umount("mnt"), RETVAL < 0); /* * Mountchain exploration */ TEST_EXPECT_CONDITION(mkdir("/mnt2", S_IRWXALL), RETVAL == 0); TEST_EXPECT_CONDITION(mkdir("/mnt2/nothing-mounted", S_IRWXALL), RETVAL == 0); TEST_EXPECT_CONDITION(mount(NULL, "mnt2", "virtfs", 0, NULL), RETVAL == 0); TEST_EXPECT_CONDITION(mkdir("/mnt2/mountpoint-1", S_IRWXALL), RETVAL == 0); TEST_EXPECT_CONDITION(mount(NULL, "mnt2", "virtfs", 0, NULL), RETVAL == 0); TEST_EXPECT_CONDITION(mkdir("/mnt2/mountpoint-2", S_IRWXALL), RETVAL == 0); ls("/", 1, 1); TEST_EXPECT_CONDITION(umount("mnt2"), RETVAL == 0); ls("/", 1, 1); TEST_EXPECT_CONDITION(umount("mnt2"), RETVAL == 0); ls("/", 1, 1); TEST_EXPECT_CONDITION(umount("mnt2"), RETVAL < 0); /* * Erasing files while they are in use */ TEST_EXPECT_CONDITION(fd = open("toto8.txt", O_RDWR | O_CREAT, S_IRUSR | S_IWUSR), RETVAL == 23); ls("/", 1, 1); TEST_EXPECT_CONDITION(unlink("toto8.txt"), RETVAL == 0); ls("/", 1, 1); strzcpy(buff, "Garbage garbage garbage", 256); TEST_EXPECT_CONDITION(len = read(fd, buff, 256), RETVAL == 0); TEST_EXPECT_CONDITION(lseek(fd, 0, SEEK_SET), RETVAL == 0); strzcpy(buff, "Hello world from toto8", 256); TEST_EXPECT_CONDITION(len = write(fd, buff, 24), RETVAL == 24); TEST_EXPECT_CONDITION(lseek(fd, 0, SEEK_SET), RETVAL == 0); strzcpy(buff, "Garbage garbage garbage", 256); TEST_EXPECT_CONDITION(len = read(fd, buff, 256), RETVAL == 24); bochs_printf("read s='%s'\n", buff); /* * rmdir on still used dirs */ TEST_EXPECT_CONDITION(mkdir("plotch", S_IRWXALL), RETVAL == 0); TEST_EXPECT_CONDITION(chdir("plotch"), RETVAL == 0); TEST_EXPECT_CONDITION(rmdir("../plotch"), RETVAL < 0); TEST_EXPECT_CONDITION(chdir(".."), RETVAL == 0); TEST_EXPECT_CONDITION(rmdir("plotch"), RETVAL == 0); ls("/", 1, 1); TEST_EXPECT_CONDITION(mkdir("plotch", S_IRWXALL), RETVAL == 0); TEST_EXPECT_CONDITION(creat("plotch/a", S_IRWXALL), RETVAL == 0); TEST_EXPECT_CONDITION(rmdir("plotch"), RETVAL < 0); TEST_EXPECT_CONDITION(unlink("plotch/a"), RETVAL == 0); TEST_EXPECT_CONDITION(rmdir("plotch"), RETVAL == 0); ls("/", 1, 1); TEST_EXPECT_CONDITION(mkdir("plotch", S_IRWXALL), RETVAL == 0); TEST_EXPECT_CONDITION(fd = open("plotch/a", O_RDWR | O_CREAT, S_IRWXALL), RETVAL == 24); TEST_EXPECT_CONDITION(rmdir("plotch"), RETVAL < 0); TEST_EXPECT_CONDITION(unlink("plotch/a"), RETVAL == 0); TEST_EXPECT_CONDITION(rmdir("plotch"), RETVAL == 0); TEST_EXPECT_CONDITION(close(fd), RETVAL == 0); ls("/", 1, 1); TEST_EXPECT_CONDITION(mkdir("this is ", S_IRWXALL), RETVAL == 0); TEST_EXPECT_CONDITION(mkdir("this is / a long path", S_IRWXALL), RETVAL == 0); TEST_EXPECT_CONDITION(mkdir("this is / a long path/tothe", S_IRWXALL), RETVAL == 0); TEST_EXPECT_CONDITION(mkdir("this is / a long path/tothe/destination ", S_IRWXALL), RETVAL == 0); TEST_EXPECT_CONDITION(mkdir("this is / a long path/tothe/destination / directory", S_IRWXALL), RETVAL == 0); TEST_EXPECT_CONDITION(fd = open("this is / a long path/tothe/destination / directory/a", O_RDWR | O_CREAT, S_IRWXALL), RETVAL == 24); TEST_EXPECT_CONDITION(rmdir("this is / a long path/tothe/destination / directory"), RETVAL < 0); TEST_EXPECT_CONDITION(unlink("this is / a long path/tothe/destination / directory/a"), RETVAL == 0); TEST_EXPECT_CONDITION(rmdir("this is / a long path/tothe/destination / directory"), RETVAL == 0); TEST_EXPECT_CONDITION(rmdir("this is / a long path/tothe/destination / directory/"), RETVAL < 0); TEST_EXPECT_CONDITION(rmdir("this is / a long path/tothe/destination "), RETVAL == 0); TEST_EXPECT_CONDITION(rmdir("this is / a long path/tothe/"), RETVAL == 0); TEST_EXPECT_CONDITION(rmdir("this is / a long path"), RETVAL == 0); TEST_EXPECT_CONDITION(rmdir("this is "), RETVAL == 0); TEST_EXPECT_CONDITION(close(fd), RETVAL == 0); ls("/", 1, 1); /* * Unlink/link files while they are in use */ TEST_EXPECT_CONDITION(fd = open("toto8.txt", O_RDWR | O_CREAT, S_IRUSR | S_IWUSR), RETVAL == 24); ls("/", 1, 1); TEST_EXPECT_CONDITION(link("toto8.txt", "toto9.txt"), RETVAL == 0); TEST_EXPECT_CONDITION(unlink("toto8.txt"), RETVAL == 0); ls("/", 1, 1); strzcpy(buff, "Garbage garbage garbage", 256); TEST_EXPECT_CONDITION(len = read(fd, buff, 256), RETVAL == 0); TEST_EXPECT_CONDITION(lseek(fd, 0, SEEK_SET), RETVAL == 0); strzcpy(buff, "Hello world from toto8", 256); TEST_EXPECT_CONDITION(len = write(fd, buff, 24), RETVAL == 24); TEST_EXPECT_CONDITION(lseek(fd, 0, SEEK_SET), RETVAL == 0); strzcpy(buff, "Garbage garbage garbage", 256); TEST_EXPECT_CONDITION(len = read(fd, buff, 256), RETVAL == 24); bochs_printf("read s='%s'\n", buff); TEST_EXPECT_CONDITION(fd = open("toto8.txt", O_RDWR), RETVAL < 0); TEST_EXPECT_CONDITION(fd = open("toto9.txt", O_RDWR), RETVAL == 25); strzcpy(buff, "Garbage garbage garbage", 256); TEST_EXPECT_CONDITION(len = read(fd, buff, 256), RETVAL == 24); bochs_printf("read s='%s'\n", buff); TEST_EXPECT_CONDITION(unlink("toto9.txt"), RETVAL == 0); ls("/", 1, 1); /* * Rename files while they are in use */ TEST_EXPECT_CONDITION(fd = open("toto8.txt", O_RDWR | O_CREAT, S_IRUSR | S_IWUSR), RETVAL == 26); ls("/", 1, 1); TEST_EXPECT_CONDITION(rename("toto8.txt", "toto9.txt"), RETVAL == 0); ls("/", 1, 1); strzcpy(buff, "Garbage garbage garbage", 256); TEST_EXPECT_CONDITION(len = read(fd, buff, 256), RETVAL == 0); TEST_EXPECT_CONDITION(lseek(fd, 0, SEEK_SET), RETVAL == 0); strzcpy(buff, "Hello world from toto8", 256); TEST_EXPECT_CONDITION(len = write(fd, buff, 24), RETVAL == 24); TEST_EXPECT_CONDITION(lseek(fd, 0, SEEK_SET), RETVAL == 0); strzcpy(buff, "Garbage garbage garbage", 256); TEST_EXPECT_CONDITION(len = read(fd, buff, 256), RETVAL == 24); bochs_printf("read s='%s'\n", buff); TEST_EXPECT_CONDITION(close(fd), RETVAL == 0); TEST_EXPECT_CONDITION(fd = open("toto8.txt", O_RDWR), RETVAL < 0); TEST_EXPECT_CONDITION(fd = open("toto9.txt", O_RDWR), RETVAL == 26); strzcpy(buff, "Garbage garbage garbage", 256); TEST_EXPECT_CONDITION(len = read(fd, buff, 256), RETVAL == 24); bochs_printf("read s='%s'\n", buff); TEST_EXPECT_CONDITION(unlink("toto9.txt"), RETVAL == 0); TEST_EXPECT_CONDITION(close(fd), RETVAL == 0); /* Rename */ ls("/", 1, 1); TEST_EXPECT_CONDITION(rename("/mnt/subdir0", "subdir42"), RETVAL == 0); ls("/", 1, 1); TEST_EXPECT_CONDITION(rename("titi1.txt", "subdir42"), RETVAL < 0); ls("/", 1, 1); TEST_EXPECT_CONDITION(rename("titi1.txt", "subdir42/titi.txt"), RETVAL == 0); /* Rename a dir being used */ TEST_EXPECT_CONDITION(chdir("subdir42"), RETVAL == 0); ls(".", 1, 1); ls("..", 1, 1); ls("/", 1, 1); TEST_EXPECT_CONDITION(rename("../subdir42", "../subdir000"), RETVAL == 0); ls(".", 1, 1); ls("/", 1, 1); ls("..", 1, 1); /* * test mmap */ /* Common use: shared file suppressed as soon as possible */ TEST_EXPECT_CONDITION(fd = open("mmap.txt", O_RDWR | O_CREAT, S_IRUSR | S_IWUSR), RETVAL == 26); if (fork() == 0) { char *shrd; TEST_EXPECT_CONDITION(shrd = mmap(NULL, 4096, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 4096), shrd != NULL); nanosleep(1, 0); strzcpy(shrd, "Hello1 from the child (shared mapping) !", 4096); return 0; } else { char *shrd; TEST_EXPECT_CONDITION(shrd = mmap(NULL, 4096, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 4096), shrd != NULL); strzcpy(shrd, "Garbage garbage garbage", 256); nanosleep(2, 0); bochs_printf("Father woken up\n"); bochs_printf("Read string from child: '%s'\n", shrd); TEST_EXPECT_CONDITION(strcmp(shrd, "Hello1 from the child (shared mapping) !"), RETVAL == 0); munmap(shrd, 8192); } ls("/", 1, 1); TEST_EXPECT_CONDITION(unlink("mmap.txt"), RETVAL == 0); ls("/", 1, 1); /* Common use: shared file suppressed as soon as possible */ TEST_EXPECT_CONDITION(fd = open("mmap.txt", O_RDWR | O_CREAT, S_IRUSR | S_IWUSR), RETVAL == 27); TEST_EXPECT_CONDITION(unlink("mmap.txt"), RETVAL == 0); if (fork() == 0) { char *shrd; TEST_EXPECT_CONDITION(shrd = mmap(NULL, 4096, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 4096), shrd != NULL); nanosleep(1, 0); strzcpy(shrd, "Hello2 from the child (shared mapping) !", 4096); return 0; } else { char *shrd; TEST_EXPECT_CONDITION(shrd = mmap(NULL, 4096, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 4096), shrd != NULL); strzcpy(shrd, "Garbage garbage garbage", 256); nanosleep(2, 0); bochs_printf("Father woken up\n"); bochs_printf("Read string from child: '%s'\n", shrd); TEST_EXPECT_CONDITION(strcmp(shrd, "Hello2 from the child (shared mapping) !"), RETVAL == 0); } ls("/", 1, 1); /* Basic use */ TEST_EXPECT_CONDITION(creat("mmap.txt", S_IRWXALL), RETVAL == 0); if (fork() == 0) { char *shrd; TEST_EXPECT_CONDITION(fd = open("mmap.txt", O_RDWR | O_CREAT, S_IRUSR | S_IWUSR), RETVAL == 28); TEST_EXPECT_CONDITION(shrd = mmap(NULL, 4096, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 4096), shrd != NULL); nanosleep(1, 0); strzcpy(shrd, "Hello3 from the child (shared mapping) !", 4096); return 0; } else { char *shrd; TEST_EXPECT_CONDITION(fd = open("mmap.txt", O_RDWR | O_CREAT, S_IRUSR | S_IWUSR), RETVAL == 28); TEST_EXPECT_CONDITION(shrd = mmap(NULL, 4096, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 4096), shrd != NULL); strzcpy(shrd, "Garbage garbage garbage", 256); nanosleep(2, 0); bochs_printf("Father woken up\n"); bochs_printf("Read string from child: '%s'\n", shrd); TEST_EXPECT_CONDITION(strcmp(shrd, "Hello3 from the child (shared mapping) !"), RETVAL == 0); } ls("/", 1, 1); bochs_printf("Bye from fstest\n"); ls("/", 1, 1); return 0;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -