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(hpux) || defined(__hpux)
49 # define _INCLUDE_POSIX_SOURCE
50 # define __errno_location() (&errno)
51 # define dirfd(dirp) -1
54 # define __fxstat64(_stat_ver, _fd, _sbp) fstat((_fd), (_sbp))
57 # define __errno_location() (&errno)
58 # define dirfd(dirp) -1
60 # define __fxstat64(_stat_ver, _fd, _sbp) fstat((_fd), (_sbp))
62 #if defined(__APPLE__)
63 # define __errno_location() (__error())
66 # define __fxstat64(_stat_ver, _fd, _sbp) fstat((_fd), (_sbp))
68 #if defined(__FreeBSD__)
69 # define __errno_location() (&errno)
71 # define __fxstat64(_stat_ver, _fd, _sbp) fstat((_fd), (_sbp))
77 # define __set_errno(val) (*__errno_location ()) = (val)
79 # define __close close
80 # define __fchdir fchdir
83 #if !defined(USHRT_MAX)
84 #define USHRT_MAX 65535
90 #if defined __GNUC__ && __GNUC__ >= 2
91 # define alignof(TYPE) __alignof__ (TYPE)
93 # define alignof(TYPE) \
94 ((int) &((struct { char dummy1; TYPE dummy2; } *) 0)->dummy2)
96 #define ALIGNBYTES (alignof(long double) - 1)
100 #define ALIGN(p) (((unsigned long int) (p) + ALIGNBYTES) & ~ALIGNBYTES)
132 #define ISDOT(a) (a[0] == '.' && (!a[1] || (a[1] == '.' && !a[2])))
134 #define CLR(opt) (sp->fts_options &= ~(opt))
135 #define ISSET(opt) (sp->fts_options & (opt))
136 #define SET(opt) (sp->fts_options |= (opt))
138 #define FCHDIR(sp, fd) (!ISSET(FTS_NOCHDIR) && __fchdir(fd))
150 register FTSENT *p, *root;
158 fprintf(stderr,
"*** Fts_open(%p, 0x%x, %p)\n", argv, options, compar);
170 if ((sp = malloc((u_int)
sizeof(*sp))) == NULL)
172 memset(sp, 0,
sizeof(*sp));
173 sp->
fts_compar = (int (*) (
const void *,
const void *)) compar;
190 #define MAXPATHLEN 1024
201 if ((parent =
fts_alloc(sp,
"", 0)) == NULL)
208 for (root = NULL, nitems = 0; *argv != NULL; ++argv, ++nitems) {
210 if ((len = strlen(*argv)) == 0) {
267 if (compar && nitems > 1)
330 register FTSENT *freep, *p;
365 if (saved_errno != 0) {
385 (p->fts_path[p->fts_pathlen - 1] == '/' \
386 ? p->fts_pathlen - 1 : p->fts_pathlen)
519 __open(
".", O_RDONLY, 0)) < 0) {
595 fprintf(stderr,
"*** Fts_set(%p, %p, 0x%x)\n", sp, p, instr);
617 fprintf(stderr,
"*** Fts_children(%p, 0x%x)\n", sp, instr);
675 if ((fd =
__open(
".", O_RDONLY, 0)) < 0)
701 register struct dirent *dp;
702 register FTSENT *p, *head;
707 int cderrno, descend, len, level, nlinks, saved_errno,
719 #if defined FTS_WHITEOUT && 0
721 oflag = DTF_NODUP|DTF_REWIND;
723 oflag = DTF_HIDEW|DTF_NODUP|DTF_REWIND;
725 # define __opendir2(path, flag) (*sp->fts_opendir) (path)
753 (void)printf(
"nlinks == %d (cur: %d)\n", nlinks, cur->
fts_nlink);
754 (void)printf(
"NOSTAT %d PHYSICAL %d SEEDOT %d\n",
773 if (nlinks || type ==
BREAD) {
775 if (nlinks && type ==
BREAD)
814 for (head = tail = NULL, nitems = 0;
830 mem1: saved_errno =
errno;
868 #if defined FTS_WHITEOUT && 0
869 if (dp->d_type == DT_WHT)
889 #
if defined DT_DIR && defined _DIRENT_HAVE_D_TYPE
891 dp->d_type != DT_DIR && dp->d_type != DT_UNKNOWN)
953 if (descend && (type ==
BCHILD || !nitems) &&
983 struct stat *sbp, sb;
989 #if defined FTS_WHITEOUT && 0
993 memset(sbp,
'\0',
sizeof (*sbp));
994 sbp->st_mode = S_IFWHT;
1007 saved_errno =
errno;
1020 err: memset(sbp, 0,
sizeof(*sbp));
1025 if (S_ISDIR(sbp->st_mode)) {
1033 dev = p->
fts_dev = sbp->st_dev;
1034 ino = p->
fts_ino = sbp->st_ino;
1056 if (S_ISREG(sbp->st_mode))
1064 register FTSENT **ap, *p;
1092 for (head = *(ap = sp->
fts_array); --nitems; ++ap)
1113 len =
sizeof(*p) + namelen;
1116 if ((p = malloc(len)) == NULL)
1121 memmove(p->
fts_name, name, namelen);
1144 while ((p = head)) {
1197 #define ADJUST(p) do { \
1198 if ((p)->fts_accpath != (p)->fts_name) { \
1199 (p)->fts_accpath = \
1200 (char *)addr + ((p)->fts_accpath - (p)->fts_path); \
1202 (p)->fts_path = addr; \
1220 for (max = 0; *argv; ++argv)
1221 if ((len = strlen(*argv)) > max)
1234 int ret, oerrno, newfd;
1240 if (fd < 0 && (newfd =
__open(path, O_RDONLY, 0)) < 0)
1242 if (__fxstat64(_STAT_VER, newfd, &sb)) {