b3b021021d9c43e54efe2a1b61b1e192c97a9845
[gnulib.git] / lib / fts.c
1 /* Traverse a file hierarchy.
2
3    Copyright (C) 2004, 2005, 2006 Free Software Foundation, Inc.
4
5    This program is free software; you can redistribute it and/or modify
6    it under the terms of the GNU General Public License as published by
7    the Free Software Foundation; either version 2, or (at your option)
8    any later version.
9
10    This program is distributed in the hope that it will be useful,
11    but WITHOUT ANY WARRANTY; without even the implied warranty of
12    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13    GNU General Public License for more details.
14
15    You should have received a copy of the GNU General Public License
16    along with this program; if not, write to the Free Software Foundation,
17    Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.  */
18
19 /*-
20  * Copyright (c) 1990, 1993, 1994
21  *      The Regents of the University of California.  All rights reserved.
22  *
23  * Redistribution and use in source and binary forms, with or without
24  * modification, are permitted provided that the following conditions
25  * are met:
26  * 1. Redistributions of source code must retain the above copyright
27  *    notice, this list of conditions and the following disclaimer.
28  * 2. Redistributions in binary form must reproduce the above copyright
29  *    notice, this list of conditions and the following disclaimer in the
30  *    documentation and/or other materials provided with the distribution.
31  * 4. Neither the name of the University nor the names of its contributors
32  *    may be used to endorse or promote products derived from this software
33  *    without specific prior written permission.
34  *
35  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
36  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
37  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
38  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
39  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
40  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
41  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
42  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
43  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
44  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
45  * SUCH DAMAGE.
46  */
47
48 #include <config.h>
49
50 #if defined(LIBC_SCCS) && !defined(lint)
51 static char sccsid[] = "@(#)fts.c       8.6 (Berkeley) 8/14/94";
52 #endif /* LIBC_SCCS and not lint */
53
54 #include "fts_.h"
55
56 #if HAVE_SYS_PARAM_H || defined _LIBC
57 # include <sys/param.h>
58 #endif
59 #ifdef _LIBC
60 # include <include/sys/stat.h>
61 #else
62 # include <sys/stat.h>
63 #endif
64 #include <fcntl.h>
65 #include <errno.h>
66 #include "dirfd.h"
67 #include <stdbool.h>
68 #include <stdlib.h>
69 #include <string.h>
70 #include <unistd.h>
71
72 #if ! _LIBC
73 # include "fcntl--.h"
74 # include "lstat.h"
75 # include "openat.h"
76 # include "unistd--.h"
77 # include "same-inode.h"
78 #endif
79
80 #include <dirent.h>
81 #ifndef _D_EXACT_NAMLEN
82 # define _D_EXACT_NAMLEN(dirent) strlen ((dirent)->d_name)
83 #endif
84
85 #if HAVE_STRUCT_DIRENT_D_TYPE
86 /* True if the type of the directory entry D is known.  */
87 # define DT_IS_KNOWN(d) ((d)->d_type != DT_UNKNOWN)
88 /* True if the type of the directory entry D must be T.  */
89 # define DT_MUST_BE(d, t) ((d)->d_type == (t))
90 #else
91 # define DT_IS_KNOWN(d) false
92 # define DT_MUST_BE(d, t) false
93 #endif
94
95 enum
96 {
97   FTS_NO_STAT_REQUIRED = 1,
98   FTS_STAT_REQUIRED = 2
99 };
100
101 #ifdef _LIBC
102 # undef close
103 # define close __close
104 # undef closedir
105 # define closedir __closedir
106 # undef fchdir
107 # define fchdir __fchdir
108 # undef open
109 # define open __open
110 # undef opendir
111 # define opendir __opendir
112 # undef readdir
113 # define readdir __readdir
114 #else
115 # undef internal_function
116 # define internal_function /* empty */
117 #endif
118
119 #ifndef __set_errno
120 # define __set_errno(Val) errno = (Val)
121 #endif
122
123 #ifndef __attribute__
124 # if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 8) || __STRICT_ANSI__
125 #  define __attribute__(x) /* empty */
126 # endif
127 #endif
128
129 #ifndef ATTRIBUTE_UNUSED
130 # define ATTRIBUTE_UNUSED __attribute__ ((__unused__))
131 #endif
132
133 /* If this host provides the openat function, then we can avoid
134    attempting to open "." in some initialization code below.  */
135 #ifdef HAVE_OPENAT
136 # define HAVE_OPENAT_SUPPORT 1
137 #else
138 # define HAVE_OPENAT_SUPPORT 0
139 #endif
140
141 static FTSENT   *fts_alloc (FTS *, const char *, size_t) internal_function;
142 static FTSENT   *fts_build (FTS *, int) internal_function;
143 static void      fts_lfree (FTSENT *) internal_function;
144 static void      fts_load (FTS *, FTSENT *) internal_function;
145 static size_t    fts_maxarglen (char * const *) internal_function;
146 static void      fts_padjust (FTS *, FTSENT *) internal_function;
147 static bool      fts_palloc (FTS *, size_t) internal_function;
148 static FTSENT   *fts_sort (FTS *, FTSENT *, size_t) internal_function;
149 static unsigned short int fts_stat (FTS *, FTSENT *, bool) internal_function;
150 static int      fts_safe_changedir (FTS *, FTSENT *, int, const char *)
151      internal_function;
152
153 #if _LGPL_PACKAGE
154 static bool enter_dir (FTS *fts, FTSENT *ent) { return true; }
155 static void leave_dir (FTS *fts, FTSENT *ent) {}
156 static bool setup_dir (FTS *fts) { return true; }
157 static void free_dir (FTS *fts) {}
158 #else
159 # include "fts-cycle.c"
160 #endif
161
162 #ifndef MAX
163 # define MAX(a,b) ((a) > (b) ? (a) : (b))
164 #endif
165
166 #ifndef SIZE_MAX
167 # define SIZE_MAX ((size_t) -1)
168 #endif
169
170 #ifndef O_DIRECTORY
171 # define O_DIRECTORY 0
172 #endif
173
174 #define ISDOT(a)        (a[0] == '.' && (!a[1] || (a[1] == '.' && !a[2])))
175 #define STREQ(a, b)     (strcmp ((a), (b)) == 0)
176
177 #define CLR(opt)        (sp->fts_options &= ~(opt))
178 #define ISSET(opt)      (sp->fts_options & (opt))
179 #define SET(opt)        (sp->fts_options |= (opt))
180
181 /* FIXME: make this a function */
182 #define RESTORE_INITIAL_CWD(sp)                 \
183   (fd_ring_clear (&((sp)->fts_fd_ring)),        \
184    FCHDIR ((sp), (ISSET (FTS_CWDFD) ? AT_FDCWD : (sp)->fts_rfd)))
185
186 /* FIXME: FTS_NOCHDIR is now misnamed.
187    Call it FTS_USE_FULL_RELATIVE_FILE_NAMES instead. */
188 #define FCHDIR(sp, fd)                                  \
189   (!ISSET(FTS_NOCHDIR) && (ISSET(FTS_CWDFD)             \
190                            ? (cwd_advance_fd ((sp), (fd), true), 0) \
191                            : fchdir (fd)))
192
193
194 /* fts_build flags */
195 /* FIXME: make this an enum */
196 #define BCHILD          1               /* fts_children */
197 #define BNAMES          2               /* fts_children, names only */
198 #define BREAD           3               /* fts_read */
199
200 #if FTS_DEBUG
201 # include <inttypes.h>
202 # include <stdint.h>
203 # include <stdio.h>
204 # include "getcwdat.h"
205 bool fts_debug = false;
206 # define Dprintf(x) do { if (fts_debug) printf x; } while (false)
207 #else
208 # define Dprintf(x)
209 # define fd_ring_check(x)
210 # define fd_ring_print(a, b, c)
211 #endif
212
213 #define LEAVE_DIR(Fts, Ent, Tag)                                \
214   do                                                            \
215     {                                                           \
216       Dprintf (("  %s-leaving: %s\n", Tag, (Ent)->fts_path));   \
217       leave_dir (Fts, Ent);                                     \
218       fd_ring_check (Fts);                                      \
219     }                                                           \
220   while (false)
221
222 static void
223 fd_ring_clear (I_ring *fd_ring)
224 {
225   while ( ! i_ring_empty (fd_ring))
226     {
227       int fd = i_ring_pop (fd_ring);
228       if (0 <= fd)
229         close (fd);
230     }
231 }
232
233 /* Overload the fts_statp->st_size member (otherwise unused, when
234    fts_info is FTS_NSOK) to indicate whether fts_read should stat
235    this entry or not.  */
236 static void
237 fts_set_stat_required (FTSENT *p, bool required)
238 {
239   if (p->fts_info != FTS_NSOK)
240     abort ();
241   p->fts_statp->st_size = (required
242                            ? FTS_STAT_REQUIRED
243                            : FTS_NO_STAT_REQUIRED);
244 }
245
246 /* file-descriptor-relative opendir.  */
247 /* FIXME: if others need this function, move it into lib/openat.c */
248 static inline DIR *
249 internal_function
250 opendirat (int fd, char const *dir)
251 {
252   int new_fd = openat (fd, dir, O_RDONLY);
253   DIR *dirp;
254
255   if (new_fd < 0)
256     return NULL;
257   dirp = fdopendir (new_fd);
258   if (dirp == NULL)
259     {
260       int saved_errno = errno;
261       close (new_fd);
262       errno = saved_errno;
263     }
264   return dirp;
265 }
266
267 /* Virtual fchdir.  Advance SP's working directory file descriptor,
268    SP->fts_cwd_fd, to FD, and push the previous value onto the fd_ring.
269    CHDIR_DOWN_ONE is true if FD corresponds to an entry in the directory
270    open on sp->fts_cwd_fd; i.e., to move the working directory one level
271    down.  */
272 static void
273 internal_function
274 cwd_advance_fd (FTS *sp, int fd, bool chdir_down_one)
275 {
276   int old = sp->fts_cwd_fd;
277   if (old == fd && old != AT_FDCWD)
278     abort ();
279
280   if (chdir_down_one)
281     {
282       /* Push "old" onto the ring.
283          If the displaced file descriptor is non-negative, close it.  */
284       int prev_fd_in_slot = i_ring_push (&sp->fts_fd_ring, old);
285       fd_ring_print (sp, stderr, "post-push");
286       if (0 <= prev_fd_in_slot)
287         close (prev_fd_in_slot); /* ignore any close failure */
288     }
289   else if ( ! ISSET (FTS_NOCHDIR))
290     {
291       if (0 <= old)
292         close (old); /* ignore any close failure */
293     }
294
295   sp->fts_cwd_fd = fd;
296 }
297
298 /* Open the directory DIR if possible, and return a file
299    descriptor.  Return -1 and set errno on failure.  It doesn't matter
300    whether the file descriptor has read or write access.  */
301
302 static inline int
303 internal_function
304 diropen (FTS const *sp, char const *dir)
305 {
306   int open_flags = (O_RDONLY | O_DIRECTORY | O_NOCTTY | O_NONBLOCK
307                     | (ISSET (FTS_PHYSICAL) ? O_NOFOLLOW : 0));
308
309   return (ISSET (FTS_CWDFD)
310           ? openat (sp->fts_cwd_fd, dir, open_flags)
311           : open (dir, open_flags));
312 }
313
314 FTS *
315 fts_open (char * const *argv,
316           register int options,
317           int (*compar) (FTSENT const **, FTSENT const **))
318 {
319         register FTS *sp;
320         register FTSENT *p, *root;
321         register size_t nitems;
322         FTSENT *parent = NULL;
323         FTSENT *tmp = NULL;     /* pacify gcc */
324         size_t len;
325         bool defer_stat;
326
327         /* Options check. */
328         if (options & ~FTS_OPTIONMASK) {
329                 __set_errno (EINVAL);
330                 return (NULL);
331         }
332         if ((options & FTS_NOCHDIR) && (options & FTS_CWDFD)) {
333                 __set_errno (EINVAL);
334                 return (NULL);
335         }
336         if ( ! (options & (FTS_LOGICAL | FTS_PHYSICAL))) {
337                 __set_errno (EINVAL);
338                 return (NULL);
339         }
340
341         /* Allocate/initialize the stream */
342         if ((sp = malloc(sizeof(FTS))) == NULL)
343                 return (NULL);
344         memset(sp, 0, sizeof(FTS));
345         sp->fts_compar = compar;
346         sp->fts_options = options;
347
348         /* Logical walks turn on NOCHDIR; symbolic links are too hard. */
349         if (ISSET(FTS_LOGICAL)) {
350                 SET(FTS_NOCHDIR);
351                 CLR(FTS_CWDFD);
352         }
353
354         /* Initialize fts_cwd_fd.  */
355         sp->fts_cwd_fd = AT_FDCWD;
356         if ( ISSET(FTS_CWDFD) && ! HAVE_OPENAT_SUPPORT)
357           {
358             /* While it isn't technically necessary to open "." this
359                early, doing it here saves us the trouble of ensuring
360                later (where it'd be messier) that "." can in fact
361                be opened.  If not, revert to FTS_NOCHDIR mode.  */
362             int fd = open (".", O_RDONLY);
363             if (fd < 0)
364               {
365                 /* Even if `.' is unreadable, don't revert to FTS_NOCHDIR mode
366                    on systems like Linux+PROC_FS, where our openat emulation
367                    is good enough.  Note: on a system that emulates
368                    openat via /proc, this technique can still fail, but
369                    only in extreme conditions, e.g., when the working
370                    directory cannot be saved (i.e. save_cwd fails) --
371                    and that happens on Linux only when "." is unreadable
372                    and the CWD would be longer than PATH_MAX.
373                    FIXME: once Linux kernel openat support is well established,
374                    replace the above open call and this entire if/else block
375                    with the body of the if-block below.  */
376                 if ( openat_needs_fchdir ())
377                   {
378                     SET(FTS_NOCHDIR);
379                     CLR(FTS_CWDFD);
380                   }
381               }
382             else
383               {
384                 close (fd);
385               }
386           }
387
388         /*
389          * Start out with 1K of file name space, and enough, in any case,
390          * to hold the user's file names.
391          */
392 #ifndef MAXPATHLEN
393 # define MAXPATHLEN 1024
394 #endif
395         {
396           size_t maxarglen = fts_maxarglen(argv);
397           if (! fts_palloc(sp, MAX(maxarglen, MAXPATHLEN)))
398                   goto mem1;
399         }
400
401         /* Allocate/initialize root's parent. */
402         if (*argv != NULL) {
403                 if ((parent = fts_alloc(sp, "", 0)) == NULL)
404                         goto mem2;
405                 parent->fts_level = FTS_ROOTPARENTLEVEL;
406           }
407
408         /* The classic fts implementation would call fts_stat with
409            a new entry for each iteration of the loop below.
410            If the comparison function is not specified or if the
411            FTS_DEFER_STAT option is in effect, don't stat any entry
412            in this loop.  This is an attempt to minimize the interval
413            between the initial stat/lstat/fstatat and the point at which
414            a directory argument is first opened.  This matters for any
415            directory command line argument that resides on a file system
416            without genuine i-nodes.  If you specify FTS_DEFER_STAT along
417            with a comparison function, that function must not access any
418            data via the fts_statp pointer.  */
419         defer_stat = (compar == NULL || ISSET(FTS_DEFER_STAT));
420
421         /* Allocate/initialize root(s). */
422         for (root = NULL, nitems = 0; *argv != NULL; ++argv, ++nitems) {
423                 /* Don't allow zero-length file names. */
424                 if ((len = strlen(*argv)) == 0) {
425                         __set_errno (ENOENT);
426                         goto mem3;
427                 }
428
429                 if ((p = fts_alloc(sp, *argv, len)) == NULL)
430                         goto mem3;
431                 p->fts_level = FTS_ROOTLEVEL;
432                 p->fts_parent = parent;
433                 p->fts_accpath = p->fts_name;
434                 /* Even when defer_stat is true, be sure to stat the first
435                    command line argument, since fts_read (at least with
436                    FTS_XDEV) requires that.  */
437                 if (defer_stat && root != NULL) {
438                         p->fts_info = FTS_NSOK;
439                         fts_set_stat_required(p, true);
440                 } else {
441                         p->fts_info = fts_stat(sp, p, false);
442                 }
443
444                 /*
445                  * If comparison routine supplied, traverse in sorted
446                  * order; otherwise traverse in the order specified.
447                  */
448                 if (compar) {
449                         p->fts_link = root;
450                         root = p;
451                 } else {
452                         p->fts_link = NULL;
453                         if (root == NULL)
454                                 tmp = root = p;
455                         else {
456                                 tmp->fts_link = p;
457                                 tmp = p;
458                         }
459                 }
460         }
461         if (compar && nitems > 1)
462                 root = fts_sort(sp, root, nitems);
463
464         /*
465          * Allocate a dummy pointer and make fts_read think that we've just
466          * finished the node before the root(s); set p->fts_info to FTS_INIT
467          * so that everything about the "current" node is ignored.
468          */
469         if ((sp->fts_cur = fts_alloc(sp, "", 0)) == NULL)
470                 goto mem3;
471         sp->fts_cur->fts_link = root;
472         sp->fts_cur->fts_info = FTS_INIT;
473         if (! setup_dir (sp))
474                 goto mem3;
475
476         /*
477          * If using chdir(2), grab a file descriptor pointing to dot to ensure
478          * that we can get back here; this could be avoided for some file names,
479          * but almost certainly not worth the effort.  Slashes, symbolic links,
480          * and ".." are all fairly nasty problems.  Note, if we can't get the
481          * descriptor we run anyway, just more slowly.
482          */
483         if (!ISSET(FTS_NOCHDIR) && !ISSET(FTS_CWDFD)
484             && (sp->fts_rfd = diropen (sp, ".")) < 0)
485                 SET(FTS_NOCHDIR);
486
487         i_ring_init (&sp->fts_fd_ring, -1);
488         return (sp);
489
490 mem3:   fts_lfree(root);
491         free(parent);
492 mem2:   free(sp->fts_path);
493 mem1:   free(sp);
494         return (NULL);
495 }
496
497 static void
498 internal_function
499 fts_load (FTS *sp, register FTSENT *p)
500 {
501         register size_t len;
502         register char *cp;
503
504         /*
505          * Load the stream structure for the next traversal.  Since we don't
506          * actually enter the directory until after the preorder visit, set
507          * the fts_accpath field specially so the chdir gets done to the right
508          * place and the user can access the first node.  From fts_open it's
509          * known that the file name will fit.
510          */
511         len = p->fts_pathlen = p->fts_namelen;
512         memmove(sp->fts_path, p->fts_name, len + 1);
513         if ((cp = strrchr(p->fts_name, '/')) && (cp != p->fts_name || cp[1])) {
514                 len = strlen(++cp);
515                 memmove(p->fts_name, cp, len + 1);
516                 p->fts_namelen = len;
517         }
518         p->fts_accpath = p->fts_path = sp->fts_path;
519         sp->fts_dev = p->fts_statp->st_dev;
520 }
521
522 int
523 fts_close (FTS *sp)
524 {
525         register FTSENT *freep, *p;
526         int saved_errno = 0;
527
528         /*
529          * This still works if we haven't read anything -- the dummy structure
530          * points to the root list, so we step through to the end of the root
531          * list which has a valid parent pointer.
532          */
533         if (sp->fts_cur) {
534                 for (p = sp->fts_cur; p->fts_level >= FTS_ROOTLEVEL;) {
535                         freep = p;
536                         p = p->fts_link != NULL ? p->fts_link : p->fts_parent;
537                         free(freep);
538                 }
539                 free(p);
540         }
541
542         /* Free up child linked list, sort array, file name buffer. */
543         if (sp->fts_child)
544                 fts_lfree(sp->fts_child);
545         free(sp->fts_array);
546         free(sp->fts_path);
547
548         if (ISSET(FTS_CWDFD))
549           {
550             if (0 <= sp->fts_cwd_fd)
551               close (sp->fts_cwd_fd);
552           }
553         else if (!ISSET(FTS_NOCHDIR))
554           {
555             /* Return to original directory, save errno if necessary. */
556             if (fchdir(sp->fts_rfd))
557               saved_errno = errno;
558             close(sp->fts_rfd);
559           }
560
561         fd_ring_clear (&sp->fts_fd_ring);
562         free_dir (sp);
563
564         /* Free up the stream pointer. */
565         free(sp);
566
567         /* Set errno and return. */
568         if (saved_errno) {
569                 __set_errno (saved_errno);
570                 return (-1);
571         }
572
573         return (0);
574 }
575
576 /*
577  * Special case of "/" at the end of the file name so that slashes aren't
578  * appended which would cause file names to be written as "....//foo".
579  */
580 #define NAPPEND(p)                                                      \
581         (p->fts_path[p->fts_pathlen - 1] == '/'                         \
582             ? p->fts_pathlen - 1 : p->fts_pathlen)
583
584 FTSENT *
585 fts_read (register FTS *sp)
586 {
587         register FTSENT *p, *tmp;
588         register unsigned short int instr;
589         register char *t;
590
591         /* If finished or unrecoverable error, return NULL. */
592         if (sp->fts_cur == NULL || ISSET(FTS_STOP))
593                 return (NULL);
594
595         /* Set current node pointer. */
596         p = sp->fts_cur;
597
598         /* Save and zero out user instructions. */
599         instr = p->fts_instr;
600         p->fts_instr = FTS_NOINSTR;
601
602         /* Any type of file may be re-visited; re-stat and re-turn. */
603         if (instr == FTS_AGAIN) {
604                 p->fts_info = fts_stat(sp, p, false);
605                 return (p);
606         }
607         Dprintf (("fts_read: p=%s\n",
608                   p->fts_info == FTS_INIT ? "" : p->fts_path));
609
610         /*
611          * Following a symlink -- SLNONE test allows application to see
612          * SLNONE and recover.  If indirecting through a symlink, have
613          * keep a pointer to current location.  If unable to get that
614          * pointer, follow fails.
615          */
616         if (instr == FTS_FOLLOW &&
617             (p->fts_info == FTS_SL || p->fts_info == FTS_SLNONE)) {
618                 p->fts_info = fts_stat(sp, p, true);
619                 if (p->fts_info == FTS_D && !ISSET(FTS_NOCHDIR)) {
620                         if ((p->fts_symfd = diropen (sp, ".")) < 0) {
621                                 p->fts_errno = errno;
622                                 p->fts_info = FTS_ERR;
623                         } else
624                                 p->fts_flags |= FTS_SYMFOLLOW;
625                 }
626                 goto check_for_dir;
627         }
628
629         /* Directory in pre-order. */
630         if (p->fts_info == FTS_D) {
631                 /* If skipped or crossed mount point, do post-order visit. */
632                 if (instr == FTS_SKIP ||
633                     (ISSET(FTS_XDEV) && p->fts_statp->st_dev != sp->fts_dev)) {
634                         if (p->fts_flags & FTS_SYMFOLLOW)
635                                 (void)close(p->fts_symfd);
636                         if (sp->fts_child) {
637                                 fts_lfree(sp->fts_child);
638                                 sp->fts_child = NULL;
639                         }
640                         p->fts_info = FTS_DP;
641                         LEAVE_DIR (sp, p, "1");
642                         return (p);
643                 }
644
645                 /* Rebuild if only read the names and now traversing. */
646                 if (sp->fts_child != NULL && ISSET(FTS_NAMEONLY)) {
647                         CLR(FTS_NAMEONLY);
648                         fts_lfree(sp->fts_child);
649                         sp->fts_child = NULL;
650                 }
651
652                 /*
653                  * Cd to the subdirectory.
654                  *
655                  * If have already read and now fail to chdir, whack the list
656                  * to make the names come out right, and set the parent errno
657                  * so the application will eventually get an error condition.
658                  * Set the FTS_DONTCHDIR flag so that when we logically change
659                  * directories back to the parent we don't do a chdir.
660                  *
661                  * If haven't read do so.  If the read fails, fts_build sets
662                  * FTS_STOP or the fts_info field of the node.
663                  */
664                 if (sp->fts_child != NULL) {
665                         if (fts_safe_changedir(sp, p, -1, p->fts_accpath)) {
666                                 p->fts_errno = errno;
667                                 p->fts_flags |= FTS_DONTCHDIR;
668                                 for (p = sp->fts_child; p != NULL;
669                                      p = p->fts_link)
670                                         p->fts_accpath =
671                                             p->fts_parent->fts_accpath;
672                         }
673                 } else if ((sp->fts_child = fts_build(sp, BREAD)) == NULL) {
674                         if (ISSET(FTS_STOP))
675                                 return (NULL);
676                         /* If fts_build's call to fts_safe_changedir failed
677                            because it was not able to fchdir into a
678                            subdirectory, tell the caller.  */
679                         if (p->fts_errno)
680                                 p->fts_info = FTS_ERR;
681                         LEAVE_DIR (sp, p, "2");
682                         return (p);
683                 }
684                 p = sp->fts_child;
685                 sp->fts_child = NULL;
686                 goto name;
687         }
688
689         /* Move to the next node on this level. */
690 next:   tmp = p;
691         if ((p = p->fts_link) != NULL) {
692                 free(tmp);
693
694                 /*
695                  * If reached the top, return to the original directory (or
696                  * the root of the tree), and load the file names for the next
697                  * root.
698                  */
699                 if (p->fts_level == FTS_ROOTLEVEL) {
700                         if (RESTORE_INITIAL_CWD(sp)) {
701                                 SET(FTS_STOP);
702                                 sp->fts_cur = p;
703                                 return (NULL);
704                         }
705                         fts_load(sp, p);
706                         goto check_for_dir;
707                 }
708
709                 /*
710                  * User may have called fts_set on the node.  If skipped,
711                  * ignore.  If followed, get a file descriptor so we can
712                  * get back if necessary.
713                  */
714                 if (p->fts_instr == FTS_SKIP)
715                         goto next;
716                 if (p->fts_instr == FTS_FOLLOW) {
717                         p->fts_info = fts_stat(sp, p, true);
718                         if (p->fts_info == FTS_D && !ISSET(FTS_NOCHDIR)) {
719                                 if ((p->fts_symfd = diropen (sp, ".")) < 0) {
720                                         p->fts_errno = errno;
721                                         p->fts_info = FTS_ERR;
722                                 } else
723                                         p->fts_flags |= FTS_SYMFOLLOW;
724                         }
725                         p->fts_instr = FTS_NOINSTR;
726                 }
727
728 name:           t = sp->fts_path + NAPPEND(p->fts_parent);
729                 *t++ = '/';
730                 memmove(t, p->fts_name, p->fts_namelen + 1);
731 check_for_dir:
732                 if (p->fts_info == FTS_NSOK)
733                   {
734                     switch (p->fts_statp->st_size)
735                       {
736                       case FTS_STAT_REQUIRED:
737                         p->fts_info = fts_stat(sp, p, false);
738                         break;
739                       case FTS_NO_STAT_REQUIRED:
740                         break;
741                       default:
742                         abort ();
743                       }
744                   }
745                 sp->fts_cur = p;
746                 if (p->fts_info == FTS_D)
747                   {
748                     Dprintf (("  entering: %s\n", p->fts_path));
749                     if (! enter_dir (sp, p))
750                       {
751                         __set_errno (ENOMEM);
752                         return NULL;
753                       }
754                   }
755                 return p;
756         }
757
758         /* Move up to the parent node. */
759         p = tmp->fts_parent;
760         free(tmp);
761
762         if (p->fts_level == FTS_ROOTPARENTLEVEL) {
763                 /*
764                  * Done; free everything up and set errno to 0 so the user
765                  * can distinguish between error and EOF.
766                  */
767                 free(p);
768                 __set_errno (0);
769                 return (sp->fts_cur = NULL);
770         }
771
772         if (p->fts_info == FTS_NSOK)
773           abort ();
774
775         /* NUL terminate the file name.  */
776         sp->fts_path[p->fts_pathlen] = '\0';
777
778         /*
779          * Return to the parent directory.  If at a root node, restore
780          * the initial working directory.  If we came through a symlink,
781          * go back through the file descriptor.  Otherwise, move up
782          * one level, via "..".
783          */
784         if (p->fts_level == FTS_ROOTLEVEL) {
785                 if (RESTORE_INITIAL_CWD(sp)) {
786                         p->fts_errno = errno;
787                         SET(FTS_STOP);
788                 }
789         } else if (p->fts_flags & FTS_SYMFOLLOW) {
790                 if (FCHDIR(sp, p->fts_symfd)) {
791                         int saved_errno = errno;
792                         (void)close(p->fts_symfd);
793                         __set_errno (saved_errno);
794                         p->fts_errno = errno;
795                         SET(FTS_STOP);
796                 }
797                 (void)close(p->fts_symfd);
798         } else if (!(p->fts_flags & FTS_DONTCHDIR) &&
799                    fts_safe_changedir(sp, p->fts_parent, -1, "..")) {
800                 p->fts_errno = errno;
801                 SET(FTS_STOP);
802         }
803         p->fts_info = p->fts_errno ? FTS_ERR : FTS_DP;
804         if (p->fts_errno == 0)
805                 LEAVE_DIR (sp, p, "3");
806         sp->fts_cur = p;
807         return ISSET(FTS_STOP) ? NULL : p;
808 }
809
810 /*
811  * Fts_set takes the stream as an argument although it's not used in this
812  * implementation; it would be necessary if anyone wanted to add global
813  * semantics to fts using fts_set.  An error return is allowed for similar
814  * reasons.
815  */
816 /* ARGSUSED */
817 int
818 fts_set(FTS *sp ATTRIBUTE_UNUSED, FTSENT *p, int instr)
819 {
820         if (instr != 0 && instr != FTS_AGAIN && instr != FTS_FOLLOW &&
821             instr != FTS_NOINSTR && instr != FTS_SKIP) {
822                 __set_errno (EINVAL);
823                 return (1);
824         }
825         p->fts_instr = instr;
826         return (0);
827 }
828
829 FTSENT *
830 fts_children (register FTS *sp, int instr)
831 {
832         register FTSENT *p;
833         int fd;
834
835         if (instr != 0 && instr != FTS_NAMEONLY) {
836                 __set_errno (EINVAL);
837                 return (NULL);
838         }
839
840         /* Set current node pointer. */
841         p = sp->fts_cur;
842
843         /*
844          * Errno set to 0 so user can distinguish empty directory from
845          * an error.
846          */
847         __set_errno (0);
848
849         /* Fatal errors stop here. */
850         if (ISSET(FTS_STOP))
851                 return (NULL);
852
853         /* Return logical hierarchy of user's arguments. */
854         if (p->fts_info == FTS_INIT)
855                 return (p->fts_link);
856
857         /*
858          * If not a directory being visited in pre-order, stop here.  Could
859          * allow FTS_DNR, assuming the user has fixed the problem, but the
860          * same effect is available with FTS_AGAIN.
861          */
862         if (p->fts_info != FTS_D /* && p->fts_info != FTS_DNR */)
863                 return (NULL);
864
865         /* Free up any previous child list. */
866         if (sp->fts_child != NULL)
867                 fts_lfree(sp->fts_child);
868
869         if (instr == FTS_NAMEONLY) {
870                 SET(FTS_NAMEONLY);
871                 instr = BNAMES;
872         } else
873                 instr = BCHILD;
874
875         /*
876          * If using chdir on a relative file name and called BEFORE fts_read
877          * does its chdir to the root of a traversal, we can lose -- we need to
878          * chdir into the subdirectory, and we don't know where the current
879          * directory is, so we can't get back so that the upcoming chdir by
880          * fts_read will work.
881          */
882         if (p->fts_level != FTS_ROOTLEVEL || p->fts_accpath[0] == '/' ||
883             ISSET(FTS_NOCHDIR))
884                 return (sp->fts_child = fts_build(sp, instr));
885
886         if ((fd = diropen (sp, ".")) < 0)
887                 return (sp->fts_child = NULL);
888         sp->fts_child = fts_build(sp, instr);
889         if (ISSET(FTS_CWDFD))
890           {
891             cwd_advance_fd (sp, fd, true);
892           }
893         else
894           {
895             if (fchdir(fd))
896               {
897                 int saved_errno = errno;
898                 close (fd);
899                 __set_errno (saved_errno);
900                 return NULL;
901               }
902             close (fd);
903           }
904         return (sp->fts_child);
905 }
906
907 /*
908  * This is the tricky part -- do not casually change *anything* in here.  The
909  * idea is to build the linked list of entries that are used by fts_children
910  * and fts_read.  There are lots of special cases.
911  *
912  * The real slowdown in walking the tree is the stat calls.  If FTS_NOSTAT is
913  * set and it's a physical walk (so that symbolic links can't be directories),
914  * we can do things quickly.  First, if it's a 4.4BSD file system, the type
915  * of the file is in the directory entry.  Otherwise, we assume that the number
916  * of subdirectories in a node is equal to the number of links to the parent.
917  * The former skips all stat calls.  The latter skips stat calls in any leaf
918  * directories and for any files after the subdirectories in the directory have
919  * been found, cutting the stat calls by about 2/3.
920  */
921 static FTSENT *
922 internal_function
923 fts_build (register FTS *sp, int type)
924 {
925         register struct dirent *dp;
926         register FTSENT *p, *head;
927         register size_t nitems;
928         FTSENT *cur, *tail;
929         DIR *dirp;
930         void *oldaddr;
931         int saved_errno;
932         bool descend;
933         bool doadjust;
934         ptrdiff_t level;
935         nlink_t nlinks;
936         bool nostat;
937         size_t len, maxlen, new_len;
938         char *cp;
939
940         /* Set current node pointer. */
941         cur = sp->fts_cur;
942
943         /*
944          * Open the directory for reading.  If this fails, we're done.
945          * If being called from fts_read, set the fts_info field.
946          */
947 #if defined FTS_WHITEOUT && 0
948         if (ISSET(FTS_WHITEOUT))
949                 oflag = DTF_NODUP|DTF_REWIND;
950         else
951                 oflag = DTF_HIDEW|DTF_NODUP|DTF_REWIND;
952 #else
953 # define __opendir2(file, flag) \
954         ( ! ISSET(FTS_NOCHDIR) && ISSET(FTS_CWDFD) \
955           ? opendirat(sp->fts_cwd_fd, file)        \
956           : opendir(file))
957 #endif
958        if ((dirp = __opendir2(cur->fts_accpath, oflag)) == NULL) {
959                 if (type == BREAD) {
960                         cur->fts_info = FTS_DNR;
961                         cur->fts_errno = errno;
962                 }
963                 return (NULL);
964         }
965        /* Rather than calling fts_stat for each and every entry encountered
966           in the readdir loop (below), stat each directory only right after
967           opening it.  */
968        if (cur->fts_info == FTS_NSOK)
969          cur->fts_info = fts_stat(sp, cur, false);
970
971         /*
972          * Nlinks is the number of possible entries of type directory in the
973          * directory if we're cheating on stat calls, 0 if we're not doing
974          * any stat calls at all, (nlink_t) -1 if we're statting everything.
975          */
976         if (type == BNAMES) {
977                 nlinks = 0;
978                 /* Be quiet about nostat, GCC. */
979                 nostat = false;
980         } else if (ISSET(FTS_NOSTAT) && ISSET(FTS_PHYSICAL)) {
981                 nlinks = (cur->fts_statp->st_nlink
982                           - (ISSET(FTS_SEEDOT) ? 0 : 2));
983                 nostat = true;
984         } else {
985                 nlinks = -1;
986                 nostat = false;
987         }
988
989         /*
990          * If we're going to need to stat anything or we want to descend
991          * and stay in the directory, chdir.  If this fails we keep going,
992          * but set a flag so we don't chdir after the post-order visit.
993          * We won't be able to stat anything, but we can still return the
994          * names themselves.  Note, that since fts_read won't be able to
995          * chdir into the directory, it will have to return different file
996          * names than before, i.e. "a/b" instead of "b".  Since the node
997          * has already been visited in pre-order, have to wait until the
998          * post-order visit to return the error.  There is a special case
999          * here, if there was nothing to stat then it's not an error to
1000          * not be able to stat.  This is all fairly nasty.  If a program
1001          * needed sorted entries or stat information, they had better be
1002          * checking FTS_NS on the returned nodes.
1003          */
1004         if (nlinks || type == BREAD) {
1005                 int dir_fd = dirfd(dirp);
1006                 if (ISSET(FTS_CWDFD) && 0 <= dir_fd)
1007                   dir_fd = dup (dir_fd);
1008                 if (dir_fd < 0 || fts_safe_changedir(sp, cur, dir_fd, NULL)) {
1009                         if (nlinks && type == BREAD)
1010                                 cur->fts_errno = errno;
1011                         cur->fts_flags |= FTS_DONTCHDIR;
1012                         descend = false;
1013                         closedir(dirp);
1014                         if (ISSET(FTS_CWDFD) && 0 <= dir_fd)
1015                                 close (dir_fd);
1016                         dirp = NULL;
1017                 } else
1018                         descend = true;
1019         } else
1020                 descend = false;
1021
1022         /*
1023          * Figure out the max file name length that can be stored in the
1024          * current buffer -- the inner loop allocates more space as necessary.
1025          * We really wouldn't have to do the maxlen calculations here, we
1026          * could do them in fts_read before returning the name, but it's a
1027          * lot easier here since the length is part of the dirent structure.
1028          *
1029          * If not changing directories set a pointer so that can just append
1030          * each new component into the file name.
1031          */
1032         len = NAPPEND(cur);
1033         if (ISSET(FTS_NOCHDIR)) {
1034                 cp = sp->fts_path + len;
1035                 *cp++ = '/';
1036         } else {
1037                 /* GCC, you're too verbose. */
1038                 cp = NULL;
1039         }
1040         len++;
1041         maxlen = sp->fts_pathlen - len;
1042
1043         level = cur->fts_level + 1;
1044
1045         /* Read the directory, attaching each entry to the `link' pointer. */
1046         doadjust = false;
1047         for (head = tail = NULL, nitems = 0; dirp && (dp = readdir(dirp));) {
1048                 bool is_dir;
1049
1050                 if (!ISSET(FTS_SEEDOT) && ISDOT(dp->d_name))
1051                         continue;
1052
1053                 if ((p = fts_alloc (sp, dp->d_name,
1054                                     _D_EXACT_NAMLEN (dp))) == NULL)
1055                         goto mem1;
1056                 if (_D_EXACT_NAMLEN (dp) >= maxlen) {
1057                         /* include space for NUL */
1058                         oldaddr = sp->fts_path;
1059                         if (! fts_palloc(sp, _D_EXACT_NAMLEN (dp) + len + 1)) {
1060                                 /*
1061                                  * No more memory.  Save
1062                                  * errno, free up the current structure and the
1063                                  * structures already allocated.
1064                                  */
1065 mem1:                           saved_errno = errno;
1066                                 free(p);
1067                                 fts_lfree(head);
1068                                 closedir(dirp);
1069                                 cur->fts_info = FTS_ERR;
1070                                 SET(FTS_STOP);
1071                                 __set_errno (saved_errno);
1072                                 return (NULL);
1073                         }
1074                         /* Did realloc() change the pointer? */
1075                         if (oldaddr != sp->fts_path) {
1076                                 doadjust = true;
1077                                 if (ISSET(FTS_NOCHDIR))
1078                                         cp = sp->fts_path + len;
1079                         }
1080                         maxlen = sp->fts_pathlen - len;
1081                 }
1082
1083                 new_len = len + _D_EXACT_NAMLEN (dp);
1084                 if (new_len < len) {
1085                         /*
1086                          * In the unlikely even that we would end up
1087                          * with a file name longer than SIZE_MAX, free up
1088                          * the current structure and the structures already
1089                          * allocated, then error out with ENAMETOOLONG.
1090                          */
1091                         free(p);
1092                         fts_lfree(head);
1093                         closedir(dirp);
1094                         cur->fts_info = FTS_ERR;
1095                         SET(FTS_STOP);
1096                         __set_errno (ENAMETOOLONG);
1097                         return (NULL);
1098                 }
1099                 p->fts_level = level;
1100                 p->fts_parent = sp->fts_cur;
1101                 p->fts_pathlen = new_len;
1102
1103 #if defined FTS_WHITEOUT && 0
1104                 if (dp->d_type == DT_WHT)
1105                         p->fts_flags |= FTS_ISW;
1106 #endif
1107
1108                 /* Build a file name for fts_stat to stat. */
1109                 if (ISSET(FTS_NOCHDIR)) {
1110                         p->fts_accpath = p->fts_path;
1111                         memmove(cp, p->fts_name, p->fts_namelen + 1);
1112                 } else
1113                         p->fts_accpath = p->fts_name;
1114
1115                 if (sp->fts_compar == NULL || ISSET(FTS_DEFER_STAT)) {
1116                         /* Record what fts_read will have to do with this
1117                            entry. In many cases, it will simply fts_stat it,
1118                            but we can take advantage of any d_type information
1119                            to optimize away the unnecessary stat calls.  I.e.,
1120                            if FTS_NOSTAT is in effect and we're not following
1121                            symlinks (FTS_PHYSICAL) and d_type indicates this
1122                            is *not* a directory, then we won't have to stat it
1123                            at all.  If it *is* a directory, then (currently)
1124                            we stat it regardless, in order to get device and
1125                            inode numbers.  Some day we might optimize that
1126                            away, too, for directories where d_ino is known to
1127                            be valid.  */
1128                         bool skip_stat = (ISSET(FTS_PHYSICAL)
1129                                           && ISSET(FTS_NOSTAT)
1130                                           && DT_IS_KNOWN(dp)
1131                                           && ! DT_MUST_BE(dp, DT_DIR));
1132                         p->fts_info = FTS_NSOK;
1133                         fts_set_stat_required(p, !skip_stat);
1134                         is_dir = (ISSET(FTS_PHYSICAL) && ISSET(FTS_NOSTAT)
1135                                   && DT_MUST_BE(dp, DT_DIR));
1136                 } else {
1137                         p->fts_info = fts_stat(sp, p, false);
1138                         is_dir = (p->fts_info == FTS_D
1139                                   || p->fts_info == FTS_DC
1140                                   || p->fts_info == FTS_DOT);
1141                 }
1142
1143                 /* Decrement link count if applicable. */
1144                 if (nlinks > 0 && is_dir)
1145                         nlinks -= nostat;
1146
1147                 /* We walk in directory order so "ls -f" doesn't get upset. */
1148                 p->fts_link = NULL;
1149                 if (head == NULL)
1150                         head = tail = p;
1151                 else {
1152                         tail->fts_link = p;
1153                         tail = p;
1154                 }
1155                 ++nitems;
1156         }
1157         if (dirp)
1158                 closedir(dirp);
1159
1160         /*
1161          * If realloc() changed the address of the file name, adjust the
1162          * addresses for the rest of the tree and the dir list.
1163          */
1164         if (doadjust)
1165                 fts_padjust(sp, head);
1166
1167         /*
1168          * If not changing directories, reset the file name back to original
1169          * state.
1170          */
1171         if (ISSET(FTS_NOCHDIR)) {
1172                 if (len == sp->fts_pathlen || nitems == 0)
1173                         --cp;
1174                 *cp = '\0';
1175         }
1176
1177         /*
1178          * If descended after called from fts_children or after called from
1179          * fts_read and nothing found, get back.  At the root level we use
1180          * the saved fd; if one of fts_open()'s arguments is a relative name
1181          * to an empty directory, we wind up here with no other way back.  If
1182          * can't get back, we're done.
1183          */
1184         if (descend && (type == BCHILD || !nitems) &&
1185             (cur->fts_level == FTS_ROOTLEVEL
1186              ? RESTORE_INITIAL_CWD(sp)
1187              : fts_safe_changedir(sp, cur->fts_parent, -1, ".."))) {
1188                 cur->fts_info = FTS_ERR;
1189                 SET(FTS_STOP);
1190                 fts_lfree(head);
1191                 return (NULL);
1192         }
1193
1194         /* If didn't find anything, return NULL. */
1195         if (!nitems) {
1196                 if (type == BREAD)
1197                         cur->fts_info = FTS_DP;
1198                 fts_lfree(head);
1199                 return (NULL);
1200         }
1201
1202         /* Sort the entries. */
1203         if (sp->fts_compar && nitems > 1)
1204                 head = fts_sort(sp, head, nitems);
1205         return (head);
1206 }
1207
1208 #if FTS_DEBUG
1209
1210 /* Walk ->fts_parent links starting at E_CURR, until the root of the
1211    current hierarchy.  There should be a directory with dev/inode
1212    matching those of AD.  If not, print a lot of diagnostics.  */
1213 static void
1214 find_matching_ancestor (FTSENT const *e_curr, struct Active_dir const *ad)
1215 {
1216   FTSENT const *ent;
1217   for (ent = e_curr; ent->fts_level >= FTS_ROOTLEVEL; ent = ent->fts_parent)
1218     {
1219       if (ad->ino == ent->fts_statp->st_ino
1220           && ad->dev == ent->fts_statp->st_dev)
1221         return;
1222     }
1223   printf ("ERROR: tree dir, %s, not active\n", ad->fts_ent->fts_accpath);
1224   printf ("active dirs:\n");
1225   for (ent = e_curr;
1226        ent->fts_level >= FTS_ROOTLEVEL; ent = ent->fts_parent)
1227     printf ("  %s(%"PRIuMAX"/%"PRIuMAX") to %s(%"PRIuMAX"/%"PRIuMAX")...\n",
1228             ad->fts_ent->fts_accpath,
1229             (uintmax_t) ad->dev,
1230             (uintmax_t) ad->ino,
1231             ent->fts_accpath,
1232             (uintmax_t) ent->fts_statp->st_dev,
1233             (uintmax_t) ent->fts_statp->st_ino);
1234 }
1235
1236 void
1237 fts_cross_check (FTS const *sp)
1238 {
1239   FTSENT const *ent = sp->fts_cur;
1240   FTSENT const *t;
1241   if ( ! ISSET (FTS_TIGHT_CYCLE_CHECK))
1242     return;
1243
1244   Dprintf (("fts-cross-check cur=%s\n", ent->fts_path));
1245   /* Make sure every parent dir is in the tree.  */
1246   for (t = ent->fts_parent; t->fts_level >= FTS_ROOTLEVEL; t = t->fts_parent)
1247     {
1248       struct Active_dir ad;
1249       ad.ino = t->fts_statp->st_ino;
1250       ad.dev = t->fts_statp->st_dev;
1251       if ( ! hash_lookup (sp->fts_cycle.ht, &ad))
1252         printf ("ERROR: active dir, %s, not in tree\n", t->fts_path);
1253     }
1254
1255   /* Make sure every dir in the tree is an active dir.
1256      But ENT is not necessarily a directory.  If so, just skip this part. */
1257   if (ent->fts_parent->fts_level >= FTS_ROOTLEVEL
1258       && (ent->fts_info == FTS_DP
1259           || ent->fts_info == FTS_D))
1260     {
1261       struct Active_dir *ad;
1262       for (ad = hash_get_first (sp->fts_cycle.ht); ad != NULL;
1263            ad = hash_get_next (sp->fts_cycle.ht, ad))
1264         {
1265           find_matching_ancestor (ent, ad);
1266         }
1267     }
1268 }
1269
1270 static bool
1271 same_fd (int fd1, int fd2)
1272 {
1273   struct stat sb1, sb2;
1274   return (fstat (fd1, &sb1) == 0
1275           && fstat (fd2, &sb2) == 0
1276           && SAME_INODE (sb1, sb2));
1277 }
1278
1279 static void
1280 fd_ring_print (FTS const *sp, FILE *stream, char const *msg)
1281 {
1282   I_ring const *fd_ring = &sp->fts_fd_ring;
1283   unsigned int i = fd_ring->fts_front;
1284   char *cwd = getcwdat (sp->fts_cwd_fd, NULL, 0);
1285   fprintf (stream, "=== %s ========== %s\n", msg, cwd);
1286   free (cwd);
1287   if (i_ring_empty (fd_ring))
1288     return;
1289
1290   while (true)
1291     {
1292       int fd = fd_ring->fts_fd_ring[i];
1293       if (fd < 0)
1294         fprintf (stream, "%d: %d:\n", i, fd);
1295       else
1296         {
1297           char *wd = getcwdat (fd, NULL, 0);
1298           fprintf (stream, "%d: %d: %s\n", i, fd, wd);
1299           free (wd);
1300         }
1301       if (i == fd_ring->fts_back)
1302         break;
1303       i = (i + I_RING_SIZE - 1) % I_RING_SIZE;
1304     }
1305 }
1306
1307 /* Ensure that each file descriptor on the fd_ring matches a
1308    parent, grandparent, etc. of the current working directory.  */
1309 static void
1310 fd_ring_check (FTS const *sp)
1311 {
1312   if (!fts_debug)
1313     return;
1314
1315   /* Make a writable copy.  */
1316   I_ring fd_w = sp->fts_fd_ring;
1317
1318   int cwd_fd = sp->fts_cwd_fd;
1319   cwd_fd = dup (cwd_fd);
1320   char *dot = getcwdat (cwd_fd, NULL, 0);
1321   error (0, 0, "===== check ===== cwd: %s", dot);
1322   free (dot);
1323   while ( ! i_ring_empty (&fd_w))
1324     {
1325       int fd = i_ring_pop (&fd_w);
1326       if (0 <= fd)
1327         {
1328           int parent_fd = openat (cwd_fd, "..", O_RDONLY);
1329           if (parent_fd < 0)
1330             {
1331               // Warn?
1332               break;
1333             }
1334           if (!same_fd (fd, parent_fd))
1335             {
1336               char *cwd = getcwdat (fd, NULL, 0);
1337               error (0, errno, "ring  : %s", cwd);
1338               char *c2 = getcwdat (parent_fd, NULL, 0);
1339               error (0, errno, "parent: %s", c2);
1340               free (cwd);
1341               free (c2);
1342               abort ();
1343             }
1344           close (cwd_fd);
1345           cwd_fd = parent_fd;
1346         }
1347     }
1348   close (cwd_fd);
1349 }
1350 #endif
1351
1352 static unsigned short int
1353 internal_function
1354 fts_stat(FTS *sp, register FTSENT *p, bool follow)
1355 {
1356         struct stat *sbp = p->fts_statp;
1357         int saved_errno;
1358
1359         if (p->fts_level == FTS_ROOTLEVEL && ISSET(FTS_COMFOLLOW))
1360                 follow = true;
1361
1362 #if defined FTS_WHITEOUT && 0
1363         /* check for whiteout */
1364         if (p->fts_flags & FTS_ISW) {
1365                 memset(sbp, '\0', sizeof (*sbp));
1366                 sbp->st_mode = S_IFWHT;
1367                 return (FTS_W);
1368        }
1369 #endif
1370
1371         /*
1372          * If doing a logical walk, or application requested FTS_FOLLOW, do
1373          * a stat(2).  If that fails, check for a non-existent symlink.  If
1374          * fail, set the errno from the stat call.
1375          */
1376         if (ISSET(FTS_LOGICAL) || follow) {
1377                 if (stat(p->fts_accpath, sbp)) {
1378                         saved_errno = errno;
1379                         if (errno == ENOENT
1380                             && lstat(p->fts_accpath, sbp) == 0) {
1381                                 __set_errno (0);
1382                                 return (FTS_SLNONE);
1383                         }
1384                         p->fts_errno = saved_errno;
1385                         goto err;
1386                 }
1387         } else if (fstatat(sp->fts_cwd_fd, p->fts_accpath, sbp,
1388                            AT_SYMLINK_NOFOLLOW)) {
1389                 p->fts_errno = errno;
1390 err:            memset(sbp, 0, sizeof(struct stat));
1391                 return (FTS_NS);
1392         }
1393
1394         if (S_ISDIR(sbp->st_mode)) {
1395                 if (ISDOT(p->fts_name)) {
1396                         /* Command-line "." and ".." are real directories. */
1397                         return (p->fts_level == FTS_ROOTLEVEL ? FTS_D : FTS_DOT);
1398                 }
1399
1400 #if _LGPL_PACKAGE
1401                 {
1402                   /*
1403                    * Cycle detection is done by brute force when the directory
1404                    * is first encountered.  If the tree gets deep enough or the
1405                    * number of symbolic links to directories is high enough,
1406                    * something faster might be worthwhile.
1407                    */
1408                   FTSENT *t;
1409
1410                   for (t = p->fts_parent;
1411                        t->fts_level >= FTS_ROOTLEVEL; t = t->fts_parent)
1412                     if (sbp->st_ino == t->fts_statp->st_ino
1413                         && sbp->st_dev == t->fts_statp->st_dev)
1414                       {
1415                         p->fts_cycle = t;
1416                         return (FTS_DC);
1417                       }
1418                 }
1419 #endif
1420
1421                 return (FTS_D);
1422         }
1423         if (S_ISLNK(sbp->st_mode))
1424                 return (FTS_SL);
1425         if (S_ISREG(sbp->st_mode))
1426                 return (FTS_F);
1427         return (FTS_DEFAULT);
1428 }
1429
1430 static int
1431 fts_compar (void const *a, void const *b)
1432 {
1433   /* Convert A and B to the correct types, to pacify the compiler, and
1434      for portability to bizarre hosts where "void const *" and "FTSENT
1435      const **" differ in runtime representation.  The comparison
1436      function cannot modify *a and *b, but there is no compile-time
1437      check for this.  */
1438   FTSENT const **pa = (FTSENT const **) a;
1439   FTSENT const **pb = (FTSENT const **) b;
1440   return pa[0]->fts_fts->fts_compar (pa, pb);
1441 }
1442
1443 static FTSENT *
1444 internal_function
1445 fts_sort (FTS *sp, FTSENT *head, register size_t nitems)
1446 {
1447         register FTSENT **ap, *p;
1448
1449         /* On most modern hosts, void * and FTSENT ** have the same
1450            run-time representation, and one can convert sp->fts_compar to
1451            the type qsort expects without problem.  Use the heuristic that
1452            this is OK if the two pointer types are the same size, and if
1453            converting FTSENT ** to long int is the same as converting
1454            FTSENT ** to void * and then to long int.  This heuristic isn't
1455            valid in general but we don't know of any counterexamples.  */
1456         FTSENT *dummy;
1457         int (*compare) (void const *, void const *) =
1458           ((sizeof &dummy == sizeof (void *)
1459             && (long int) &dummy == (long int) (void *) &dummy)
1460            ? (int (*) (void const *, void const *)) sp->fts_compar
1461            : fts_compar);
1462
1463         /*
1464          * Construct an array of pointers to the structures and call qsort(3).
1465          * Reassemble the array in the order returned by qsort.  If unable to
1466          * sort for memory reasons, return the directory entries in their
1467          * current order.  Allocate enough space for the current needs plus
1468          * 40 so don't realloc one entry at a time.
1469          */
1470         if (nitems > sp->fts_nitems) {
1471                 struct _ftsent **a;
1472
1473                 sp->fts_nitems = nitems + 40;
1474                 if (SIZE_MAX / sizeof *a < sp->fts_nitems
1475                     || ! (a = realloc (sp->fts_array,
1476                                        sp->fts_nitems * sizeof *a))) {
1477                         free(sp->fts_array);
1478                         sp->fts_array = NULL;
1479                         sp->fts_nitems = 0;
1480                         return (head);
1481                 }
1482                 sp->fts_array = a;
1483         }
1484         for (ap = sp->fts_array, p = head; p; p = p->fts_link)
1485                 *ap++ = p;
1486         qsort((void *)sp->fts_array, nitems, sizeof(FTSENT *), compare);
1487         for (head = *(ap = sp->fts_array); --nitems; ++ap)
1488                 ap[0]->fts_link = ap[1];
1489         ap[0]->fts_link = NULL;
1490         return (head);
1491 }
1492
1493 static FTSENT *
1494 internal_function
1495 fts_alloc (FTS *sp, const char *name, register size_t namelen)
1496 {
1497         register FTSENT *p;
1498         size_t len;
1499
1500         /*
1501          * The file name is a variable length array.  Allocate the FTSENT
1502          * structure and the file name in one chunk.
1503          */
1504         len = sizeof(FTSENT) + namelen;
1505         if ((p = malloc(len)) == NULL)
1506                 return (NULL);
1507
1508         /* Copy the name and guarantee NUL termination. */
1509         memmove(p->fts_name, name, namelen);
1510         p->fts_name[namelen] = '\0';
1511
1512         p->fts_namelen = namelen;
1513         p->fts_fts = sp;
1514         p->fts_path = sp->fts_path;
1515         p->fts_errno = 0;
1516         p->fts_flags = 0;
1517         p->fts_instr = FTS_NOINSTR;
1518         p->fts_number = 0;
1519         p->fts_pointer = NULL;
1520         return (p);
1521 }
1522
1523 static void
1524 internal_function
1525 fts_lfree (register FTSENT *head)
1526 {
1527         register FTSENT *p;
1528
1529         /* Free a linked list of structures. */
1530         while ((p = head)) {
1531                 head = head->fts_link;
1532                 free(p);
1533         }
1534 }
1535
1536 /*
1537  * Allow essentially unlimited file name lengths; find, rm, ls should
1538  * all work on any tree.  Most systems will allow creation of file
1539  * names much longer than MAXPATHLEN, even though the kernel won't
1540  * resolve them.  Add the size (not just what's needed) plus 256 bytes
1541  * so don't realloc the file name 2 bytes at a time.
1542  */
1543 static bool
1544 internal_function
1545 fts_palloc (FTS *sp, size_t more)
1546 {
1547         char *p;
1548         size_t new_len = sp->fts_pathlen + more + 256;
1549
1550         /*
1551          * See if fts_pathlen would overflow.
1552          */
1553         if (new_len < sp->fts_pathlen) {
1554                 free(sp->fts_path);
1555                 sp->fts_path = NULL;
1556                 __set_errno (ENAMETOOLONG);
1557                 return false;
1558         }
1559         sp->fts_pathlen = new_len;
1560         p = realloc(sp->fts_path, sp->fts_pathlen);
1561         if (p == NULL) {
1562                 free(sp->fts_path);
1563                 sp->fts_path = NULL;
1564                 return false;
1565         }
1566         sp->fts_path = p;
1567         return true;
1568 }
1569
1570 /*
1571  * When the file name is realloc'd, have to fix all of the pointers in
1572  *  structures already returned.
1573  */
1574 static void
1575 internal_function
1576 fts_padjust (FTS *sp, FTSENT *head)
1577 {
1578         FTSENT *p;
1579         char *addr = sp->fts_path;
1580
1581 #define ADJUST(p) do {                                                  \
1582         if ((p)->fts_accpath != (p)->fts_name) {                        \
1583                 (p)->fts_accpath =                                      \
1584                     (char *)addr + ((p)->fts_accpath - (p)->fts_path);  \
1585         }                                                               \
1586         (p)->fts_path = addr;                                           \
1587 } while (0)
1588         /* Adjust the current set of children. */
1589         for (p = sp->fts_child; p; p = p->fts_link)
1590                 ADJUST(p);
1591
1592         /* Adjust the rest of the tree, including the current level. */
1593         for (p = head; p->fts_level >= FTS_ROOTLEVEL;) {
1594                 ADJUST(p);
1595                 p = p->fts_link ? p->fts_link : p->fts_parent;
1596         }
1597 }
1598
1599 static size_t
1600 internal_function
1601 fts_maxarglen (char * const *argv)
1602 {
1603         size_t len, max;
1604
1605         for (max = 0; *argv; ++argv)
1606                 if ((len = strlen(*argv)) > max)
1607                         max = len;
1608         return (max + 1);
1609 }
1610
1611 /*
1612  * Change to dir specified by fd or file name without getting
1613  * tricked by someone changing the world out from underneath us.
1614  * Assumes p->fts_statp->st_dev and p->fts_statp->st_ino are filled in.
1615  * If FD is non-negative, expect it to be used after this function returns,
1616  * and to be closed eventually.  So don't pass e.g., `dirfd(dirp)' and then
1617  * do closedir(dirp), because that would invalidate the saved FD.
1618  * Upon failure, close FD immediately and return nonzero.
1619  */
1620 static int
1621 internal_function
1622 fts_safe_changedir (FTS *sp, FTSENT *p, int fd, char const *dir)
1623 {
1624         int ret;
1625         bool is_dotdot = dir && STREQ (dir, "..");
1626         int newfd;
1627
1628         /* This clause handles the unusual case in which FTS_NOCHDIR
1629            is specified, along with FTS_CWDFD.  In that case, there is
1630            no need to change even the virtual cwd file descriptor.
1631            However, if FD is non-negative, we do close it here.  */
1632         if (ISSET (FTS_NOCHDIR))
1633           {
1634             if (ISSET (FTS_CWDFD) && 0 <= fd)
1635               close (fd);
1636             return 0;
1637           }
1638
1639         if (fd < 0 && is_dotdot && ISSET (FTS_CWDFD))
1640           {
1641             /* When possible, skip the diropen and subsequent fstat+dev/ino
1642                comparison.  I.e., when changing to parent directory
1643                (chdir ("..")), use a file descriptor from the ring and
1644                save the overhead of diropen+fstat, as well as avoiding
1645                failure when we lack "x" access to the virtual cwd.  */
1646             if ( ! i_ring_empty (&sp->fts_fd_ring))
1647               {
1648                 int parent_fd;
1649                 fd_ring_print (sp, stderr, "pre-pop");
1650                 parent_fd = i_ring_pop (&sp->fts_fd_ring);
1651                 is_dotdot = true;
1652                 if (0 <= parent_fd)
1653                   {
1654                     fd = parent_fd;
1655                     dir = NULL;
1656                   }
1657               }
1658           }
1659
1660         newfd = fd;
1661         if (fd < 0 && (newfd = diropen (sp, dir)) < 0)
1662           return -1;
1663
1664         /* The following dev/inode check is necessary if we're doing a
1665            `logical' traversal (through symlinks, a la chown -L), if the
1666            system lacks O_NOFOLLOW support, or if we're changing to ".."
1667            (but not via a popped file descriptor).  When changing to the
1668            name "..", O_NOFOLLOW can't help.  In general, when the target is
1669            not "..", diropen's use of O_NOFOLLOW ensures we don't mistakenly
1670            follow a symlink, so we can avoid the expense of this fstat.  */
1671         if (ISSET(FTS_LOGICAL) || ! HAVE_WORKING_O_NOFOLLOW
1672             || (dir && STREQ (dir, "..")))
1673           {
1674             struct stat sb;
1675             if (fstat(newfd, &sb))
1676               {
1677                 ret = -1;
1678                 goto bail;
1679               }
1680             if (p->fts_statp->st_dev != sb.st_dev
1681                 || p->fts_statp->st_ino != sb.st_ino)
1682               {
1683                 __set_errno (ENOENT);           /* disinformation */
1684                 ret = -1;
1685                 goto bail;
1686               }
1687           }
1688
1689         if (ISSET(FTS_CWDFD))
1690           {
1691             cwd_advance_fd (sp, newfd, ! is_dotdot);
1692             return 0;
1693           }
1694
1695         ret = fchdir(newfd);
1696 bail:
1697         if (fd < 0)
1698           {
1699             int oerrno = errno;
1700             (void)close(newfd);
1701             __set_errno (oerrno);
1702           }
1703         return ret;
1704 }