2 * t_access_root.c - trivial test program to show permission bug.
4 * Written by Michael Kerrisk - copyright ownership not pursued.
5 * Sourced from: http://linux.derkeiler.com/Mailing-Lists/Kernel/2003-10/6030.html
18 #define TESTPATH "/tmp/t_access"
28 accessTest(char *file, int mask, char *mstr)
30 printf("access(%s, %s) returns %d\n", file, mstr, access(file, mask));
34 main(int argc, char *argv[])
36 int fd, perm, uid, gid;
38 char cmd[PATH_MAX + 20];
40 testpath = (argc > 1) ? argv[1] : TESTPATH;
41 perm = (argc > 2) ? strtoul(argv[2], NULL, 8) : PERM;
42 uid = (argc > 3) ? atoi(argv[3]) : UID;
43 gid = (argc > 4) ? atoi(argv[4]) : GID;
47 fd = open(testpath, O_RDWR | O_CREAT, 0);
48 if (fd == -1) errExit("open");
50 if (fchown(fd, uid, gid) == -1) errExit("fchown");
51 if (fchmod(fd, perm) == -1) errExit("fchmod");
54 snprintf(cmd, sizeof(cmd), "ls -l %s", testpath);
57 if (seteuid(uid) == -1) errExit("seteuid");
59 accessTest(testpath, 0, "0");
60 accessTest(testpath, R_OK, "R_OK");
61 accessTest(testpath, W_OK, "W_OK");
62 accessTest(testpath, X_OK, "X_OK");
63 accessTest(testpath, R_OK | W_OK, "R_OK | W_OK");
64 accessTest(testpath, R_OK | X_OK, "R_OK | X_OK");
65 accessTest(testpath, W_OK | X_OK, "W_OK | X_OK");
66 accessTest(testpath, R_OK | W_OK | X_OK, "R_OK | W_OK | X_OK");