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