33 #if defined(LIBC_SCCS) && !defined(lint)
34 static char sccsid[] =
"@(#)fts.c 8.6 (Berkeley) 8/14/94";
38 #include <sys/param.h>
39 #include <include/sys/stat.h>
48 #if defined(__UCLIBC__)
49 # define __fxstat64(_stat_ver, _fd, _sbp) fstat((_fd), (_sbp))
51 #if defined(hpux) || defined(__hpux)
52 # define _INCLUDE_POSIX_SOURCE
53 # define __errno_location() (&errno)
54 # define dirfd(dirp) -1
57 # define __fxstat64(_stat_ver, _fd, _sbp) fstat((_fd), (_sbp))
58 # define _D_EXACT_NAMLEN(d) ((d)->d_namlen)
60 #if defined(sun) || defined(RPM_OS_UNIXWARE)
61 # define __errno_location() (&errno)
62 # define dirfd(dirp) -1
64 # define __fxstat64(_stat_ver, _fd, _sbp) fstat((_fd), (_sbp))
66 #if defined(__APPLE__)
67 # include <sys/stat.h>
68 # define __errno_location() (__error())
69 #ifndef __DARWIN_STRUCT_STAT64
73 #ifndef __DARWIN_STRUCT_STAT64
74 # define __fxstat64(_stat_ver, _fd, _sbp) fstat((_fd), (_sbp))
76 # define __fxstat64(_stat_ver, _fd, _sbp) fstat64((_fd), (_sbp))
79 #if defined(__CYGWIN__) || defined(__MINGW32__)
80 # include <sys/stat.h>
81 #if defined(__CYGWIN__)
82 # define __errno_location() (__errno())
84 # define __errno_location() (_errno())
86 # define __errno_location() (&errno)
90 # define __fxstat64(_stat_ver, _fd, _sbp) fstat((_fd), (_sbp))
92 #if defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) || defined(__DragonFly__)
93 # define __errno_location() (&errno)
95 # define __fxstat64(_stat_ver, _fd, _sbp) fstat((_fd), (_sbp))
96 # define _D_EXACT_NAMLEN(d) ((d)->d_namlen)
99 # define __errno_location() (&errno)
100 # define dirfd(dirp) -1
103 # define __fxstat64(_stat_ver, _fd, _sbp) fstat((_fd), (_sbp))
104 # define _D_EXACT_NAMLEN(d) ((d)->d_namlen)
106 #if defined(RPM_OS_IRIX)
107 # define __errno_location() (&errno)
108 # define dirfd(dirp) -1
109 # define __fxstat64(_stat_ver, _fd, _sbp) fstat((_fd), (_sbp))
110 # define _D_EXACT_NAMLEN(d) ((d)->d_reclen)
112 #if defined(RPM_OS_AIX)
113 # define __errno_location() (&errno)
114 # define dirfd(dirp) ((dirp)->dd_fd)
116 # define __fxstat64(_stat_ver, _fd, _sbp) fstat((_fd), (_sbp))
117 # define _D_EXACT_NAMLEN(d) ((d)->d_namlen)
119 #if defined(RPM_OS_NTOQNX)
120 # define __errno_location() (&errno)
123 # define dirfd(dirp) -1
124 # define __fxstat64(_stat_ver, _fd, _sbp) fstat((_fd), (_sbp))
127 #if !defined(_D_EXACT_NAMLEN)
128 # define _D_EXACT_NAMLEN(d) (strlen((d)->d_name))
134 # define __set_errno(val) (*__errno_location ()) = (val)
136 # define __close close
137 # define __fchdir fchdir
140 #if !defined(USHRT_MAX)
141 #define USHRT_MAX 65535
147 #if defined __GNUC__ && __GNUC__ >= 2
148 # define alignof(TYPE) __alignof__ (TYPE)
150 # define alignof(TYPE) \
151 ((int) &((struct { char dummy1; TYPE dummy2; } *) 0)->dummy2)
153 #define ALIGNBYTES (alignof(long double) - 1)
157 #define ALIGN(p) (((unsigned long int) (p) + ALIGNBYTES) & ~ALIGNBYTES)
189 #define ISDOT(a) (a[0] == '.' && (!a[1] || (a[1] == '.' && !a[2])))
191 #define CLR(opt) (sp->fts_options &= ~(opt))
192 #define ISSET(opt) (sp->fts_options & (opt))
193 #define SET(opt) (sp->fts_options |= (opt))
195 #define FCHDIR(sp, fd) (!ISSET(FTS_NOCHDIR) && __fchdir(fd))
207 register FTSENT *p, *root;
215 fprintf(stderr,
"*** Fts_open(%p, 0x%x, %p)\n", argv, options, compar);
227 if ((sp = malloc((u_int)
sizeof(*sp))) == NULL)
229 memset(sp, 0,
sizeof(*sp));
230 sp->
fts_compar = (int (*) (
const void *,
const void *)) compar;
247 #define MAXPATHLEN 1024
257 if ((parent =
fts_alloc(sp,
"", 0)) == NULL)
263 for (root = NULL, nitems = 0; *argv != NULL; ++argv, ++
nitems) {
265 if ((len = strlen(*argv)) == 0) {
317 if (compar && nitems > 1)
377 register FTSENT *freep, *p;
381 fprintf(stderr,
"*** Fts_close(%p)\n", sp);
413 if (saved_errno != 0) {
431 (p->fts_path[p->fts_pathlen - 1] == '/' \
432 ? p->fts_pathlen - 1 : p->fts_pathlen)
444 fprintf(stderr,
"*** Fts_read(%p)\n", sp);
566 __open(
".", O_RDONLY, 0)) < 0) {
638 fprintf(stderr,
"*** Fts_set(%p, %p, 0x%x)\n", sp, p, instr);
658 fprintf(stderr,
"*** Fts_children(%p, 0x%x)\n", sp, instr);
712 if ((fd =
__open(
".", O_RDONLY, 0)) < 0)
738 register struct dirent *dp;
739 register FTSENT *p, *head;
744 int cderrno, descend, len, level, nlinks, saved_errno,
756 #if defined FTS_WHITEOUT && 0
758 oflag = DTF_NODUP|DTF_REWIND;
760 oflag = DTF_HIDEW|DTF_NODUP|DTF_REWIND;
762 # define __opendir2(path, flag) (*sp->fts_opendir) (path)
790 (void)printf(
"nlinks == %d (cur: %d)\n", nlinks, cur->
fts_nlink);
791 (void)printf(
"NOSTAT %d PHYSICAL %d SEEDOT %d\n",
810 if (nlinks || type ==
BREAD) {
814 if (nlinks && type ==
BREAD)
851 for (head = tail = NULL, nitems = 0;
867 mem1: saved_errno =
errno;
905 #if defined FTS_WHITEOUT && 0
926 #
if defined
DT_DIR && defined _DIRENT_HAVE_D_TYPE
988 if (descend && (type ==
BCHILD || !nitems) &&
1018 struct stat *sbp, sb;
1024 #if defined FTS_WHITEOUT && 0
1028 memset(sbp,
'\0',
sizeof (*sbp));
1029 sbp->st_mode = S_IFWHT;
1042 saved_errno =
errno;
1052 err: memset(sbp, 0,
sizeof(*sbp));
1056 if (S_ISDIR(sbp->st_mode)) {
1064 dev = p->
fts_dev = sbp->st_dev;
1065 ino = p->
fts_ino = sbp->st_ino;
1087 if (S_ISREG(sbp->st_mode))
1095 register FTSENT **ap, *p;
1122 for (head = *(ap = sp->
fts_array); --nitems; ++ap)
1142 len =
sizeof(*p) + namelen;
1145 if ((p = malloc(len)) == NULL)
1149 memmove(p->
fts_name, name, namelen);
1170 while ((p = head)) {
1220 #define ADJUST(p) do { \
1221 if ((p)->fts_accpath != (p)->fts_name) { \
1222 (p)->fts_accpath = \
1223 (char *)addr + ((p)->fts_accpath - (p)->fts_path); \
1225 (p)->fts_path = addr; \
1243 for (max = 0; *argv; ++argv)
1244 if ((len = strlen(*argv)) > max)
1257 int ret, oerrno, newfd;
1267 {
const char * lpath = NULL;
1268 int ut =
urlPath(path, &lpath);
1272 if (fd < 0 && (newfd =
__open(path, O_RDONLY, 0)) < 0)
1275 if (__fxstat64(_STAT_VER, newfd, &sb)) {