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