]> git.ipfire.org Git - thirdparty/coreutils.git/commitdiff
tail: detect closed stdout on Solaris
authorPádraig Brady <P@draigBrady.com>
Wed, 13 Apr 2022 16:31:47 +0000 (17:31 +0100)
committerPádraig Brady <P@draigBrady.com>
Wed, 13 Apr 2022 19:10:14 +0000 (20:10 +0100)
* 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
src/tail.c
tests/tail-2/pipe-f.sh

diff --git a/NEWS b/NEWS
index 85fd5be122f9678b9937c633077848dcbc529319..faac5c54371a00b51f8e871de56dba516b6d6c19 100644 (file)
--- 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.
index f1b74178371ead46795aaed15e4b7d2934b16ecc..a4a590a7936ad7ce3342bdeefa8dcb62d41b3fdd 100644 (file)
@@ -55,7 +55,7 @@
 # include <sys/inotify.h>
 #endif
 
-#if defined _AIX || HAVE_INOTIFY
+#if defined _AIX || defined __sun || HAVE_INOTIFY
 # include <poll.h>
 #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;
index 97d5bce6971f564d7687bdbf36136b689b2e922e..4ca43a3ea7052b1337b549180347290bbfdd4476 100755 (executable)
@@ -17,7 +17,7 @@
 # along with this program.  If not, see <https://www.gnu.org/licenses/>.
 
 . "${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