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