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