aboutsummaryrefslogtreecommitdiff
path: root/toys/posix/find.c
diff options
context:
space:
mode:
authorElliott Hughes <enh@google.com>2019-08-28 14:37:50 -0700
committerRob Landley <rob@landley.net>2019-08-28 17:57:40 -0500
commitf97f4e72e9ead6dcd0f747d5c780c0878b873e7f (patch)
tree01e3c47fb52505aa3370cb13671e72d02acdfbbc /toys/posix/find.c
parentac84e8507983f9dee1df75bdd961a7dfd4f44b09 (diff)
downloadtoybox-f97f4e72e9ead6dcd0f747d5c780c0878b873e7f.tar.gz
Fix find(1) after c26870dab346.
Unlike ls, find does treat ENOENT specially. Add an extra test (and fix the behavior) for the case of ENOENT for a path provided on the command line --- unlike other ENOENT cases (typically dangling symlinks), ENOENT for a command line argument should report an error. Also remove obsolete `|sed` from the symlink loop test.
Diffstat (limited to 'toys/posix/find.c')
-rw-r--r--toys/posix/find.c8
1 files changed, 8 insertions, 0 deletions
diff --git a/toys/posix/find.c b/toys/posix/find.c
index 782cc3bc..58a6f88d 100644
--- a/toys/posix/find.c
+++ b/toys/posix/find.c
@@ -216,6 +216,14 @@ static int do_find(struct dirtree *new)
// skip . and .. below topdir, handle -xdev and -depth
if (new) {
+ // Handle stat failures first.
+ if (!new->st.st_blksize && !new->st.st_dev && !new->st.st_ino) {
+ if (!new->parent || errno != ENOENT) {
+ perror_msg("'%s'", s = dirtree_path(new, 0));
+ free(s);
+ }
+ return 0;
+ }
if (new->parent) {
if (!dirtree_notdotdot(new)) return 0;
if (TT.xdev && new->st.st_dev != new->parent->st.st_dev) recurse = 0;