#include <errno.h> #include <ftw.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> static int cb_called; static int cb (const char *fname, const struct stat *st, int flag) { printf ("%s %d\n", fname, flag); cb_called = 1; return 0; } int main (void) { char tmp[] = "/tmp/ftwXXXXXX"; char tmp2[] = "/tmp/ftwXXXXXX/ftwXXXXXX"; char *dname; char *dname2; int r; int e; if (getuid () == 0) { puts ("this test needs to be run by ordinary user"); exit (0); } dname = mkdtemp (tmp); if (dname == NULL) { printf ("mkdtemp: %m\n"); exit (1); } memcpy (tmp2, tmp, strlen (tmp)); dname2 = mkdtemp (tmp2); if (dname2 == NULL) { printf ("mkdtemp: %m\n"); rmdir (dname); exit (1); } if (chmod (dname, S_IWUSR|S_IWGRP|S_IWOTH) != 0) { printf ("chmod: %m\n"); rmdir (dname); exit (1); } r = ftw (dname2, cb, 10); e = errno; printf ("r = %d", r); if (r != 0) printf (", errno = %d", errno); puts (""); chmod (dname, S_IRWXU|S_IRWXG|S_IRWXO); rmdir (dname2); rmdir (dname); return (r != -1 && e == EACCES) || cb_called; }