From 87d5f1e17e32176b262a13262ac3ec16e1970596 Mon Sep 17 00:00:00 2001 From: =?utf8?q?P=C3=A1draig=20Brady?= Date: Wed, 13 Apr 2022 17:31:47 +0100 Subject: [PATCH] tail: detect closed stdout on Solaris * src/tail.c (check_output_alive): Use poll() on Solaris. Also handle POLLHUP, which Solaris returns in this case. * tests/tail-2/pipe-f.sh: Use `head -n2` rather than `sed 2q` as Solaris sed does not exit in this case. * NEWS: Mention the improvement. Reported by Bruno Haible. --- NEWS | 2 ++ src/tail.c | 8 ++++---- tests/tail-2/pipe-f.sh | 4 ++-- 3 files changed, 8 insertions(+), 6 deletions(-) diff --git a/NEWS b/NEWS index 85fd5be122..faac5c5437 100644 --- a/NEWS +++ b/NEWS @@ -117,6 +117,8 @@ GNU coreutils NEWS -*- outline -*- sort --debug now diagnoses issues with --field-separator characters that conflict with characters possibly used in numbers. + 'tail -f file | filter' now exits on Solaris when filter exits. + root invoked coreutils, that are built and run in single binary mode, now adjust /proc/$pid/cmdline to be more specific to the utility being run, rather than using the general "coreutils" binary name. diff --git a/src/tail.c b/src/tail.c index f1b7417837..a4a590a793 100644 --- a/src/tail.c +++ b/src/tail.c @@ -55,7 +55,7 @@ # include #endif -#if defined _AIX || HAVE_INOTIFY +#if defined _AIX || defined __sun || HAVE_INOTIFY # include #endif @@ -356,12 +356,12 @@ check_output_alive (void) event immediately) or if using inotify (which relies on 'poll' anyway). Otherwise, use 'select' as it's more portable; 'poll' doesn't work for this application on macOS. */ -#if defined _AIX || HAVE_INOTIFY +#if defined _AIX || defined __sun || HAVE_INOTIFY struct pollfd pfd; pfd.fd = STDOUT_FILENO; - pfd.events = POLLERR; + pfd.events = pfd.revents = 0; - if (poll (&pfd, 1, 0) >= 0 && (pfd.revents & POLLERR)) + if (poll (&pfd, 1, 0) >= 0 && (pfd.revents & (POLLERR | POLLHUP))) die_pipe (); #else struct timeval delay; diff --git a/tests/tail-2/pipe-f.sh b/tests/tail-2/pipe-f.sh index 97d5bce697..4ca43a3ea7 100755 --- a/tests/tail-2/pipe-f.sh +++ b/tests/tail-2/pipe-f.sh @@ -17,7 +17,7 @@ # along with this program. If not, see . . "${srcdir=.}/tests/init.sh"; path_prepend_ ./src -print_ver_ tail test +print_ver_ tail test head trap_sigpipe_or_skip_ # Speedup the non inotify case @@ -45,7 +45,7 @@ for disposition in '' '-'; do (trap "$disposition" PIPE; returns_ 124 timeout 10 \ tail -n2 -f $mode $fastpoll out && touch timed_out) | - sed 2q > out2 + head -n2 > out2 test -e timed_out && fail=1 compare exp out2 || fail=1 rm -f timed_out -- 2.47.2