Update.
[glibc.git] / io / bug-ftw3.c
blobfcc2ca7bba7a13ab8ed9dee7fad0aa26793111b6
1 #include <errno.h>
2 #include <ftw.h>
3 #include <stdio.h>
4 #include <stdlib.h>
5 #include <string.h>
6 #include <unistd.h>
8 static int cb_called;
10 static int
11 cb (const char *fname, const struct stat *st, int flag)
13 printf ("%s %d\n", fname, flag);
14 cb_called = 1;
15 return 0;
18 int
19 main (void)
21 char tmp[] = "/tmp/ftwXXXXXX";
22 char tmp2[] = "/tmp/ftwXXXXXX/ftwXXXXXX";
23 char *dname;
24 char *dname2;
25 int r;
26 int e;
28 dname = mkdtemp (tmp);
29 if (dname == NULL)
31 printf ("mkdtemp: %m\n");
32 exit (1);
35 memcpy (tmp2, tmp, strlen (tmp));
36 dname2 = mkdtemp (tmp2);
37 if (dname2 == NULL)
39 printf ("mkdtemp: %m\n");
40 rmdir (dname);
41 exit (1);
44 if (chmod (dname, S_IWUSR|S_IWGRP|S_IWOTH) != 0)
46 printf ("chmod: %m\n");
47 rmdir (dname);
48 exit (1);
51 r = ftw (dname2, cb, 10);
52 e = errno;
53 printf ("r = %d", r);
54 if (r != 0)
55 printf (", errno = %d", errno);
56 puts ("");
58 chmod (dname, S_IRWXU|S_IRWXG|S_IRWXO);
59 rmdir (dname2);
60 rmdir (dname);
62 return (r != -1 && e == EACCES) || cb_called;