From d5ab4cbe424e3e95140eec22ef828f50b2fb3067 Mon Sep 17 00:00:00 2001 From: =?utf8?q?P=C3=A1draig=20Brady?= Date: Fri, 4 Jan 2019 09:29:13 -0800 Subject: [PATCH] tail: don't exit immediately with filters on AIX * src/tail.c: Fix the check_output_available check on AIX. Note we don't use poll for all systems as the overhead of adding the gnulib poll module wouldn't be worth it just for this single use. * tests/tail-2/pipe-f.sh: Fix the test which always passed due to only the exit code of sleep being checked. * NEWS: Mention the bug fix and rearrange alphabetically. Fixes http://bugs.gnu.org/33946 --- NEWS | 8 +++++--- src/tail.c | 13 +++++++++++++ tests/tail-2/pipe-f.sh | 5 ++++- 3 files changed, 22 insertions(+), 4 deletions(-) diff --git a/NEWS b/NEWS index 4a57d221b..6a9c0bca2 100644 --- a/NEWS +++ b/NEWS @@ -4,6 +4,9 @@ GNU coreutils NEWS -*- outline -*- ** Bug fixes + 'base64 a b' now correctly diagnoses 'b' as the extra operand, not 'a'. + [bug introduced in coreutils-5.3.0] + When B already exists, 'cp -il A B' no longer immediately fails after asking the user whether to proceed. [This bug was present in "the beginning".] @@ -21,9 +24,8 @@ GNU coreutils NEWS -*- outline -*- sync no longer fails for write-only file arguments. [bug introduced with argument support to sync in coreutils-8.24] - In 'base64 a b', and likewise for base32, the tool now correctly - diagnoses 'b' as the extra operand, not 'a'. - [bug introduced in coreutils-5.3.0] + 'tail -f file | filter' no longer exits immediately on AIX. + [bug introduced in coreutils-8.28] ** Changes in behavior diff --git a/src/tail.c b/src/tail.c index 0270cbe07..9f5f44315 100644 --- a/src/tail.c +++ b/src/tail.c @@ -30,6 +30,9 @@ #include #include #include +#ifdef _AIX +# include +#endif #include "system.h" #include "argmatch.h" @@ -336,6 +339,16 @@ named file in a way that accommodates renaming, removal and creation.\n\ static void check_output_alive (void) { +#ifdef _AIX + /* select on AIX was seen to give a readable event immediately. */ + struct pollfd pfd; + pfd.fd = STDOUT_FILENO; + pfd.events = POLLERR; + + if (poll (&pfd, 1, 0) >= 0 && (pfd.revents & POLLERR)) + raise (SIGPIPE); +#endif + if (! monitor_output) return; diff --git a/tests/tail-2/pipe-f.sh b/tests/tail-2/pipe-f.sh index 9231cac4b..4a5b444f3 100755 --- a/tests/tail-2/pipe-f.sh +++ b/tests/tail-2/pipe-f.sh @@ -37,7 +37,10 @@ compare exp out || fail=1 # This would wait indefinitely before v8.28 due to no EPIPE being # generated due to no data written after the first small amount -timeout 10 tail -f $mode $fastpoll out | sleep .1 || fail=1 +(returns_ 124 timeout 10 tail -n2 -f $mode $fastpoll out && touch timed_out) | + sed 2q > out2 +test -e timed_out && fail=1 +compare exp out2 || fail=1 # This would wait indefinitely before v8.28 (until first write) (returns_ 1 timeout 10 tail -f $mode $fastpoll /dev/null >&-) || fail=1 -- 2.11.4.GIT