findutils/find-printf-Y-handle-ENOTDIR-also-as-broken-symlink.patch
2019-09-30 10:38:48 -04:00

75 lines
2.8 KiB
Diff

From ba6be2889642010c8f30affe403981aa2cc39631 Mon Sep 17 00:00:00 2001
From: Bernhard Voelker <mail@bernhard-voelker.de>
Date: Tue, 24 Jul 2018 08:34:38 +0200
Subject: [PATCH 184/224] find -printf %Y: handle ENOTDIR also as broken
symlink
The above command should output 'N' (for broken symlinks) not only in
the ENOENT case, but also when an intermediate part of the symlink target
file name is a file (ENOTDIR):
$ touch file
$ ln -s file/ENOTDIR link
$ find link -printf '%Y %p\n'
N link
Previously, find output 'l' as for a resolvable symlink.
* find/print.c (do_fprintf): Treat ENOTDIR the same as ENOENT to detect
broken symlinks.
* find/testsuite/find.gnu/printf-symlink.exp: Extend the test, and ...
* find/testsuite/find.gnu/printf-symlink.xo: ... the expected output.
* NEWS (Bug fixes, #54262): Explicitly mention that both ENOENT and ENOTDIR
are used to detect broken symlinks.
Suggested by Tavian Barnes.
---
NEWS | 4 ++--
find/print.c | 2 +-
find/testsuite/find.gnu/printf-symlink.exp | 3 ++-
find/testsuite/find.gnu/printf-symlink.xo | 2 ++
4 files changed, 7 insertions(+), 4 deletions(-)
diff --git a/find/print.c b/find/print.c
index 24bd9692..1bfccbfc 100644
--- a/find/print.c
+++ b/find/print.c
@@ -1182,7 +1182,7 @@ do_fprintf (struct format_val *dest,
*/
if (fstatat (state.cwd_dir_fd, state.rel_pathname, &sbuf, 0) != 0)
{
- if ( errno == ENOENT )
+ if ( (errno == ENOENT) || (errno == ENOTDIR) )
{
checked_fprintf (dest, segment->text, "N");
break;
diff --git a/find/testsuite/find.gnu/printf-symlink.exp b/find/testsuite/find.gnu/printf-symlink.exp
index 453f07fc..077f18b5 100644
--- a/find/testsuite/find.gnu/printf-symlink.exp
+++ b/find/testsuite/find.gnu/printf-symlink.exp
@@ -3,7 +3,8 @@ exec mkdir tmp
exec touch tmp/file
exec ln -s file tmp/LINK
exec ln -s ENOENT tmp/DANGLE
+exec ln -s file/ENOTDIR tmp/ENOTDIR
exec ln -s SELF tmp/SELF
exec ls -ls tmp
-find_start p {tmp/LINK tmp/DANGLE tmp/SELF -printf "RESULT: %y %Y %p\n" -printf "RESULT2: %Y %y %p\n" }
+find_start p {tmp/LINK tmp/DANGLE tmp/ENOTDIR tmp/SELF -printf "RESULT: %y %Y %p\n" -printf "RESULT2: %Y %y %p\n" }
exec rm -rf tmp
diff --git a/find/testsuite/find.gnu/printf-symlink.xo b/find/testsuite/find.gnu/printf-symlink.xo
index 08eb83c6..978c6673 100644
--- a/find/testsuite/find.gnu/printf-symlink.xo
+++ b/find/testsuite/find.gnu/printf-symlink.xo
@@ -2,5 +2,7 @@ RESULT: l f tmp/LINK
RESULT2: f l tmp/LINK
RESULT: l N tmp/DANGLE
RESULT2: N l tmp/DANGLE
+RESULT: l N tmp/ENOTDIR
+RESULT2: N l tmp/ENOTDIR
RESULT: l L tmp/SELF
RESULT2: L l tmp/SELF
--
2.19.1