|  | #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; | 
|  | } |