Backed out the positional parameter change because it was too error prone and over...
[findutils.git] / find / find.c
blobe4e08f5954c5b038391d06b058c8c92f4bf225eb
1 /* find -- search for files in a directory hierarchy
2 Copyright (C) 1990, 91, 92, 93, 94, 2000,
3 2003, 2004, 2005, 2007 Free Software Foundation, Inc.
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.
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.
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/>.
18 /* GNU find was written by Eric Decker <cire@cisco.com>,
19 with enhancements by David MacKenzie <djm@gnu.org>,
20 Jay Plett <jay@silence.princeton.nj.us>,
21 and Tim Wood <axolotl!tim@toad.com>.
22 The idea for -print0 and xargs -0 came from
23 Dan Bernstein <brnstnd@kramden.acf.nyu.edu>.
24 Improvements have been made by James Youngman <jay@gnu.org>.
28 #include <config.h>
29 #include "defs.h"
31 #define USE_SAFE_CHDIR 1
32 #undef STAT_MOUNTPOINTS
35 #include <errno.h>
36 #include <assert.h>
38 #include <sys/stat.h>
39 #include <fcntl.h>
40 #include <openat.h>
42 #include "xalloc.h"
43 #include "human.h"
44 #include "canonicalize.h"
45 #include <modetype.h>
47 #include "closein.h"
48 #include "savedirinfo.h"
49 #include "buildcmd.h"
50 #include "dirname.h"
51 #include "quote.h"
52 #include "quotearg.h"
53 #include "xgetcwd.h"
54 #include "error.h"
56 #ifdef HAVE_LOCALE_H
57 #include <locale.h>
58 #endif
60 #if ENABLE_NLS
61 # include <libintl.h>
62 # define _(Text) gettext (Text)
63 #else
64 # define _(Text) Text
65 #define textdomain(Domain)
66 #define bindtextdomain(Package, Directory)
67 #endif
68 #ifdef gettext_noop
69 # define N_(String) gettext_noop (String)
70 #else
71 /* See locate.c for explanation as to why not use (String) */
72 # define N_(String) String
73 #endif
75 #ifdef STAT_MOUNTPOINTS
76 static void init_mounted_dev_list(int mandatory);
77 #endif
79 static void process_top_path PARAMS((char *pathname, mode_t mode));
80 static int process_path PARAMS((char *pathname, char *name, boolean leaf, char *parent, mode_t type));
81 static void process_dir PARAMS((char *pathname, char *name, int pathlen, const struct stat *statp, char *parent));
85 /* Name this program was run with. */
86 char *program_name;
88 /* A file descriptor open to the initial working directory.
89 Doing it this way allows us to work when the i.w.d. has
90 unreadable parents. */
91 int starting_desc;
93 /* The stat buffer of the initial working directory. */
94 static struct stat starting_stat_buf;
96 enum ChdirSymlinkHandling
98 SymlinkHandleDefault, /* Normally the right choice */
99 SymlinkFollowOk /* see comment in process_top_path() */
103 enum TraversalDirection
105 TraversingUp,
106 TraversingDown
109 enum WdSanityCheckFatality
111 FATAL_IF_SANITY_CHECK_FAILS,
112 RETRY_IF_SANITY_CHECK_FAILS,
113 NON_FATAL_IF_SANITY_CHECK_FAILS
117 int get_current_dirfd(void)
119 return AT_FDCWD;
124 main (int argc, char **argv)
126 int i;
127 int end_of_leading_options = 0; /* First arg after any -H/-L etc. */
128 struct predicate *eval_tree;
130 program_name = argv[0];
131 state.exit_status = 0;
133 /* Set the option defaults before we do the locale
134 * initialisation as check_nofollow() needs to be executed in the
135 * POSIX locale.
137 set_option_defaults(&options);
139 #ifdef HAVE_SETLOCALE
140 setlocale (LC_ALL, "");
141 #endif
142 bindtextdomain (PACKAGE, LOCALEDIR);
143 textdomain (PACKAGE);
144 atexit (close_stdin);
146 /* Check for -P, -H or -L options. */
147 end_of_leading_options = process_leading_options(argc, argv);
149 if (options.debug_options & DebugStat)
150 options.xstat = debug_stat;
152 #ifdef DEBUG
153 fprintf (stderr, "cur_day_start = %s", ctime (&options.cur_day_start));
154 #endif /* DEBUG */
156 /* state.cwd_dir_fd has to be initialised before we call build_expression_tree()
157 * because command-line parsing may lead us to stat some files.
159 state.cwd_dir_fd = AT_FDCWD;
161 /* We are now processing the part of the "find" command line
162 * after the -H/-L options (if any).
164 eval_tree = build_expression_tree(argc, argv, end_of_leading_options);
167 /* safely_chdir() needs to check that it has ended up in the right place.
168 * To avoid bailing out when something gets automounted, it checks if
169 * the target directory appears to have had a directory mounted on it as
170 * we chdir()ed. The problem with this is that in order to notice that
171 * a file system was mounted, we would need to lstat() all the mount points.
172 * That strategy loses if our machine is a client of a dead NFS server.
174 * Hence if safely_chdir() and wd_sanity_check() can manage without needing
175 * to know the mounted device list, we do that.
177 if (!options.open_nofollow_available)
179 #ifdef STAT_MOUNTPOINTS
180 init_mounted_dev_list(0);
181 #endif
185 starting_desc = open (".", O_RDONLY
186 #if defined O_LARGEFILE
187 |O_LARGEFILE
188 #endif
190 if (0 <= starting_desc && fchdir (starting_desc) != 0)
192 close (starting_desc);
193 starting_desc = -1;
196 if (starting_desc < 0)
198 starting_dir = xgetcwd ();
199 if (! starting_dir)
200 error (1, errno, _("cannot get current directory"));
202 set_stat_placeholders(&starting_stat_buf);
203 if ((*options.xstat) (".", &starting_stat_buf) != 0)
204 error (1, errno, _("cannot stat current directory"));
206 /* If no paths are given, default to ".". */
207 for (i = end_of_leading_options; i < argc && !looks_like_expression(argv[i], true); i++)
209 process_top_path (argv[i], 0);
212 /* If there were no path arguments, default to ".". */
213 if (i == end_of_leading_options)
216 * We use a temporary variable here because some actions modify
217 * the path temporarily. Hence if we use a string constant,
218 * we get a coredump. The best example of this is if we say
219 * "find -printf %H" (note, not "find . -printf %H").
221 char defaultpath[2] = ".";
222 process_top_path (defaultpath, 0);
225 /* If "-exec ... {} +" has been used, there may be some
226 * partially-full command lines which have been built,
227 * but which are not yet complete. Execute those now.
229 show_success_rates(eval_tree);
230 cleanup();
231 return state.exit_status;
234 boolean is_fts_enabled(int *ftsoptions)
236 /* this version of find (i.e. this main()) does not use fts. */
237 *ftsoptions = 0;
238 return false;
242 static char *
243 specific_dirname(const char *dir)
245 char dirbuf[1024];
247 if (0 == strcmp(".", dir))
249 /* OK, what's '.'? */
250 if (NULL != getcwd(dirbuf, sizeof(dirbuf)))
252 return strdup(dirbuf);
254 else
256 return strdup(dir);
259 else
261 char *result = canonicalize_filename_mode(dir, CAN_EXISTING);
262 if (NULL == result)
263 return strdup(dir);
264 else
265 return result;
271 /* Return non-zero if FS is the name of a file system that is likely to
272 * be automounted
274 static int
275 fs_likely_to_be_automounted(const char *fs)
277 return ( (0==strcmp(fs, "nfs")) || (0==strcmp(fs, "autofs")) || (0==strcmp(fs, "subfs")));
282 #ifdef STAT_MOUNTPOINTS
283 static dev_t *mounted_devices = NULL;
284 static size_t num_mounted_devices = 0u;
287 static void
288 init_mounted_dev_list(int mandatory)
290 assert (NULL == mounted_devices);
291 assert (0 == num_mounted_devices);
292 mounted_devices = get_mounted_devices(&num_mounted_devices);
293 if (mandatory && (NULL == mounted_devices))
295 error(1, 0, "Cannot read list of mounted devices.");
299 static void
300 refresh_mounted_dev_list(void)
302 if (mounted_devices)
304 free(mounted_devices);
305 mounted_devices = 0;
307 num_mounted_devices = 0u;
308 init_mounted_dev_list(1);
312 /* Search for device DEV in the array LIST, which is of size N. */
313 static int
314 dev_present(dev_t dev, const dev_t *list, size_t n)
316 if (list)
318 while (n-- > 0u)
320 if ( (*list++) == dev )
321 return 1;
324 return 0;
327 enum MountPointStateChange
329 MountPointRecentlyMounted,
330 MountPointRecentlyUnmounted,
331 MountPointStateUnchanged
336 static enum MountPointStateChange
337 get_mount_state(dev_t newdev)
339 int new_is_present, new_was_present;
341 new_was_present = dev_present(newdev, mounted_devices, num_mounted_devices);
342 refresh_mounted_dev_list();
343 new_is_present = dev_present(newdev, mounted_devices, num_mounted_devices);
345 if (new_was_present == new_is_present)
346 return MountPointStateUnchanged;
347 else if (new_is_present)
348 return MountPointRecentlyMounted;
349 else
350 return MountPointRecentlyUnmounted;
355 /* We stat()ed a directory, chdir()ed into it (we know this
356 * since direction is TraversingDown), stat()ed it again,
357 * and noticed that the device numbers are different. Check
358 * if the file system was recently mounted.
360 * If it was, it looks like chdir()ing into the directory
361 * caused a file system to be mounted. Maybe automount is
362 * running. Anyway, that's probably OK - but it happens
363 * only when we are moving downward.
365 * We also allow for the possibility that a similar thing
366 * has happened with the unmounting of a file system. This
367 * is much rarer, as it relies on an automounter timeout
368 * occurring at exactly the wrong moment.
370 static enum WdSanityCheckFatality
371 dirchange_is_fatal(const char *specific_what,
372 enum WdSanityCheckFatality isfatal,
373 int silent,
374 struct stat *newinfo)
376 enum MountPointStateChange transition = get_mount_state(newinfo->st_dev);
377 switch (transition)
379 case MountPointRecentlyUnmounted:
380 isfatal = NON_FATAL_IF_SANITY_CHECK_FAILS;
381 if (!silent)
383 error (0, 0,
384 _("Warning: file system %s has recently been unmounted."),
385 safely_quote_err_filename(0, specific_what));
387 break;
389 case MountPointRecentlyMounted:
390 isfatal = NON_FATAL_IF_SANITY_CHECK_FAILS;
391 if (!silent)
393 error (0, 0,
394 _("Warning: file system %s has recently been mounted."),
395 safely_quote_err_filename(0, specific_what));
397 break;
399 case MountPointStateUnchanged:
400 /* leave isfatal as it is */
401 break;
404 return isfatal;
408 #endif
412 /* Examine the results of the stat() of a directory from before we
413 * entered or left it, with the results of stat()ing it afterward. If
414 * these are different, the file system tree has been modified while we
415 * were traversing it. That might be an attempt to use a race
416 * condition to persuade find to do something it didn't intend
417 * (e.g. an attempt by an ordinary user to exploit the fact that root
418 * sometimes runs find on the whole file system). However, this can
419 * also happen if automount is running (certainly on Solaris). With
420 * automount, moving into a directory can cause a file system to be
421 * mounted there.
423 * To cope sensibly with this, we will raise an error if we see the
424 * device number change unless we are chdir()ing into a subdirectory,
425 * and the directory we moved into has been mounted or unmounted "recently".
426 * Here "recently" means since we started "find" or we last re-read
427 * the /etc/mnttab file.
429 * If the device number does not change but the inode does, that is a
430 * problem.
432 * If the device number and inode are both the same, we are happy.
434 * If a file system is (un)mounted as we chdir() into the directory, that
435 * may mean that we're now examining a section of the file system that might
436 * have been excluded from consideration (via -prune or -quit for example).
437 * Hence we print a warning message to indicate that the output of find
438 * might be inconsistent due to the change in the file system.
440 static boolean
441 wd_sanity_check(const char *thing_to_stat,
442 const char *progname,
443 const char *what,
444 dev_t old_dev,
445 ino_t old_ino,
446 struct stat *newinfo,
447 int parent,
448 int line_no,
449 enum TraversalDirection direction,
450 enum WdSanityCheckFatality isfatal,
451 boolean *changed) /* output parameter */
453 const char *fstype;
454 char *specific_what = NULL;
455 int silent = 0;
456 const char *current_dir = ".";
458 *changed = false;
460 set_stat_placeholders(newinfo);
461 if ((*options.xstat) (current_dir, newinfo) != 0)
462 fatal_file_error(thing_to_stat);
464 if (old_dev != newinfo->st_dev)
466 *changed = true;
467 specific_what = specific_dirname(what);
468 fstype = filesystem_type(newinfo, current_dir);
469 silent = fs_likely_to_be_automounted(fstype);
471 /* This condition is rare, so once we are here it is
472 * reasonable to perform an expensive computation to
473 * determine if we should continue or fail.
475 if (TraversingDown == direction)
477 #ifdef STAT_MOUNTPOINTS
478 isfatal = dirchange_is_fatal(specific_what,isfatal,silent,newinfo);
479 #else
480 isfatal = RETRY_IF_SANITY_CHECK_FAILS;
481 #endif
484 switch (isfatal)
486 case FATAL_IF_SANITY_CHECK_FAILS:
488 fstype = filesystem_type(newinfo, current_dir);
489 error (1, 0,
490 _("%s%s changed during execution of %s (old device number %ld, new device number %ld, file system type is %s) [ref %ld]"),
491 safely_quote_err_filename(0, specific_what),
492 parent ? "/.." : "",
493 safely_quote_err_filename(1, progname),
494 (long) old_dev,
495 (long) newinfo->st_dev,
496 fstype,
497 (long)line_no);
498 /*NOTREACHED*/
499 return false;
502 case NON_FATAL_IF_SANITY_CHECK_FAILS:
504 /* Since the device has changed under us, the inode number
505 * will almost certainly also be different. However, we have
506 * already decided that this is not a problem. Hence we return
507 * without checking the inode number.
509 free(specific_what);
510 return true;
513 case RETRY_IF_SANITY_CHECK_FAILS:
514 return false;
518 /* Device number was the same, check if the inode has changed. */
519 if (old_ino != newinfo->st_ino)
521 *changed = true;
522 specific_what = specific_dirname(what);
523 fstype = filesystem_type(newinfo, current_dir);
525 error ((isfatal == FATAL_IF_SANITY_CHECK_FAILS) ? 1 : 0,
526 0, /* no relevant errno value */
527 _("%s%s changed during execution of %s "
528 "(old inode number %ld, new inode number %ld, file system type is %s) [ref %ld]"),
529 safely_quote_err_filename(0, specific_what),
530 parent ? "/.." : "",
531 safely_quote_err_filename(1, progname),
532 (long) old_ino,
533 (long) newinfo->st_ino,
534 fstype,
535 (long)line_no);
536 free(specific_what);
537 return false;
540 return true;
543 enum SafeChdirStatus
545 SafeChdirOK,
546 SafeChdirFailSymlink,
547 SafeChdirFailNotDir,
548 SafeChdirFailStat,
549 SafeChdirFailWouldBeUnableToReturn,
550 SafeChdirFailChdirFailed,
551 SafeChdirFailNonexistent,
552 SafeChdirFailDestUnreadable
555 /* Safely perform a change in directory. We do this by calling
556 * lstat() on the subdirectory, using chdir() to move into it, and
557 * then lstat()ing ".". We compare the results of the two stat calls
558 * to see if they are consistent. If not, we sound the alarm.
560 * If following_links() is true, we do follow symbolic links.
562 static enum SafeChdirStatus
563 safely_chdir_lstat(const char *dest,
564 enum TraversalDirection direction,
565 struct stat *statbuf_dest,
566 enum ChdirSymlinkHandling symlink_follow_option,
567 boolean *did_stat)
569 struct stat statbuf_arrived;
570 int rv, dotfd=-1;
571 int saved_errno; /* specific_dirname() changes errno. */
572 boolean rv_set = false;
573 boolean statflag = false;
574 int tries = 0;
575 enum WdSanityCheckFatality isfatal = RETRY_IF_SANITY_CHECK_FAILS;
577 saved_errno = errno = 0;
579 dotfd = open(".", O_RDONLY
580 #if defined O_LARGEFILE
581 |O_LARGEFILE
582 #endif
585 /* We jump back to here if wd_sanity_check()
586 * recoverably triggers an alert.
588 retry:
589 ++tries;
591 if (dotfd >= 0)
593 /* Stat the directory we're going to. */
594 set_stat_placeholders(statbuf_dest);
595 if (0 == options.xstat(dest, statbuf_dest))
597 statflag = true;
599 #ifdef S_ISLNK
600 /* symlink_follow_option might be set to SymlinkFollowOk, which
601 * would allow us to chdir() into a symbolic link. This is
602 * only useful for the case where the directory we're
603 * chdir()ing into is the basename of a command line
604 * argument, for example where "foo/bar/baz" is specified on
605 * the command line. When -P is in effect (the default),
606 * baz will not be followed if it is a symlink, but if bar
607 * is a symlink, it _should_ be followed. Hence we need the
608 * ability to override the policy set by following_links().
610 if (!following_links() && S_ISLNK(statbuf_dest->st_mode))
612 /* We're not supposed to be following links, but this is
613 * a link. Check symlink_follow_option to see if we should
614 * make a special exception.
616 if (symlink_follow_option == SymlinkFollowOk)
618 /* We need to re-stat() the file so that the
619 * sanity check can pass.
621 if (0 != stat(dest, statbuf_dest))
623 rv = SafeChdirFailNonexistent;
624 rv_set = true;
625 saved_errno = errno;
626 goto fail;
628 statflag = true;
630 else
632 /* Not following symlinks, so the attempt to
633 * chdir() into a symlink should be prevented.
635 rv = SafeChdirFailSymlink;
636 rv_set = true;
637 saved_errno = 0; /* silence the error message */
638 goto fail;
641 #endif
642 #ifdef S_ISDIR
643 /* Although the immediately following chdir() would detect
644 * the fact that this is not a directory for us, this would
645 * result in an extra system call that fails. Anybody
646 * examining the system-call trace should ideally not be
647 * concerned that something is actually failing.
649 if (!S_ISDIR(statbuf_dest->st_mode))
651 rv = SafeChdirFailNotDir;
652 rv_set = true;
653 saved_errno = 0; /* silence the error message */
654 goto fail;
656 #endif
658 if (options.debug_options & DebugSearch)
659 fprintf(stderr, "safely_chdir(): chdir(\"%s\")\n", dest);
661 if (0 == chdir(dest))
663 /* check we ended up where we wanted to go */
664 boolean changed = false;
665 if (!wd_sanity_check(".", program_name, ".",
666 statbuf_dest->st_dev,
667 statbuf_dest->st_ino,
668 &statbuf_arrived,
669 0, __LINE__, direction,
670 isfatal,
671 &changed))
673 /* Only allow one failure. */
674 if (RETRY_IF_SANITY_CHECK_FAILS == isfatal)
676 if (0 == fchdir(dotfd))
678 isfatal = FATAL_IF_SANITY_CHECK_FAILS;
679 goto retry;
681 else
683 /* Failed to return to original directory,
684 * but we know that the current working
685 * directory is not the one that we intend
686 * to be in. Since fchdir() failed, we
687 * can't recover from this and so this error
688 * is fatal.
690 error(1, errno,
691 "failed to return to parent directory");
694 else
696 /* XXX: not sure what to use as an excuse here. */
697 rv = SafeChdirFailNonexistent;
698 rv_set = true;
699 saved_errno = 0;
700 goto fail;
704 close(dotfd);
705 return SafeChdirOK;
707 else
709 saved_errno = errno;
710 if (ENOENT == saved_errno)
712 rv = SafeChdirFailNonexistent;
713 rv_set = true;
714 if (options.ignore_readdir_race)
715 errno = 0; /* don't issue err msg */
717 else if (ENOTDIR == saved_errno)
719 /* This can happen if the we stat a directory,
720 * and then file system activity changes it into
721 * a non-directory.
723 saved_errno = 0; /* don't issue err msg */
724 rv = SafeChdirFailNotDir;
725 rv_set = true;
727 else
729 rv = SafeChdirFailChdirFailed;
730 rv_set = true;
732 goto fail;
735 else
737 saved_errno = errno;
738 rv = SafeChdirFailStat;
739 rv_set = true;
741 if ( (ENOENT == saved_errno) || (0 == state.curdepth))
742 saved_errno = 0; /* don't issue err msg */
743 goto fail;
746 else
748 /* We do not have read permissions on "." */
749 rv = SafeChdirFailWouldBeUnableToReturn;
750 rv_set = true;
751 goto fail;
754 /* This is the success path, so we clear errno. The caller probably
755 * won't be calling error() anyway.
757 saved_errno = 0;
759 /* We use the same exit path for success or failure.
760 * which has occurred is recorded in RV.
762 fail:
763 /* We do not call error() as this would result in a duplicate error
764 * message when the caller does the same thing.
766 if (saved_errno)
767 errno = saved_errno;
769 if (dotfd >= 0)
771 close(dotfd);
772 dotfd = -1;
775 *did_stat = statflag;
776 assert (rv_set);
777 return rv;
780 #if defined O_NOFOLLOW
781 /* Safely change working directory to the specified subdirectory. If
782 * we are not allowed to follow symbolic links, we use open() with
783 * O_NOFOLLOW, followed by fchdir(). This ensures that we don't
784 * follow symbolic links (of course, we do follow them if the -L
785 * option is in effect).
787 static enum SafeChdirStatus
788 safely_chdir_nofollow(const char *dest,
789 enum TraversalDirection direction,
790 struct stat *statbuf_dest,
791 enum ChdirSymlinkHandling symlink_follow_option,
792 boolean *did_stat)
794 int extraflags, fd;
796 (void) direction;
797 (void) statbuf_dest;
799 extraflags = 0;
800 *did_stat = false;
802 switch (symlink_follow_option)
804 case SymlinkFollowOk:
805 extraflags = 0;
806 break;
808 case SymlinkHandleDefault:
809 if (following_links())
810 extraflags = 0;
811 else
812 extraflags = O_NOFOLLOW;
813 break;
816 errno = 0;
817 fd = open(dest, O_RDONLY
818 #if defined O_LARGEFILE
819 |O_LARGEFILE
820 #endif
821 |extraflags);
822 if (fd < 0)
824 switch (errno)
826 case ELOOP:
827 return SafeChdirFailSymlink; /* This is why we use O_NOFOLLOW */
828 case ENOENT:
829 return SafeChdirFailNonexistent;
830 default:
831 return SafeChdirFailDestUnreadable;
835 errno = 0;
836 if (0 == fchdir(fd))
838 close(fd);
839 return SafeChdirOK;
841 else
843 int saved_errno = errno;
844 close(fd);
845 errno = saved_errno;
847 switch (errno)
849 case ENOTDIR:
850 return SafeChdirFailNotDir;
852 case EACCES:
853 case EBADF: /* Shouldn't happen */
854 case EINTR:
855 case EIO:
856 default:
857 return SafeChdirFailChdirFailed;
861 #endif
863 static enum SafeChdirStatus
864 safely_chdir(const char *dest,
865 enum TraversalDirection direction,
866 struct stat *statbuf_dest,
867 enum ChdirSymlinkHandling symlink_follow_option,
868 boolean *did_stat)
870 enum SafeChdirStatus result;
872 /* We're about to leave a directory. If there are any -execdir
873 * argument lists which have been built but have not yet been
874 * processed, do them now because they must be done in the same
875 * directory.
877 complete_pending_execdirs(get_current_dirfd());
879 #if !defined(O_NOFOLLOW)
880 options.open_nofollow_available = false;
881 #endif
882 if (options.open_nofollow_available)
884 result = safely_chdir_nofollow(dest, direction, statbuf_dest,
885 symlink_follow_option, did_stat);
886 if (SafeChdirFailDestUnreadable != result)
888 return result;
890 else
892 /* Savannah bug #15384: fall through to use safely_chdir_lstat
893 * if the directory is not readable.
895 /* Do nothing. */
898 /* Even if O_NOFOLLOW is available, we may need to use the alternative
899 * method, since parent of the start point may be executable but not
900 * readable.
902 return safely_chdir_lstat(dest, direction, statbuf_dest,
903 symlink_follow_option, did_stat);
908 /* Safely go back to the starting directory. */
909 static void
910 chdir_back (void)
912 struct stat stat_buf;
913 boolean dummy;
915 if (starting_desc < 0)
917 if (options.debug_options & DebugSearch)
918 fprintf(stderr, "chdir_back(): chdir(\"%s\")\n", starting_dir);
920 #ifdef STAT_MOUNTPOINTS
921 /* We will need the mounted device list. Get it now if we don't
922 * already have it.
924 if (NULL == mounted_devices)
925 init_mounted_dev_list(1);
926 #endif
928 if (chdir (starting_dir) != 0)
929 fatal_file_error(starting_dir);
931 wd_sanity_check(starting_dir,
932 program_name,
933 starting_dir,
934 starting_stat_buf.st_dev,
935 starting_stat_buf.st_ino,
936 &stat_buf, 0, __LINE__,
937 TraversingUp,
938 FATAL_IF_SANITY_CHECK_FAILS,
939 &dummy);
941 else
943 if (options.debug_options & DebugSearch)
944 fprintf(stderr, "chdir_back(): chdir(<starting-point>)\n");
946 if (fchdir (starting_desc) != 0)
948 fatal_file_error(starting_dir);
953 /* Move to the parent of a given directory and then call a function,
954 * restoring the cwd. Don't bother changing directory if the
955 * specified directory is a child of "." or is the root directory.
957 static void
958 at_top (char *pathname,
959 mode_t mode,
960 struct stat *pstat,
961 void (*action)(char *pathname,
962 char *basename,
963 int mode,
964 struct stat *pstat))
966 int dirchange;
967 char *parent_dir = dir_name (pathname);
968 char *base = last_component (pathname);
970 state.curdepth = 0;
971 state.starting_path_length = strlen (pathname);
973 if (0 == *base
974 || 0 == strcmp(parent_dir, "."))
976 dirchange = 0;
977 base = pathname;
979 else
981 enum TraversalDirection direction;
982 enum SafeChdirStatus chdir_status;
983 struct stat st;
984 boolean did_stat = false;
986 dirchange = 1;
987 if (0 == strcmp(base, ".."))
988 direction = TraversingUp;
989 else
990 direction = TraversingDown;
992 /* We pass SymlinkFollowOk to safely_chdir(), which allows it to
993 * chdir() into a symbolic link. This is only useful for the
994 * case where the directory we're chdir()ing into is the
995 * basename of a command line argument, for example where
996 * "foo/bar/baz" is specified on the command line. When -P is
997 * in effect (the default), baz will not be followed if it is a
998 * symlink, but if bar is a symlink, it _should_ be followed.
999 * Hence we need the ability to override the policy set by
1000 * following_links().
1002 chdir_status = safely_chdir(parent_dir, direction, &st, SymlinkFollowOk, &did_stat);
1003 if (SafeChdirOK != chdir_status)
1005 const char *what = (SafeChdirFailWouldBeUnableToReturn == chdir_status) ? "." : parent_dir;
1006 if (errno)
1007 error (0, errno, "%s",
1008 safely_quote_err_filename(0, what));
1009 else
1010 error (0, 0, _("Failed to safely change directory into %s"),
1011 safely_quote_err_filename(0, parent_dir));
1013 /* We can't process this command-line argument. */
1014 state.exit_status = 1;
1015 return;
1019 free (parent_dir);
1020 parent_dir = NULL;
1022 action(pathname, base, mode, pstat);
1024 if (dirchange)
1026 chdir_back();
1031 static void do_process_top_dir(char *pathname,
1032 char *base,
1033 int mode,
1034 struct stat *pstat)
1036 (void) pstat;
1038 process_path (pathname, base, false, ".", mode);
1039 complete_pending_execdirs(get_current_dirfd());
1042 static void do_process_predicate(char *pathname,
1043 char *base,
1044 int mode,
1045 struct stat *pstat)
1047 (void) mode;
1049 state.rel_pathname = base; /* cwd_dir_fd was already set by safely_chdir */
1050 apply_predicate (pathname, pstat, get_eval_tree());
1056 /* Descend PATHNAME, which is a command-line argument.
1058 Actions like -execdir assume that we are in the
1059 parent directory of the file we're examining,
1060 and on entry to this function our working directory
1061 is whatever it was when find was invoked. Therefore
1062 If PATHNAME is "." we just leave things as they are.
1063 Otherwise, we figure out what the parent directory is,
1064 and move to that.
1066 static void
1067 process_top_path (char *pathname, mode_t mode)
1069 at_top(pathname, mode, NULL, do_process_top_dir);
1073 /* Info on each directory in the current tree branch, to avoid
1074 getting stuck in symbolic link loops. */
1075 static struct dir_id *dir_ids = NULL;
1076 /* Entries allocated in `dir_ids'. */
1077 static int dir_alloc = 0;
1078 /* Index in `dir_ids' of directory currently being searched.
1079 This is always the last valid entry. */
1080 static int dir_curr = -1;
1081 /* (Arbitrary) number of entries to grow `dir_ids' by. */
1082 #define DIR_ALLOC_STEP 32
1086 /* We've detected a file system loop. This is caused by one of
1087 * two things:
1089 * 1. Option -L is in effect and we've hit a symbolic link that
1090 * points to an ancestor. This is harmless. We won't traverse the
1091 * symbolic link.
1093 * 2. We have hit a real cycle in the directory hierarchy. In this
1094 * case, we issue a diagnostic message (POSIX requires this) and we
1095 * skip that directory entry.
1097 static void
1098 issue_loop_warning(const char *name, const char *pathname, int level)
1100 struct stat stbuf_link;
1101 if (lstat(name, &stbuf_link) != 0)
1102 stbuf_link.st_mode = S_IFREG;
1104 if (S_ISLNK(stbuf_link.st_mode))
1106 error(0, 0,
1107 _("Symbolic link %s is part of a loop in the directory hierarchy; we have already visited the directory to which it points."),
1108 safely_quote_err_filename(0, pathname));
1109 /* XXX: POSIX appears to require that the exit status be non-zero if a
1110 * diagnostic is issued.
1113 else
1115 int distance = 1 + (dir_curr-level);
1116 /* We have found an infinite loop. POSIX requires us to
1117 * issue a diagnostic. Usually we won't get to here
1118 * because when the leaf optimisation is on, it will cause
1119 * the subdirectory to be skipped. If /a/b/c/d is a hard
1120 * link to /a/b, then the link count of /a/b/c is 2,
1121 * because the ".." entry of /b/b/c/d points to /a, not
1122 * to /a/b/c.
1124 error(0, 0,
1125 _("Filesystem loop detected; %s has the same device number and inode as a directory which is %d %s."),
1126 safely_quote_err_filename(0, pathname),
1127 distance,
1128 (distance == 1 ?
1129 _("level higher in the file system hierarchy") :
1130 _("levels higher in the file system hierarchy")));
1136 /* Recursively descend path PATHNAME, applying the predicates.
1137 LEAF is true if PATHNAME is known to be in a directory that has no
1138 more unexamined subdirectories, and therefore it is not a directory.
1139 Knowing this allows us to avoid calling stat as long as possible for
1140 leaf files.
1142 NAME is PATHNAME relative to the current directory. We access NAME
1143 but print PATHNAME.
1145 PARENT is the path of the parent of NAME, relative to find's
1146 starting directory.
1148 Return nonzero iff PATHNAME is a directory. */
1150 static int
1151 process_path (char *pathname, char *name, boolean leaf, char *parent,
1152 mode_t mode)
1154 struct stat stat_buf;
1155 static dev_t root_dev; /* Device ID of current argument pathname. */
1156 int i;
1157 struct predicate *eval_tree;
1159 eval_tree = get_eval_tree();
1160 /* Assume it is a non-directory initially. */
1161 stat_buf.st_mode = 0;
1162 state.rel_pathname = name;
1163 state.type = 0;
1164 state.have_stat = false;
1165 state.have_type = false;
1167 if (!digest_mode(mode, pathname, name, &stat_buf, leaf))
1168 return 0;
1170 if (!S_ISDIR (state.type))
1172 if (state.curdepth >= options.mindepth)
1173 apply_predicate (pathname, &stat_buf, eval_tree);
1174 return 0;
1177 /* From here on, we're working on a directory. */
1180 /* Now we really need to stat the directory, even if we know the
1181 * type, because we need information like struct stat.st_rdev.
1183 if (get_statinfo(pathname, name, &stat_buf) != 0)
1184 return 0;
1186 state.have_stat = true;
1187 mode = state.type = stat_buf.st_mode; /* use full info now that we have it. */
1188 state.stop_at_current_level =
1189 options.maxdepth >= 0
1190 && state.curdepth >= options.maxdepth;
1192 /* If we've already seen this directory on this branch,
1193 don't descend it again. */
1194 for (i = 0; i <= dir_curr; i++)
1195 if (stat_buf.st_ino == dir_ids[i].ino &&
1196 stat_buf.st_dev == dir_ids[i].dev)
1198 state.stop_at_current_level = true;
1199 issue_loop_warning(name, pathname, i);
1202 if (dir_alloc <= ++dir_curr)
1204 dir_alloc += DIR_ALLOC_STEP;
1205 dir_ids = (struct dir_id *)
1206 xrealloc ((char *) dir_ids, dir_alloc * sizeof (struct dir_id));
1208 dir_ids[dir_curr].ino = stat_buf.st_ino;
1209 dir_ids[dir_curr].dev = stat_buf.st_dev;
1211 if (options.stay_on_filesystem)
1213 if (state.curdepth == 0)
1214 root_dev = stat_buf.st_dev;
1215 else if (stat_buf.st_dev != root_dev)
1216 state.stop_at_current_level = true;
1219 if (options.do_dir_first && state.curdepth >= options.mindepth)
1220 apply_predicate (pathname, &stat_buf, eval_tree);
1222 if (options.debug_options & DebugSearch)
1223 fprintf(stderr, "pathname = %s, stop_at_current_level = %d\n",
1224 pathname, state.stop_at_current_level);
1226 if (state.stop_at_current_level == false)
1228 /* Scan directory on disk. */
1229 process_dir (pathname, name, strlen (pathname), &stat_buf, parent);
1232 if (options.do_dir_first == false && state.curdepth >= options.mindepth)
1234 /* The fields in 'state' are now out of date. Correct them.
1236 if (!digest_mode(mode, pathname, name, &stat_buf, leaf))
1237 return 0;
1239 if (0 == dir_curr)
1241 at_top(pathname, mode, &stat_buf, do_process_predicate);
1243 else
1245 do_process_predicate(pathname, name, mode, &stat_buf);
1249 dir_curr--;
1251 return 1;
1255 /* Scan directory PATHNAME and recurse through process_path for each entry.
1257 PATHLEN is the length of PATHNAME.
1259 NAME is PATHNAME relative to the current directory.
1261 STATP is the results of *options.xstat on it.
1263 PARENT is the path of the parent of NAME, relative to find's
1264 starting directory. */
1266 static void
1267 process_dir (char *pathname, char *name, int pathlen, const struct stat *statp, char *parent)
1269 int subdirs_left; /* Number of unexamined subdirs in PATHNAME. */
1270 boolean subdirs_unreliable; /* if true, cannot use dir link count as subdir limif (if false, it may STILL be unreliable) */
1271 unsigned int idx; /* Which entry are we on? */
1272 struct stat stat_buf;
1273 size_t dircount = 0u;
1274 struct savedir_dirinfo *dirinfo;
1275 #if 0
1276 printf("process_dir: pathname=%s name=%s statp->st_nlink=%d st_ino=%d\n",
1277 pathname,
1278 name,
1279 (int)statp->st_nlink,
1280 (int)statp->st_ino);
1281 #endif
1282 if (statp->st_nlink < 2)
1284 subdirs_unreliable = true;
1285 subdirs_left = 0;
1287 else
1289 subdirs_unreliable = false; /* not necessarily right */
1290 subdirs_left = statp->st_nlink - 2; /* Account for name and ".". */
1293 errno = 0;
1294 dirinfo = xsavedir(name, 0);
1297 if (dirinfo == NULL)
1299 assert (errno != 0);
1300 error (0, errno, "%s", safely_quote_err_filename(0, pathname));
1301 state.exit_status = 1;
1303 else
1305 register char *namep; /* Current point in `name_space'. */
1306 char *cur_path; /* Full path of each file to process. */
1307 char *cur_name; /* Base name of each file to process. */
1308 unsigned cur_path_size; /* Bytes allocated for `cur_path'. */
1309 register unsigned file_len; /* Length of each path to process. */
1310 register unsigned pathname_len; /* PATHLEN plus trailing '/'. */
1311 boolean did_stat = false;
1313 if (pathname[pathlen - 1] == '/')
1314 pathname_len = pathlen + 1; /* For '\0'; already have '/'. */
1315 else
1316 pathname_len = pathlen + 2; /* For '/' and '\0'. */
1317 cur_path_size = 0;
1318 cur_path = NULL;
1320 /* We're about to leave the directory. If there are any
1321 * -execdir argument lists which have been built but have not
1322 * yet been processed, do them now because they must be done in
1323 * the same directory.
1325 complete_pending_execdirs(get_current_dirfd());
1327 if (strcmp (name, "."))
1329 enum SafeChdirStatus status = safely_chdir (name, TraversingDown, &stat_buf, SymlinkHandleDefault, &did_stat);
1330 switch (status)
1332 case SafeChdirOK:
1333 /* If there had been a change but wd_sanity_check()
1334 * accepted it, we need to accept that on the
1335 * way back up as well, so modify our record
1336 * of what we think we should see later.
1337 * If there was no change, the assignments are a no-op.
1339 * However, before performing the assignment, we need to
1340 * check that we have the stat information. If O_NOFOLLOW
1341 * is available, safely_chdir() will not have needed to use
1342 * stat(), and so stat_buf will just contain random data.
1344 if (!did_stat)
1346 /* If there is a link we need to follow it. Hence
1347 * the direct call to stat() not through (options.xstat)
1349 set_stat_placeholders(&stat_buf);
1350 if (0 != stat(".", &stat_buf))
1351 break; /* skip the assignment. */
1353 dir_ids[dir_curr].dev = stat_buf.st_dev;
1354 dir_ids[dir_curr].ino = stat_buf.st_ino;
1356 break;
1358 case SafeChdirFailWouldBeUnableToReturn:
1359 error (0, errno, ".");
1360 state.exit_status = 1;
1361 break;
1363 case SafeChdirFailNonexistent:
1364 case SafeChdirFailDestUnreadable:
1365 case SafeChdirFailStat:
1366 case SafeChdirFailNotDir:
1367 case SafeChdirFailChdirFailed:
1368 error (0, errno, "%s",
1369 safely_quote_err_filename(0, pathname));
1370 state.exit_status = 1;
1371 return;
1373 case SafeChdirFailSymlink:
1374 error (0, 0,
1375 _("warning: not following the symbolic link %s"),
1376 safely_quote_err_filename(0, pathname));
1377 state.exit_status = 1;
1378 return;
1382 for (idx=0; idx < dirinfo->size; ++idx)
1384 /* savedirinfo() may return dirinfo=NULL if extended information
1385 * is not available.
1387 mode_t mode = (dirinfo->entries[idx].flags & SavedirHaveFileType) ?
1388 dirinfo->entries[idx].type_info : 0;
1389 namep = dirinfo->entries[idx].name;
1391 /* Append this directory entry's name to the path being searched. */
1392 file_len = pathname_len + strlen (namep);
1393 if (file_len > cur_path_size)
1395 while (file_len > cur_path_size)
1396 cur_path_size += 1024;
1397 if (cur_path)
1398 free (cur_path);
1399 cur_path = xmalloc (cur_path_size);
1400 strcpy (cur_path, pathname);
1401 cur_path[pathname_len - 2] = '/';
1403 cur_name = cur_path + pathname_len - 1;
1404 strcpy (cur_name, namep);
1406 state.curdepth++;
1407 if (!options.no_leaf_check && !subdirs_unreliable)
1409 if (mode && S_ISDIR(mode) && (subdirs_left == 0))
1411 /* This is a subdirectory, but the number of directories we
1412 * have found now exceeds the number we would expect given
1413 * the hard link count on the parent. This is likely to be
1414 * a bug in the file system driver (e.g. Linux's
1415 * /proc file system) or may just be a fact that the OS
1416 * doesn't really handle hard links with Unix semantics.
1417 * In the latter case, -noleaf should be used routinely.
1419 error(0, 0, _("WARNING: Hard link count is wrong for %s (saw only st_nlink=%d but we already saw %d subdirectories): this may be a bug in your file system driver. Automatically turning on find's -noleaf option. Earlier results may have failed to include directories that should have been searched."),
1420 safely_quote_err_filename(0, pathname),
1421 statp->st_nlink,
1422 dircount);
1423 state.exit_status = 1; /* We know the result is wrong, now */
1424 options.no_leaf_check = true; /* Don't make same
1425 mistake again */
1426 subdirs_unreliable = 1;
1427 subdirs_left = 1; /* band-aid for this iteration. */
1430 /* Normal case optimization. On normal Unix
1431 file systems, a directory that has no subdirectories
1432 has two links: its name, and ".". Any additional
1433 links are to the ".." entries of its subdirectories.
1434 Once we have processed as many subdirectories as
1435 there are additional links, we know that the rest of
1436 the entries are non-directories -- in other words,
1437 leaf files. */
1439 int count;
1440 count = process_path (cur_path, cur_name,
1441 subdirs_left == 0, pathname,
1442 mode);
1443 subdirs_left -= count;
1444 dircount += count;
1447 else
1449 /* There might be weird (e.g., CD-ROM or MS-DOS) file systems
1450 mounted, which don't have Unix-like directory link counts. */
1451 process_path (cur_path, cur_name, false, pathname, mode);
1454 state.curdepth--;
1458 /* We're about to leave the directory. If there are any
1459 * -execdir argument lists which have been built but have not
1460 * yet been processed, do them now because they must be done in
1461 * the same directory.
1463 complete_pending_execdirs(get_current_dirfd());
1465 if (strcmp (name, "."))
1467 enum SafeChdirStatus status;
1468 struct dir_id did;
1470 /* We could go back and do the next command-line arg
1471 instead, maybe using longjmp. */
1472 char const *dir;
1473 boolean deref = following_links() ? true : false;
1475 if ( (state.curdepth>0) && !deref)
1476 dir = "..";
1477 else
1479 chdir_back ();
1480 dir = parent;
1483 did_stat = false;
1484 status = safely_chdir (dir, TraversingUp, &stat_buf, SymlinkHandleDefault, &did_stat);
1485 switch (status)
1487 case SafeChdirOK:
1488 break;
1490 case SafeChdirFailWouldBeUnableToReturn:
1491 error (1, errno, ".");
1492 return;
1494 case SafeChdirFailNonexistent:
1495 case SafeChdirFailDestUnreadable:
1496 case SafeChdirFailStat:
1497 case SafeChdirFailSymlink:
1498 case SafeChdirFailNotDir:
1499 case SafeChdirFailChdirFailed:
1500 error (1, errno, "%s", safely_quote_err_filename(0, pathname));
1501 return;
1504 if (dir_curr > 0)
1506 did.dev = dir_ids[dir_curr-1].dev;
1507 did.ino = dir_ids[dir_curr-1].ino;
1509 else
1511 did.dev = starting_stat_buf.st_dev;
1512 did.ino = starting_stat_buf.st_ino;
1516 if (cur_path)
1517 free (cur_path);
1518 free_dirinfo(dirinfo);
1521 if (subdirs_unreliable)
1523 /* Make sure we hasn't used the variable subdirs_left if we knew
1524 * we shouldn't do so.
1526 assert (0 == subdirs_left || options.no_leaf_check);