poll: fix for systems that can't recv() on a non-socket
authorJoachim Schmitz <jojo@schmitz-digital.de>
Thu, 13 Sep 2012 06:55:08 +0000 (08:55 +0200)
committerPaolo Bonzini <pbonzini@redhat.com>
Thu, 13 Sep 2012 06:57:02 +0000 (08:57 +0200)
* lib/poll.c: if recv returns ENOTSOCK, assume the descriptor
is readable.  In this case POLLHUP will not be supported.
* doc/posix-functions/poll.texi: Document this.

Copyright-paperwork-exempt: yes

ChangeLog
doc/posix-functions/poll.texi
lib/poll.c

index ab09b0e..9764b11 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+2012-09-13  Joachim Schmitz <jojo@schmitz-digital.de>  (tiny change)
+           Paolo Bonzini <bonzini@gnu.org>
+
+       poll: fix for systems that can't recv() on a non-socket
+       * lib/poll.c: if recv returns ENOTSOCK, assume the descriptor
+       is readable.  In this case POLLHUP will not be supported.
+       * doc/posix-functions/poll.texi: Document this.
+
 2012-09-13  Paolo Bonzini  <bonzini@gnu.org>
 
        poll/select: document portability problems not fixed by Gnulib.
index da619b9..ec1bdda 100644 (file)
@@ -10,7 +10,7 @@ Portability problems fixed by Gnulib:
 @itemize
 @item
 This function is missing on some platforms:
-mingw, MSVC 9, BeOS.
+mingw, MSVC 9, BeOS, HP NonStop.
 @item
 This function doesn't work on special files like @file{/dev/null} and ttys like
 @file{/dev/tty} on some platforms:
@@ -27,4 +27,8 @@ created by the @code{socket} function, not on regular file descriptors.
 Under Windows, when passing a pipe, Gnulib's @code{poll} replacement might
 return 0 even before the timeout has passed.  Programs using it with pipes can
 thus busy wait.
+
+@item
+Under HP NonStop, file descriptors other than sockets do not support
+POLLHUP; they will return a "readable" status instead.
 @end itemize
index 5ad9d86..b696dee 100644 (file)
@@ -303,6 +303,10 @@ compute_revents (int fd, int sought, fd_set *rfds, fd_set *wfds, fd_set *efds)
                || socket_errno == ECONNABORTED || socket_errno == ENETRESET)
         happened |= POLLHUP;
 
+      /* some systems can't use recv() on non-socket, including HP NonStop */
+      else if (socket_errno == ENOTSOCK)
+        happened |= (POLLIN | POLLRDNORM) & sought;
+
       else
         happened |= POLLERR;
     }