Sync from coreutils.
[pspp] / lib / fts.c
1 /* Traverse a file hierarchy.
2
3    Copyright (C) 2004, 2005, 2006 Free Software Foundation, Inc.
4
5    This program is free software; you can redistribute it and/or modify
6    it under the terms of the GNU General Public License as published by
7    the Free Software Foundation; either version 2, or (at your option)
8    any later version.
9
10    This program is distributed in the hope that it will be useful,
11    but WITHOUT ANY WARRANTY; without even the implied warranty of
12    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13    GNU General Public License for more details.
14
15    You should have received a copy of the GNU General Public License
16    along with this program; if not, write to the Free Software Foundation,
17    Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.  */
18
19 /*-
20  * Copyright (c) 1990, 1993, 1994
21  *      The Regents of the University of California.  All rights reserved.
22  *
23  * Redistribution and use in source and binary forms, with or without
24  * modification, are permitted provided that the following conditions
25  * are met:
26  * 1. Redistributions of source code must retain the above copyright
27  *    notice, this list of conditions and the following disclaimer.
28  * 2. Redistributions in binary form must reproduce the above copyright
29  *    notice, this list of conditions and the following disclaimer in the
30  *    documentation and/or other materials provided with the distribution.
31  * 4. Neither the name of the University nor the names of its contributors
32  *    may be used to endorse or promote products derived from this software
33  *    without specific prior written permission.
34  *
35  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
36  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
37  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
38  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
39  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
40  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
41  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
42  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
43  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
44  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
45  * SUCH DAMAGE.
46  */
47
48 #ifdef HAVE_CONFIG_H
49 # include <config.h>
50 #endif
51
52 #if defined(LIBC_SCCS) && !defined(lint)
53 static char sccsid[] = "@(#)fts.c       8.6 (Berkeley) 8/14/94";
54 #endif /* LIBC_SCCS and not lint */
55
56 #include "fts_.h"
57
58 #if HAVE_SYS_PARAM_H || defined _LIBC
59 # include <sys/param.h>
60 #endif
61 #ifdef _LIBC
62 # include <include/sys/stat.h>
63 #else
64 # include <sys/stat.h>
65 #endif
66 #include <fcntl.h>
67 #include <errno.h>
68 #include "dirfd.h"
69 #include <stdbool.h>
70 #include <stdlib.h>
71 #include <string.h>
72 #include <unistd.h>
73
74 #if ! _LIBC
75 # include "lstat.h"
76 #endif
77
78 #if defined _LIBC
79 # include <dirent.h>
80 # define NAMLEN(dirent) _D_EXACT_NAMLEN (dirent)
81 #else
82 # if HAVE_DIRENT_H
83 #  include <dirent.h>
84 #  define NAMLEN(dirent) strlen ((dirent)->d_name)
85 # else
86 #  define dirent direct
87 #  define NAMLEN(dirent) (dirent)->d_namlen
88 #  if HAVE_SYS_NDIR_H
89 #   include <sys/ndir.h>
90 #  endif
91 #  if HAVE_SYS_DIR_H
92 #   include <sys/dir.h>
93 #  endif
94 #  if HAVE_NDIR_H
95 #   include <ndir.h>
96 #  endif
97 # endif
98 #endif
99
100 #ifdef _LIBC
101 # undef close
102 # define close __close
103 # undef closedir
104 # define closedir __closedir
105 # undef fchdir
106 # define fchdir __fchdir
107 # undef open
108 # define open __open
109 # undef opendir
110 # define opendir __opendir
111 # undef readdir
112 # define readdir __readdir
113 #else
114 # undef internal_function
115 # define internal_function /* empty */
116 #endif
117
118 #ifndef __set_errno
119 # define __set_errno(Val) errno = (Val)
120 #endif
121
122 #ifndef __attribute__
123 # if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 8) || __STRICT_ANSI__
124 #  define __attribute__(x) /* empty */
125 # endif
126 #endif
127
128 #ifndef ATTRIBUTE_UNUSED
129 # define ATTRIBUTE_UNUSED __attribute__ ((__unused__))
130 #endif
131
132
133 static FTSENT   *fts_alloc (FTS *, const char *, size_t) internal_function;
134 static FTSENT   *fts_build (FTS *, int) internal_function;
135 static void      fts_lfree (FTSENT *) internal_function;
136 static void      fts_load (FTS *, FTSENT *) internal_function;
137 static size_t    fts_maxarglen (char * const *) internal_function;
138 static void      fts_padjust (FTS *, FTSENT *) internal_function;
139 static bool      fts_palloc (FTS *, size_t) internal_function;
140 static FTSENT   *fts_sort (FTS *, FTSENT *, size_t) internal_function;
141 static unsigned short int fts_stat (FTS *, FTSENT *, bool) internal_function;
142 static int      fts_safe_changedir (FTS *, FTSENT *, int, const char *)
143      internal_function;
144
145 #if _LGPL_PACKAGE
146 static bool enter_dir (FTS *fts, FTSENT *ent) { return true; }
147 static void leave_dir (FTS *fts, FTSENT *ent) {}
148 static bool setup_dir (FTS *fts) { return true; }
149 static void free_dir (FTS *fts) {}
150 #else
151 # include "fcntl--.h"
152 # include "fts-cycle.c"
153 #endif
154
155 #ifndef MAX
156 # define MAX(a,b) ((a) > (b) ? (a) : (b))
157 #endif
158
159 #ifndef SIZE_MAX
160 # define SIZE_MAX ((size_t) -1)
161 #endif
162
163 #ifndef O_DIRECTORY
164 # define O_DIRECTORY 0
165 #endif
166
167 #define ISDOT(a)        (a[0] == '.' && (!a[1] || (a[1] == '.' && !a[2])))
168
169 #define CLR(opt)        (sp->fts_options &= ~(opt))
170 #define ISSET(opt)      (sp->fts_options & (opt))
171 #define SET(opt)        (sp->fts_options |= (opt))
172
173 #define FCHDIR(sp, fd)  (!ISSET(FTS_NOCHDIR) && fchdir(fd))
174
175 /* fts_build flags */
176 #define BCHILD          1               /* fts_children */
177 #define BNAMES          2               /* fts_children, names only */
178 #define BREAD           3               /* fts_read */
179
180 #if FTS_DEBUG
181 # include <inttypes.h>
182 # include <stdint.h>
183 # include <stdio.h>
184 bool fts_debug = false;
185 # define Dprintf(x) do { if (fts_debug) printf x; } while (0)
186 #else
187 # define Dprintf(x)
188 #endif
189
190 #define LEAVE_DIR(Fts, Ent, Tag)                                \
191   do                                                            \
192     {                                                           \
193       Dprintf (("  %s-leaving: %s\n", Tag, (Ent)->fts_path));   \
194       leave_dir (Fts, Ent);                                     \
195     }                                                           \
196   while (false)
197
198 /* Open the directory DIR if possible, and return a file
199    descriptor.  Return -1 and set errno on failure.  It doesn't matter
200    whether the file descriptor has read or write access.  */
201
202 static int
203 internal_function
204 diropen (char const *dir)
205 {
206   return open (dir, O_RDONLY | O_DIRECTORY | O_NOCTTY | O_NONBLOCK);
207 }
208
209 FTS *
210 fts_open (char * const *argv,
211           register int options,
212           int (*compar) (FTSENT const **, FTSENT const **))
213 {
214         register FTS *sp;
215         register FTSENT *p, *root;
216         register size_t nitems;
217         FTSENT *parent, *tmp = NULL;    /* pacify gcc */
218         size_t len;
219
220         /* Options check. */
221         if (options & ~FTS_OPTIONMASK) {
222                 __set_errno (EINVAL);
223                 return (NULL);
224         }
225
226         /* Allocate/initialize the stream */
227         if ((sp = malloc(sizeof(FTS))) == NULL)
228                 return (NULL);
229         memset(sp, 0, sizeof(FTS));
230         sp->fts_compar = compar;
231         sp->fts_options = options;
232
233         /* Logical walks turn on NOCHDIR; symbolic links are too hard. */
234         if (ISSET(FTS_LOGICAL))
235                 SET(FTS_NOCHDIR);
236
237         /*
238          * Start out with 1K of file name space, and enough, in any case,
239          * to hold the user's file names.
240          */
241 #ifndef MAXPATHLEN
242 # define MAXPATHLEN 1024
243 #endif
244         size_t maxarglen = fts_maxarglen(argv);
245         if (! fts_palloc(sp, MAX(maxarglen, MAXPATHLEN)))
246                 goto mem1;
247
248         /* Allocate/initialize root's parent. */
249         if ((parent = fts_alloc(sp, "", 0)) == NULL)
250                 goto mem2;
251         parent->fts_level = FTS_ROOTPARENTLEVEL;
252
253         /* Allocate/initialize root(s). */
254         for (root = NULL, nitems = 0; *argv != NULL; ++argv, ++nitems) {
255                 /* Don't allow zero-length file names. */
256                 if ((len = strlen(*argv)) == 0) {
257                         __set_errno (ENOENT);
258                         goto mem3;
259                 }
260
261                 if ((p = fts_alloc(sp, *argv, len)) == NULL)
262                         goto mem3;
263                 p->fts_level = FTS_ROOTLEVEL;
264                 p->fts_parent = parent;
265                 p->fts_accpath = p->fts_name;
266                 p->fts_info = fts_stat(sp, p, ISSET(FTS_COMFOLLOW) != 0);
267
268                 /* Command-line "." and ".." are real directories. */
269                 if (p->fts_info == FTS_DOT)
270                         p->fts_info = FTS_D;
271
272                 /*
273                  * If comparison routine supplied, traverse in sorted
274                  * order; otherwise traverse in the order specified.
275                  */
276                 if (compar) {
277                         p->fts_link = root;
278                         root = p;
279                 } else {
280                         p->fts_link = NULL;
281                         if (root == NULL)
282                                 tmp = root = p;
283                         else {
284                                 tmp->fts_link = p;
285                                 tmp = p;
286                         }
287                 }
288         }
289         if (compar && nitems > 1)
290                 root = fts_sort(sp, root, nitems);
291
292         /*
293          * Allocate a dummy pointer and make fts_read think that we've just
294          * finished the node before the root(s); set p->fts_info to FTS_INIT
295          * so that everything about the "current" node is ignored.
296          */
297         if ((sp->fts_cur = fts_alloc(sp, "", 0)) == NULL)
298                 goto mem3;
299         sp->fts_cur->fts_link = root;
300         sp->fts_cur->fts_info = FTS_INIT;
301         if (! setup_dir (sp))
302           goto mem3;
303
304         /*
305          * If using chdir(2), grab a file descriptor pointing to dot to ensure
306          * that we can get back here; this could be avoided for some file names,
307          * but almost certainly not worth the effort.  Slashes, symbolic links,
308          * and ".." are all fairly nasty problems.  Note, if we can't get the
309          * descriptor we run anyway, just more slowly.
310          */
311         if (!ISSET(FTS_NOCHDIR)
312             && (sp->fts_rfd = diropen (".")) < 0)
313                 SET(FTS_NOCHDIR);
314
315         return (sp);
316
317 mem3:   fts_lfree(root);
318         free(parent);
319 mem2:   free(sp->fts_path);
320 mem1:   free(sp);
321         return (NULL);
322 }
323
324 static void
325 internal_function
326 fts_load (FTS *sp, register FTSENT *p)
327 {
328         register size_t len;
329         register char *cp;
330
331         /*
332          * Load the stream structure for the next traversal.  Since we don't
333          * actually enter the directory until after the preorder visit, set
334          * the fts_accpath field specially so the chdir gets done to the right
335          * place and the user can access the first node.  From fts_open it's
336          * known that the file name will fit.
337          */
338         len = p->fts_pathlen = p->fts_namelen;
339         memmove(sp->fts_path, p->fts_name, len + 1);
340         if ((cp = strrchr(p->fts_name, '/')) && (cp != p->fts_name || cp[1])) {
341                 len = strlen(++cp);
342                 memmove(p->fts_name, cp, len + 1);
343                 p->fts_namelen = len;
344         }
345         p->fts_accpath = p->fts_path = sp->fts_path;
346         sp->fts_dev = p->fts_statp->st_dev;
347 }
348
349 int
350 fts_close (FTS *sp)
351 {
352         register FTSENT *freep, *p;
353         int saved_errno = 0;
354
355         /*
356          * This still works if we haven't read anything -- the dummy structure
357          * points to the root list, so we step through to the end of the root
358          * list which has a valid parent pointer.
359          */
360         if (sp->fts_cur) {
361                 for (p = sp->fts_cur; p->fts_level >= FTS_ROOTLEVEL;) {
362                         freep = p;
363                         p = p->fts_link != NULL ? p->fts_link : p->fts_parent;
364                         free(freep);
365                 }
366                 free(p);
367         }
368
369         /* Free up child linked list, sort array, file name buffer. */
370         if (sp->fts_child)
371                 fts_lfree(sp->fts_child);
372         if (sp->fts_array)
373                 free(sp->fts_array);
374         free(sp->fts_path);
375
376         /* Return to original directory, save errno if necessary. */
377         if (!ISSET(FTS_NOCHDIR)) {
378                 if (fchdir(sp->fts_rfd))
379                         saved_errno = errno;
380                 (void)close(sp->fts_rfd);
381         }
382
383         free_dir (sp);
384
385         /* Free up the stream pointer. */
386         free(sp);
387
388         /* Set errno and return. */
389         if (saved_errno) {
390                 __set_errno (saved_errno);
391                 return (-1);
392         }
393
394         return (0);
395 }
396
397 /*
398  * Special case of "/" at the end of the file name so that slashes aren't
399  * appended which would cause file names to be written as "....//foo".
400  */
401 #define NAPPEND(p)                                                      \
402         (p->fts_path[p->fts_pathlen - 1] == '/'                         \
403             ? p->fts_pathlen - 1 : p->fts_pathlen)
404
405 FTSENT *
406 fts_read (register FTS *sp)
407 {
408         register FTSENT *p, *tmp;
409         register unsigned short int instr;
410         register char *t;
411         int saved_errno;
412
413         /* If finished or unrecoverable error, return NULL. */
414         if (sp->fts_cur == NULL || ISSET(FTS_STOP))
415                 return (NULL);
416
417         /* Set current node pointer. */
418         p = sp->fts_cur;
419
420         /* Save and zero out user instructions. */
421         instr = p->fts_instr;
422         p->fts_instr = FTS_NOINSTR;
423
424         /* Any type of file may be re-visited; re-stat and re-turn. */
425         if (instr == FTS_AGAIN) {
426                 p->fts_info = fts_stat(sp, p, false);
427                 return (p);
428         }
429         Dprintf (("fts_read: p=%s\n",
430                   p->fts_info == FTS_INIT ? "" : p->fts_path));
431
432         /*
433          * Following a symlink -- SLNONE test allows application to see
434          * SLNONE and recover.  If indirecting through a symlink, have
435          * keep a pointer to current location.  If unable to get that
436          * pointer, follow fails.
437          */
438         if (instr == FTS_FOLLOW &&
439             (p->fts_info == FTS_SL || p->fts_info == FTS_SLNONE)) {
440                 p->fts_info = fts_stat(sp, p, true);
441                 if (p->fts_info == FTS_D && !ISSET(FTS_NOCHDIR)) {
442                         if ((p->fts_symfd = diropen (".")) < 0) {
443                                 p->fts_errno = errno;
444                                 p->fts_info = FTS_ERR;
445                         } else
446                                 p->fts_flags |= FTS_SYMFOLLOW;
447                 }
448                 goto check_for_dir;
449         }
450
451         /* Directory in pre-order. */
452         if (p->fts_info == FTS_D) {
453                 /* If skipped or crossed mount point, do post-order visit. */
454                 if (instr == FTS_SKIP ||
455                     (ISSET(FTS_XDEV) && p->fts_statp->st_dev != sp->fts_dev)) {
456                         if (p->fts_flags & FTS_SYMFOLLOW)
457                                 (void)close(p->fts_symfd);
458                         if (sp->fts_child) {
459                                 fts_lfree(sp->fts_child);
460                                 sp->fts_child = NULL;
461                         }
462                         p->fts_info = FTS_DP;
463                         LEAVE_DIR (sp, p, "1");
464                         return (p);
465                 }
466
467                 /* Rebuild if only read the names and now traversing. */
468                 if (sp->fts_child != NULL && ISSET(FTS_NAMEONLY)) {
469                         CLR(FTS_NAMEONLY);
470                         fts_lfree(sp->fts_child);
471                         sp->fts_child = NULL;
472                 }
473
474                 /*
475                  * Cd to the subdirectory.
476                  *
477                  * If have already read and now fail to chdir, whack the list
478                  * to make the names come out right, and set the parent errno
479                  * so the application will eventually get an error condition.
480                  * Set the FTS_DONTCHDIR flag so that when we logically change
481                  * directories back to the parent we don't do a chdir.
482                  *
483                  * If haven't read do so.  If the read fails, fts_build sets
484                  * FTS_STOP or the fts_info field of the node.
485                  */
486                 if (sp->fts_child != NULL) {
487                         if (fts_safe_changedir(sp, p, -1, p->fts_accpath)) {
488                                 p->fts_errno = errno;
489                                 p->fts_flags |= FTS_DONTCHDIR;
490                                 for (p = sp->fts_child; p != NULL;
491                                      p = p->fts_link)
492                                         p->fts_accpath =
493                                             p->fts_parent->fts_accpath;
494                         }
495                 } else if ((sp->fts_child = fts_build(sp, BREAD)) == NULL) {
496                         if (ISSET(FTS_STOP))
497                                 return (NULL);
498                         /* If fts_build's call to fts_safe_changedir failed
499                            because it was not able to fchdir into a
500                            subdirectory, tell the caller.  */
501                         if (p->fts_errno)
502                                 p->fts_info = FTS_ERR;
503                         /* FIXME: see if this should be in an else block */
504                         LEAVE_DIR (sp, p, "2");
505                         return (p);
506                 }
507                 p = sp->fts_child;
508                 sp->fts_child = NULL;
509                 goto name;
510         }
511
512         /* Move to the next node on this level. */
513 next:   tmp = p;
514         if ((p = p->fts_link) != NULL) {
515                 free(tmp);
516
517                 /*
518                  * If reached the top, return to the original directory (or
519                  * the root of the tree), and load the file names for the next
520                  * root.
521                  */
522                 if (p->fts_level == FTS_ROOTLEVEL) {
523                         if (FCHDIR(sp, sp->fts_rfd)) {
524                                 SET(FTS_STOP);
525                                 sp->fts_cur = p;
526                                 return (NULL);
527                         }
528                         fts_load(sp, p);
529                         goto check_for_dir;
530                 }
531
532                 /*
533                  * User may have called fts_set on the node.  If skipped,
534                  * ignore.  If followed, get a file descriptor so we can
535                  * get back if necessary.
536                  */
537                 if (p->fts_instr == FTS_SKIP)
538                         goto next;
539                 if (p->fts_instr == FTS_FOLLOW) {
540                         p->fts_info = fts_stat(sp, p, true);
541                         if (p->fts_info == FTS_D && !ISSET(FTS_NOCHDIR)) {
542                                 if ((p->fts_symfd = diropen (".")) < 0) {
543                                         p->fts_errno = errno;
544                                         p->fts_info = FTS_ERR;
545                                 } else
546                                         p->fts_flags |= FTS_SYMFOLLOW;
547                         }
548                         p->fts_instr = FTS_NOINSTR;
549                 }
550
551 name:           t = sp->fts_path + NAPPEND(p->fts_parent);
552                 *t++ = '/';
553                 memmove(t, p->fts_name, p->fts_namelen + 1);
554 check_for_dir:
555                 sp->fts_cur = p;
556                 if (p->fts_info == FTS_D)
557                   {
558                     Dprintf (("  %s-entering: %s\n", sp, p->fts_path));
559                     if (! enter_dir (sp, p))
560                       {
561                         __set_errno (ENOMEM);
562                         return NULL;
563                       }
564                   }
565                 return p;
566         }
567
568         /* Move up to the parent node. */
569         p = tmp->fts_parent;
570         free(tmp);
571
572         if (p->fts_level == FTS_ROOTPARENTLEVEL) {
573                 /*
574                  * Done; free everything up and set errno to 0 so the user
575                  * can distinguish between error and EOF.
576                  */
577                 free(p);
578                 __set_errno (0);
579                 return (sp->fts_cur = NULL);
580         }
581
582         /* NUL terminate the file name.  */
583         sp->fts_path[p->fts_pathlen] = '\0';
584
585         /*
586          * Return to the parent directory.  If at a root node or came through
587          * a symlink, go back through the file descriptor.  Otherwise, cd up
588          * one directory.
589          */
590         if (p->fts_level == FTS_ROOTLEVEL) {
591                 if (FCHDIR(sp, sp->fts_rfd)) {
592                         p->fts_errno = errno;
593                         SET(FTS_STOP);
594                 }
595         } else if (p->fts_flags & FTS_SYMFOLLOW) {
596                 if (FCHDIR(sp, p->fts_symfd)) {
597                         saved_errno = errno;
598                         (void)close(p->fts_symfd);
599                         __set_errno (saved_errno);
600                         p->fts_errno = errno;
601                         SET(FTS_STOP);
602                 }
603                 (void)close(p->fts_symfd);
604         } else if (!(p->fts_flags & FTS_DONTCHDIR) &&
605                    fts_safe_changedir(sp, p->fts_parent, -1, "..")) {
606                 p->fts_errno = errno;
607                 SET(FTS_STOP);
608         }
609         p->fts_info = p->fts_errno ? FTS_ERR : FTS_DP;
610         if (p->fts_errno == 0)
611                 LEAVE_DIR (sp, p, "3");
612         sp->fts_cur = p;
613         return ISSET(FTS_STOP) ? NULL : p;
614 }
615
616 /*
617  * Fts_set takes the stream as an argument although it's not used in this
618  * implementation; it would be necessary if anyone wanted to add global
619  * semantics to fts using fts_set.  An error return is allowed for similar
620  * reasons.
621  */
622 /* ARGSUSED */
623 int
624 fts_set(FTS *sp ATTRIBUTE_UNUSED, FTSENT *p, int instr)
625 {
626         if (instr != 0 && instr != FTS_AGAIN && instr != FTS_FOLLOW &&
627             instr != FTS_NOINSTR && instr != FTS_SKIP) {
628                 __set_errno (EINVAL);
629                 return (1);
630         }
631         p->fts_instr = instr;
632         return (0);
633 }
634
635 FTSENT *
636 fts_children (register FTS *sp, int instr)
637 {
638         register FTSENT *p;
639         int fd;
640
641         if (instr != 0 && instr != FTS_NAMEONLY) {
642                 __set_errno (EINVAL);
643                 return (NULL);
644         }
645
646         /* Set current node pointer. */
647         p = sp->fts_cur;
648
649         /*
650          * Errno set to 0 so user can distinguish empty directory from
651          * an error.
652          */
653         __set_errno (0);
654
655         /* Fatal errors stop here. */
656         if (ISSET(FTS_STOP))
657                 return (NULL);
658
659         /* Return logical hierarchy of user's arguments. */
660         if (p->fts_info == FTS_INIT)
661                 return (p->fts_link);
662
663         /*
664          * If not a directory being visited in pre-order, stop here.  Could
665          * allow FTS_DNR, assuming the user has fixed the problem, but the
666          * same effect is available with FTS_AGAIN.
667          */
668         if (p->fts_info != FTS_D /* && p->fts_info != FTS_DNR */)
669                 return (NULL);
670
671         /* Free up any previous child list. */
672         if (sp->fts_child != NULL)
673                 fts_lfree(sp->fts_child);
674
675         if (instr == FTS_NAMEONLY) {
676                 SET(FTS_NAMEONLY);
677                 instr = BNAMES;
678         } else
679                 instr = BCHILD;
680
681         /*
682          * If using chdir on a relative file name and called BEFORE fts_read
683          * does its chdir to the root of a traversal, we can lose -- we need to
684          * chdir into the subdirectory, and we don't know where the current
685          * directory is, so we can't get back so that the upcoming chdir by
686          * fts_read will work.
687          */
688         if (p->fts_level != FTS_ROOTLEVEL || p->fts_accpath[0] == '/' ||
689             ISSET(FTS_NOCHDIR))
690                 return (sp->fts_child = fts_build(sp, instr));
691
692         if ((fd = diropen (".")) < 0)
693                 return (sp->fts_child = NULL);
694         sp->fts_child = fts_build(sp, instr);
695         if (fchdir(fd)) {
696                 (void)close(fd);
697                 return (NULL);
698         }
699         (void)close(fd);
700         return (sp->fts_child);
701 }
702
703 /*
704  * This is the tricky part -- do not casually change *anything* in here.  The
705  * idea is to build the linked list of entries that are used by fts_children
706  * and fts_read.  There are lots of special cases.
707  *
708  * The real slowdown in walking the tree is the stat calls.  If FTS_NOSTAT is
709  * set and it's a physical walk (so that symbolic links can't be directories),
710  * we can do things quickly.  First, if it's a 4.4BSD file system, the type
711  * of the file is in the directory entry.  Otherwise, we assume that the number
712  * of subdirectories in a node is equal to the number of links to the parent.
713  * The former skips all stat calls.  The latter skips stat calls in any leaf
714  * directories and for any files after the subdirectories in the directory have
715  * been found, cutting the stat calls by about 2/3.
716  */
717 static FTSENT *
718 internal_function
719 fts_build (register FTS *sp, int type)
720 {
721         register struct dirent *dp;
722         register FTSENT *p, *head;
723         register size_t nitems;
724         FTSENT *cur, *tail;
725         DIR *dirp;
726         void *oldaddr;
727         int cderrno;
728         int saved_errno;
729         bool descend;
730         bool doadjust;
731         ptrdiff_t level;
732         nlink_t nlinks;
733         bool nostat;
734         size_t len, maxlen, new_len;
735         char *cp;
736
737         /* Set current node pointer. */
738         cur = sp->fts_cur;
739
740         /*
741          * Open the directory for reading.  If this fails, we're done.
742          * If being called from fts_read, set the fts_info field.
743          */
744 #if defined FTS_WHITEOUT && 0
745         if (ISSET(FTS_WHITEOUT))
746                 oflag = DTF_NODUP|DTF_REWIND;
747         else
748                 oflag = DTF_HIDEW|DTF_NODUP|DTF_REWIND;
749 #else
750 # define __opendir2(file, flag) opendir(file)
751 #endif
752        if ((dirp = __opendir2(cur->fts_accpath, oflag)) == NULL) {
753                 if (type == BREAD) {
754                         cur->fts_info = FTS_DNR;
755                         cur->fts_errno = errno;
756                 }
757                 return (NULL);
758         }
759
760         /*
761          * Nlinks is the number of possible entries of type directory in the
762          * directory if we're cheating on stat calls, 0 if we're not doing
763          * any stat calls at all, (nlink_t) -1 if we're statting everything.
764          */
765         if (type == BNAMES) {
766                 nlinks = 0;
767                 /* Be quiet about nostat, GCC. */
768                 nostat = false;
769         } else if (ISSET(FTS_NOSTAT) && ISSET(FTS_PHYSICAL)) {
770                 nlinks = (cur->fts_statp->st_nlink
771                           - (ISSET(FTS_SEEDOT) ? 0 : 2));
772                 nostat = true;
773         } else {
774                 nlinks = -1;
775                 nostat = false;
776         }
777
778         /*
779          * If we're going to need to stat anything or we want to descend
780          * and stay in the directory, chdir.  If this fails we keep going,
781          * but set a flag so we don't chdir after the post-order visit.
782          * We won't be able to stat anything, but we can still return the
783          * names themselves.  Note, that since fts_read won't be able to
784          * chdir into the directory, it will have to return different file
785          * names than before, i.e. "a/b" instead of "b".  Since the node
786          * has already been visited in pre-order, have to wait until the
787          * post-order visit to return the error.  There is a special case
788          * here, if there was nothing to stat then it's not an error to
789          * not be able to stat.  This is all fairly nasty.  If a program
790          * needed sorted entries or stat information, they had better be
791          * checking FTS_NS on the returned nodes.
792          */
793         cderrno = 0;
794         if (nlinks || type == BREAD) {
795                 if (fts_safe_changedir(sp, cur, dirfd(dirp), NULL)) {
796                         if (nlinks && type == BREAD)
797                                 cur->fts_errno = errno;
798                         cur->fts_flags |= FTS_DONTCHDIR;
799                         descend = false;
800                         cderrno = errno;
801                         closedir(dirp);
802                         dirp = NULL;
803                 } else
804                         descend = true;
805         } else
806                 descend = false;
807
808         /*
809          * Figure out the max file name length that can be stored in the
810          * current buffer -- the inner loop allocates more space as necessary.
811          * We really wouldn't have to do the maxlen calculations here, we
812          * could do them in fts_read before returning the name, but it's a
813          * lot easier here since the length is part of the dirent structure.
814          *
815          * If not changing directories set a pointer so that can just append
816          * each new component into the file name.
817          */
818         len = NAPPEND(cur);
819         if (ISSET(FTS_NOCHDIR)) {
820                 cp = sp->fts_path + len;
821                 *cp++ = '/';
822         } else {
823                 /* GCC, you're too verbose. */
824                 cp = NULL;
825         }
826         len++;
827         maxlen = sp->fts_pathlen - len;
828
829         level = cur->fts_level + 1;
830
831         /* Read the directory, attaching each entry to the `link' pointer. */
832         doadjust = false;
833         for (head = tail = NULL, nitems = 0; dirp && (dp = readdir(dirp));) {
834                 if (!ISSET(FTS_SEEDOT) && ISDOT(dp->d_name))
835                         continue;
836
837                 if ((p = fts_alloc(sp, dp->d_name, NAMLEN (dp))) == NULL)
838                         goto mem1;
839                 if (NAMLEN (dp) >= maxlen) {/* include space for NUL */
840                         oldaddr = sp->fts_path;
841                         if (! fts_palloc(sp, NAMLEN (dp) + len + 1)) {
842                                 /*
843                                  * No more memory.  Save
844                                  * errno, free up the current structure and the
845                                  * structures already allocated.
846                                  */
847 mem1:                           saved_errno = errno;
848                                 if (p)
849                                         free(p);
850                                 fts_lfree(head);
851                                 closedir(dirp);
852                                 cur->fts_info = FTS_ERR;
853                                 SET(FTS_STOP);
854                                 __set_errno (saved_errno);
855                                 return (NULL);
856                         }
857                         /* Did realloc() change the pointer? */
858                         if (oldaddr != sp->fts_path) {
859                                 doadjust = true;
860                                 if (ISSET(FTS_NOCHDIR))
861                                         cp = sp->fts_path + len;
862                         }
863                         maxlen = sp->fts_pathlen - len;
864                 }
865
866                 new_len = len + NAMLEN (dp);
867                 if (new_len < len) {
868                         /*
869                          * In the unlikely even that we would end up
870                          * with a file name longer than SIZE_MAX, free up
871                          * the current structure and the structures already
872                          * allocated, then error out with ENAMETOOLONG.
873                          */
874                         free(p);
875                         fts_lfree(head);
876                         closedir(dirp);
877                         cur->fts_info = FTS_ERR;
878                         SET(FTS_STOP);
879                         __set_errno (ENAMETOOLONG);
880                         return (NULL);
881                 }
882                 p->fts_level = level;
883                 p->fts_parent = sp->fts_cur;
884                 p->fts_pathlen = new_len;
885
886 #if defined FTS_WHITEOUT && 0
887                 if (dp->d_type == DT_WHT)
888                         p->fts_flags |= FTS_ISW;
889 #endif
890
891                 if (cderrno) {
892                         if (nlinks) {
893                                 p->fts_info = FTS_NS;
894                                 p->fts_errno = cderrno;
895                         } else
896                                 p->fts_info = FTS_NSOK;
897                         p->fts_accpath = cur->fts_accpath;
898                 } else if (nlinks == 0
899 #if HAVE_STRUCT_DIRENT_D_TYPE
900                            || (nostat &&
901                                dp->d_type != DT_DIR && dp->d_type != DT_UNKNOWN)
902 #endif
903                     ) {
904                         p->fts_accpath =
905                             ISSET(FTS_NOCHDIR) ? p->fts_path : p->fts_name;
906                         p->fts_info = FTS_NSOK;
907                 } else {
908                         /* Build a file name for fts_stat to stat. */
909                         if (ISSET(FTS_NOCHDIR)) {
910                                 p->fts_accpath = p->fts_path;
911                                 memmove(cp, p->fts_name, p->fts_namelen + 1);
912                         } else
913                                 p->fts_accpath = p->fts_name;
914                         /* Stat it. */
915                         p->fts_info = fts_stat(sp, p, false);
916
917                         /* Decrement link count if applicable. */
918                         if (nlinks > 0 && (p->fts_info == FTS_D ||
919                             p->fts_info == FTS_DC || p->fts_info == FTS_DOT))
920                                 nlinks -= nostat;
921                 }
922
923                 /* We walk in directory order so "ls -f" doesn't get upset. */
924                 p->fts_link = NULL;
925                 if (head == NULL)
926                         head = tail = p;
927                 else {
928                         tail->fts_link = p;
929                         tail = p;
930                 }
931                 ++nitems;
932         }
933         if (dirp)
934                 closedir(dirp);
935
936         /*
937          * If realloc() changed the address of the file name, adjust the
938          * addresses for the rest of the tree and the dir list.
939          */
940         if (doadjust)
941                 fts_padjust(sp, head);
942
943         /*
944          * If not changing directories, reset the file name back to original
945          * state.
946          */
947         if (ISSET(FTS_NOCHDIR)) {
948                 if (len == sp->fts_pathlen || nitems == 0)
949                         --cp;
950                 *cp = '\0';
951         }
952
953         /*
954          * If descended after called from fts_children or after called from
955          * fts_read and nothing found, get back.  At the root level we use
956          * the saved fd; if one of fts_open()'s arguments is a relative name
957          * to an empty directory, we wind up here with no other way back.  If
958          * can't get back, we're done.
959          */
960         if (descend && (type == BCHILD || !nitems) &&
961             (cur->fts_level == FTS_ROOTLEVEL ?
962              FCHDIR(sp, sp->fts_rfd) :
963              fts_safe_changedir(sp, cur->fts_parent, -1, ".."))) {
964                 cur->fts_info = FTS_ERR;
965                 SET(FTS_STOP);
966                 return (NULL);
967         }
968
969         /* If didn't find anything, return NULL. */
970         if (!nitems) {
971                 if (type == BREAD)
972                         cur->fts_info = FTS_DP;
973                 return (NULL);
974         }
975
976         /* Sort the entries. */
977         if (sp->fts_compar && nitems > 1)
978                 head = fts_sort(sp, head, nitems);
979         return (head);
980 }
981
982 #if FTS_DEBUG
983
984 /* Walk ->fts_parent links starting at E_CURR, until the root of the
985    current hierarchy.  There should be a directory with dev/inode
986    matching those of AD.  If not, print a lot of diagnostics.  */
987 static void
988 find_matching_ancestor (FTSENT const *e_curr, struct Active_dir const *ad)
989 {
990   FTSENT const *ent;
991   for (ent = e_curr; ent->fts_level >= FTS_ROOTLEVEL; ent = ent->fts_parent)
992     {
993       if (ad->ino == ent->fts_statp->st_ino
994           && ad->dev == ent->fts_statp->st_dev)
995         return;
996     }
997   printf ("ERROR: tree dir, %s, not active\n", ad->fts_ent->fts_accpath);
998   printf ("active dirs:\n");
999   for (ent = e_curr;
1000        ent->fts_level >= FTS_ROOTLEVEL; ent = ent->fts_parent)
1001     printf ("  %s(%"PRIuMAX"/%"PRIuMAX") to %s(%"PRIuMAX"/%"PRIuMAX")...\n",
1002             ad->fts_ent->fts_accpath,
1003             (uintmax_t) ad->dev,
1004             (uintmax_t) ad->ino,
1005             ent->fts_accpath,
1006             (uintmax_t) ent->fts_statp->st_dev,
1007             (uintmax_t) ent->fts_statp->st_ino);
1008 }
1009
1010 void
1011 fts_cross_check (FTS const *sp)
1012 {
1013   FTSENT const *ent = sp->fts_cur;
1014   FTSENT const *t;
1015   if ( ! ISSET (FTS_TIGHT_CYCLE_CHECK))
1016     return;
1017
1018   Dprintf (("fts-cross-check cur=%s\n", ent->fts_path));
1019   /* Make sure every parent dir is in the tree.  */
1020   for (t = ent->fts_parent; t->fts_level >= FTS_ROOTLEVEL; t = t->fts_parent)
1021     {
1022       struct Active_dir ad;
1023       ad.ino = t->fts_statp->st_ino;
1024       ad.dev = t->fts_statp->st_dev;
1025       if ( ! hash_lookup (sp->fts_cycle.ht, &ad))
1026         printf ("ERROR: active dir, %s, not in tree\n", t->fts_path);
1027     }
1028
1029   /* Make sure every dir in the tree is an active dir.
1030      But ENT is not necessarily a directory.  If so, just skip this part. */
1031   if (ent->fts_parent->fts_level >= FTS_ROOTLEVEL
1032       && (ent->fts_info == FTS_DP
1033           || ent->fts_info == FTS_D))
1034     {
1035       struct Active_dir *ad;
1036       for (ad = hash_get_first (sp->fts_cycle.ht); ad != NULL;
1037            ad = hash_get_next (sp->fts_cycle.ht, ad))
1038         {
1039           find_matching_ancestor (ent, ad);
1040         }
1041     }
1042 }
1043 #endif
1044
1045 static unsigned short int
1046 internal_function
1047 fts_stat(FTS *sp, register FTSENT *p, bool follow)
1048 {
1049         struct stat *sbp = p->fts_statp;
1050         int saved_errno;
1051
1052 #if defined FTS_WHITEOUT && 0
1053         /* check for whiteout */
1054         if (p->fts_flags & FTS_ISW) {
1055                 memset(sbp, '\0', sizeof (*sbp));
1056                 sbp->st_mode = S_IFWHT;
1057                 return (FTS_W);
1058        }
1059 #endif
1060
1061         /*
1062          * If doing a logical walk, or application requested FTS_FOLLOW, do
1063          * a stat(2).  If that fails, check for a non-existent symlink.  If
1064          * fail, set the errno from the stat call.
1065          */
1066         if (ISSET(FTS_LOGICAL) || follow) {
1067                 if (stat(p->fts_accpath, sbp)) {
1068                         saved_errno = errno;
1069                         if (!lstat(p->fts_accpath, sbp)) {
1070                                 __set_errno (0);
1071                                 return (FTS_SLNONE);
1072                         }
1073                         p->fts_errno = saved_errno;
1074                         goto err;
1075                 }
1076         } else if (lstat(p->fts_accpath, sbp)) {
1077                 p->fts_errno = errno;
1078 err:            memset(sbp, 0, sizeof(struct stat));
1079                 return (FTS_NS);
1080         }
1081
1082         if (S_ISDIR(sbp->st_mode)) {
1083                 if (ISDOT(p->fts_name))
1084                         return (FTS_DOT);
1085
1086 #if _LGPL_PACKAGE
1087                 {
1088                   /*
1089                    * Cycle detection is done by brute force when the directory
1090                    * is first encountered.  If the tree gets deep enough or the
1091                    * number of symbolic links to directories is high enough,
1092                    * something faster might be worthwhile.
1093                    */
1094                   FTSENT *t;
1095
1096                   for (t = p->fts_parent;
1097                        t->fts_level >= FTS_ROOTLEVEL; t = t->fts_parent)
1098                     if (sbp->st_ino == t->fts_statp->st_ino
1099                         && sbp->st_dev == t->fts_statp->st_dev)
1100                       {
1101                         p->fts_cycle = t;
1102                         return (FTS_DC);
1103                       }
1104                 }
1105 #endif
1106
1107                 return (FTS_D);
1108         }
1109         if (S_ISLNK(sbp->st_mode))
1110                 return (FTS_SL);
1111         if (S_ISREG(sbp->st_mode))
1112                 return (FTS_F);
1113         return (FTS_DEFAULT);
1114 }
1115
1116 static int
1117 fts_compar (void const *a, void const *b)
1118 {
1119   /* Convert A and B to the correct types, to pacify the compiler, and
1120      for portability to bizarre hosts where "void const *" and "FTSENT
1121      const **" differ in runtime representation.  The comparison
1122      function cannot modify *a and *b, but there is no compile-time
1123      check for this.  */
1124   FTSENT const **pa = (FTSENT const **) a;
1125   FTSENT const **pb = (FTSENT const **) b;
1126   return pa[0]->fts_fts->fts_compar (pa, pb);
1127 }
1128
1129 static FTSENT *
1130 internal_function
1131 fts_sort (FTS *sp, FTSENT *head, register size_t nitems)
1132 {
1133         register FTSENT **ap, *p;
1134
1135         /* On most modern hosts, void * and FTSENT ** have the same
1136            run-time representation, and one can convert sp->fts_compar to
1137            the type qsort expects without problem.  Use the heuristic that
1138            this is OK if the two pointer types are the same size, and if
1139            converting FTSENT ** to long int is the same as converting
1140            FTSENT ** to void * and then to long int.  This heuristic isn't
1141            valid in general but we don't know of any counterexamples.  */
1142         FTSENT *dummy;
1143         int (*compare) (void const *, void const *) =
1144           ((sizeof &dummy == sizeof (void *)
1145             && (long int) &dummy == (long int) (void *) &dummy)
1146            ? (int (*) (void const *, void const *)) sp->fts_compar
1147            : fts_compar);
1148
1149         /*
1150          * Construct an array of pointers to the structures and call qsort(3).
1151          * Reassemble the array in the order returned by qsort.  If unable to
1152          * sort for memory reasons, return the directory entries in their
1153          * current order.  Allocate enough space for the current needs plus
1154          * 40 so don't realloc one entry at a time.
1155          */
1156         if (nitems > sp->fts_nitems) {
1157                 struct _ftsent **a;
1158
1159                 sp->fts_nitems = nitems + 40;
1160                 if (SIZE_MAX / sizeof *a < sp->fts_nitems
1161                     || ! (a = realloc (sp->fts_array,
1162                                        sp->fts_nitems * sizeof *a))) {
1163                         free(sp->fts_array);
1164                         sp->fts_array = NULL;
1165                         sp->fts_nitems = 0;
1166                         return (head);
1167                 }
1168                 sp->fts_array = a;
1169         }
1170         for (ap = sp->fts_array, p = head; p; p = p->fts_link)
1171                 *ap++ = p;
1172         qsort((void *)sp->fts_array, nitems, sizeof(FTSENT *), compare);
1173         for (head = *(ap = sp->fts_array); --nitems; ++ap)
1174                 ap[0]->fts_link = ap[1];
1175         ap[0]->fts_link = NULL;
1176         return (head);
1177 }
1178
1179 static FTSENT *
1180 internal_function
1181 fts_alloc (FTS *sp, const char *name, register size_t namelen)
1182 {
1183         register FTSENT *p;
1184         size_t len;
1185
1186         /*
1187          * The file name is a variable length array.  Allocate the FTSENT
1188          * structure and the file name in one chunk.
1189          */
1190         len = sizeof(FTSENT) + namelen;
1191         if ((p = malloc(len)) == NULL)
1192                 return (NULL);
1193
1194         /* Copy the name and guarantee NUL termination. */
1195         memmove(p->fts_name, name, namelen);
1196         p->fts_name[namelen] = '\0';
1197
1198         p->fts_namelen = namelen;
1199         p->fts_fts = sp;
1200         p->fts_path = sp->fts_path;
1201         p->fts_errno = 0;
1202         p->fts_flags = 0;
1203         p->fts_instr = FTS_NOINSTR;
1204         p->fts_number = 0;
1205         p->fts_pointer = NULL;
1206         return (p);
1207 }
1208
1209 static void
1210 internal_function
1211 fts_lfree (register FTSENT *head)
1212 {
1213         register FTSENT *p;
1214
1215         /* Free a linked list of structures. */
1216         while ((p = head)) {
1217                 head = head->fts_link;
1218                 free(p);
1219         }
1220 }
1221
1222 /*
1223  * Allow essentially unlimited file name lengths; find, rm, ls should
1224  * all work on any tree.  Most systems will allow creation of file
1225  * names much longer than MAXPATHLEN, even though the kernel won't
1226  * resolve them.  Add the size (not just what's needed) plus 256 bytes
1227  * so don't realloc the file name 2 bytes at a time.
1228  */
1229 static bool
1230 internal_function
1231 fts_palloc (FTS *sp, size_t more)
1232 {
1233         char *p;
1234         size_t new_len = sp->fts_pathlen + more + 256;
1235
1236         /*
1237          * See if fts_pathlen would overflow.
1238          */
1239         if (new_len < sp->fts_pathlen) {
1240                 if (sp->fts_path) {
1241                         free(sp->fts_path);
1242                         sp->fts_path = NULL;
1243                 }
1244                 sp->fts_path = NULL;
1245                 __set_errno (ENAMETOOLONG);
1246                 return false;
1247         }
1248         sp->fts_pathlen = new_len;
1249         p = realloc(sp->fts_path, sp->fts_pathlen);
1250         if (p == NULL) {
1251                 free(sp->fts_path);
1252                 sp->fts_path = NULL;
1253                 return false;
1254         }
1255         sp->fts_path = p;
1256         return true;
1257 }
1258
1259 /*
1260  * When the file name is realloc'd, have to fix all of the pointers in
1261  *  structures already returned.
1262  */
1263 static void
1264 internal_function
1265 fts_padjust (FTS *sp, FTSENT *head)
1266 {
1267         FTSENT *p;
1268         char *addr = sp->fts_path;
1269
1270 #define ADJUST(p) do {                                                  \
1271         if ((p)->fts_accpath != (p)->fts_name) {                        \
1272                 (p)->fts_accpath =                                      \
1273                     (char *)addr + ((p)->fts_accpath - (p)->fts_path);  \
1274         }                                                               \
1275         (p)->fts_path = addr;                                           \
1276 } while (0)
1277         /* Adjust the current set of children. */
1278         for (p = sp->fts_child; p; p = p->fts_link)
1279                 ADJUST(p);
1280
1281         /* Adjust the rest of the tree, including the current level. */
1282         for (p = head; p->fts_level >= FTS_ROOTLEVEL;) {
1283                 ADJUST(p);
1284                 p = p->fts_link ? p->fts_link : p->fts_parent;
1285         }
1286 }
1287
1288 static size_t
1289 internal_function
1290 fts_maxarglen (char * const *argv)
1291 {
1292         size_t len, max;
1293
1294         for (max = 0; *argv; ++argv)
1295                 if ((len = strlen(*argv)) > max)
1296                         max = len;
1297         return (max + 1);
1298 }
1299
1300 /*
1301  * Change to dir specified by fd or file name without getting
1302  * tricked by someone changing the world out from underneath us.
1303  * Assumes p->fts_statp->st_dev and p->fts_statp->st_ino are filled in.
1304  */
1305 static int
1306 internal_function
1307 fts_safe_changedir (FTS *sp, FTSENT *p, int fd, char const *dir)
1308 {
1309         int ret, oerrno, newfd;
1310         struct stat sb;
1311
1312         newfd = fd;
1313         if (ISSET(FTS_NOCHDIR))
1314                 return (0);
1315         if (fd < 0 && (newfd = diropen (dir)) < 0)
1316                 return (-1);
1317         if (fstat(newfd, &sb)) {
1318                 ret = -1;
1319                 goto bail;
1320         }
1321         if (p->fts_statp->st_dev != sb.st_dev
1322             || p->fts_statp->st_ino != sb.st_ino) {
1323                 __set_errno (ENOENT);           /* disinformation */
1324                 ret = -1;
1325                 goto bail;
1326         }
1327         ret = fchdir(newfd);
1328 bail:
1329         oerrno = errno;
1330         if (fd < 0)
1331                 (void)close(newfd);
1332         __set_errno (oerrno);
1333         return (ret);
1334 }