#include #include #include #include #include #define AT_EMPTY_PATH 0x1000 #ifndef O_PATH #define O_PATH 010000000 #endif int main(int argc, char **argv) { char buf[128]; if (argc != 5) errx(1, "Usage: flinktest OLDPATH NEWPATH AT_EMPTY_PATH|proc"); int flag; if (!strcmp(argv[3], "normal")) flag = O_RDONLY; else if (!strcmp(argv[3], "O_PATH")) flag = O_PATH; else errx(1, "bad open mode"); int fd = open(argv[1], flag); if (fd == -1) err(1, "open"); if (!strcmp(argv[4], "AT_EMPTY_PATH")) { if (linkat(fd, "", AT_FDCWD, argv[2], AT_EMPTY_PATH) != 0) err(1, "linkat"); } else if (!strcmp(argv[4], "proc")) { sprintf(buf, "/proc/self/fd/%d", fd); if (linkat(AT_FDCWD, buf, AT_FDCWD, argv[2], AT_SYMLINK_FOLLOW) != 0) err(1, "linkat"); } else { errx(1, "invalid mode"); } return 0; }