From a656db664daca129dba9c481e73eb4e76b9d0009 Mon Sep 17 00:00:00 2001 From: =?utf8?q?P=C3=A1draig=20Brady?= Date: Tue, 21 Sep 2021 14:01:34 +0100 Subject: [PATCH] tail: fix detection of closed stdout on macOS * bootstrap.conf: We only need poll on Linux and AIX where poll is not replaced. Also resinstate dependence on select so we can use it unconditionally. * src/tail.c (check_output_alive): Reinstate use of select() by default as poll was seen to be ineffective for this application on macOS. Fixes https://bugs.gnu.org/50714 --- bootstrap.conf | 2 +- src/tail.c | 25 ++++++++++++++++++++++++- 2 files changed, 25 insertions(+), 2 deletions(-) diff --git a/bootstrap.conf b/bootstrap.conf index bcfc6f0a0c..aef9ec7ded 100644 --- a/bootstrap.conf +++ b/bootstrap.conf @@ -194,7 +194,6 @@ gnulib_modules=" physmem pipe-posix pipe2 - poll posix-shell posixtm posixver @@ -230,6 +229,7 @@ gnulib_modules=" save-cwd savedir savewd + select selinux-at setenv settime diff --git a/src/tail.c b/src/tail.c index d2c898adf7..df1b28f07a 100644 --- a/src/tail.c +++ b/src/tail.c @@ -28,7 +28,7 @@ #include #include #include -#include +#include #include #include @@ -55,6 +55,10 @@ # include #endif +#if defined _AIX || HAVE_INOTIFY +# include +#endif + /* Linux can optimize the handling of local files. */ #if defined __linux__ || defined __ANDROID__ # include "fs.h" @@ -348,12 +352,31 @@ check_output_alive (void) if (! monitor_output) return; + /* Use 'poll' on AIX (where 'select' was seen to give a readable + 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 struct pollfd pfd; pfd.fd = STDOUT_FILENO; pfd.events = POLLERR; if (poll (&pfd, 1, 0) >= 0 && (pfd.revents & POLLERR)) die_pipe (); +#else + struct timeval delay; + delay.tv_sec = delay.tv_usec = 0; + + fd_set rfd; + FD_ZERO (&rfd); + FD_SET (STDOUT_FILENO, &rfd); + + /* readable event on STDOUT is equivalent to POLLERR, + and implies an error condition on output like broken pipe. */ + if (select (STDOUT_FILENO + 1, &rfd, NULL, NULL, &delay) == 1) + die_pipe (); +#endif + } static bool -- 2.47.2