#define _GNU_SOURCE #include #include #include #include #include #ifndef SYS_accessat #define SYS_accessat 489 // Make sure this matches your system's syscall number for accessat #endif int main(int argc, char **argv) { if (argc != 3) { printf("Usage %s file symlink_to_file\n", argv[0]); return (0); } const char *pathname = argv[1]; const char *linkpath = argv[2]; int dirfd = AT_FDCWD; // Use the current working directory int mode = R_OK; // Check for read permission int flags = 0; { long result = syscall(SYS_accessat, dirfd, pathname, mode, flags); if (result == 0) { printf("File is accessible\n"); } else { perror("accessat"); } long result2 = syscall(SYS_accessat, dirfd, linkpath, mode, flags); if (result2 == 0) { printf("link is accessible\n"); } else { perror("accessat"); } } sleep(3); { printf("With AT_SYMLINK_NOFOLLOW:\n"); flags = AT_SYMLINK_NOFOLLOW; long result = syscall(SYS_accessat, dirfd, pathname, mode, flags); if (result == 0) { printf("File is accessible\n"); } else { perror("accessat"); } long result2 = syscall(SYS_accessat, dirfd, linkpath, mode, flags); if (result2 == 0) { printf("link is accessible\n"); } else { perror("accessat"); } } return 0; }