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