changeset 17083:1ba58228acda

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. Copyright-paperwork-exempt: yes
author Joachim Schmitz <jojo@schmitz-digital.de>
date Thu, 13 Sep 2012 08:55:08 +0200
parents 62741e75b7c5
children 723cfa7546c0
files ChangeLog doc/posix-functions/poll.texi lib/poll.c
diffstat 3 files changed, 17 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- 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.
--- a/doc/posix-functions/poll.texi
+++ b/doc/posix-functions/poll.texi
@@ -10,7 +10,7 @@
 @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 @@
 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
--- a/lib/poll.c
+++ b/lib/poll.c
@@ -303,6 +303,10 @@
                || 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;
     }