#include #include #include #include #include #include #include #define MY_TEST_DIR_NAME "my_test_dir" #define MY_TEST_UID_1 42 #define MY_TEST_UID_2 43 #define MY_TEST_GROUP 2222 static void testDir(int flags) { system("ls -ld " MY_TEST_DIR_NAME); /* * Open the directory. */ int fd = open(MY_TEST_DIR_NAME, flags | O_NOFOLLOW); if (fd < 0) { fprintf(stderr, "Couldn't open directory (%s)\n", strerror(errno)); return; } system("ls -ld " MY_TEST_DIR_NAME); /* * Give it away. */ if (fchown(fd, MY_TEST_UID_1, MY_TEST_GROUP) != 0) { fprintf(stderr, "Can't do first change of ownership (%s)\n", strerror(errno)); close(fd); return; } system("ls -ld " MY_TEST_DIR_NAME); /* * Give it away again. */ if (fchown(fd, MY_TEST_UID_2, MY_TEST_GROUP) != 0) { fprintf(stderr, "Can't do second change of ownership (%s)\n", strerror(errno)); close(fd); return; } system("ls -ld " MY_TEST_DIR_NAME); printf("All OK!\n"); close(fd); } int main(int argc, char ** argv) { /* * Parse the args. */ if (argc != 3) { fprintf(stderr, "Usage: %s [O_RDONLY|O_WRONLY] mode\n", argv[0]); exit(1); } int flags; if (strcmp(argv[1], "O_RDONLY") == 0) { flags = O_RDONLY; } else if (strcmp(argv[1], "O_WRONLY") == 0) { flags = O_WRONLY; } else { fprintf(stderr, "Argument must be O_RDONLY or O_WRONLY\n"); exit(1); } int mode = (int)strtol(argv[2], NULL, 0); /* * Will only work as root. */ if (geteuid() != 0) { fprintf(stderr, "Must run test as root.\n"); exit(1); } /* * Create a directory. */ if (mkdir(MY_TEST_DIR_NAME, mode) < 0) { fprintf(stderr, "Can't create directory(%s)\n", strerror(errno)); exit(1); } testDir(flags); /* * Delete the directory. */ if (rmdir(MY_TEST_DIR_NAME) < 0) { fprintf(stderr, "Can't delete directory(%s)\n", strerror(errno)); exit(1); } exit(0); }