aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xtests/find.test8
-rw-r--r--toys/posix/find.c8
2 files changed, 15 insertions, 1 deletions
diff --git a/tests/find.test b/tests/find.test
index fea6a3fc..b3e2c4fa 100755
--- a/tests/find.test
+++ b/tests/find.test
@@ -102,18 +102,24 @@ testing "-printf" "find dir -name file -printf '%f %p %P %s'" \
"file dir/file file 0" "" ""
testing "-printf .N" "find dir -name file -printf %.2f" "fi" "" ""
+# No error message for a dangling link.
ln -s does-not-exist dir/dangler
testing "-L dangling symlink silent" \
"LANG=C find -L dir -name file 2>&1" "dir/file\n" "" ""
rm -f dir/dangler
+# An error for a symlink loop.
ln -s looper dir/looper
testing "-L symlink loop noisy" \
- "LANG=C find -L dir -name file 2>err | sed s/\'//g ; grep -q dir/looper err || echo missing error" \
+ "LANG=C find -L dir -name file 2>err ; grep -q dir/looper err || echo missing error" \
"dir/file\n" "" ""
rm -f dir/looper err
testing "-false" "find dir -false" "" "" ""
testing "-true" "find dir/file -true" "dir/file\n" "" ""
+testing "missing root error" \
+ "LANG=C find -L dir/missing-root 2>err ; grep -q dir/missing-root err || echo missing error" \
+ "" "" ""
+
rm -rf dir
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;