OSDN Git Service

* fhandler_socket.cc (fhandler_socket::recvfrom): Just return 0 (EOF)
authorcorinna <corinna>
Sun, 13 Nov 2005 16:24:40 +0000 (16:24 +0000)
committercorinna <corinna>
Sun, 13 Nov 2005 16:24:40 +0000 (16:24 +0000)
in case of WSAESHUTDOWN.
(fhandler_socket::recvmsg): Ditto.
* poll.cc (poll): Set revents to POLLIN instead of POLLHUP. Add comment.

winsup/cygwin/ChangeLog
winsup/cygwin/fhandler_socket.cc
winsup/cygwin/poll.cc

index ae5185e..836ad3c 100644 (file)
@@ -1,3 +1,10 @@
+2005-11-13  Corinna Vinschen  <corinna@vinschen.de>
+
+       * fhandler_socket.cc (fhandler_socket::recvfrom): Just return 0 (EOF)
+       in case of WSAESHUTDOWN.
+       (fhandler_socket::recvmsg): Ditto.
+       * poll.cc (poll): Set revents to POLLIN instead of POLLHUP. Add comment.
+
 2005-11-11  Christopher Faylor  <cgf@timesys.com>
 
        * cygheap.h (init_cygheap::_gtod): Remove.
index 79b59ff..5ed7d04 100644 (file)
@@ -1061,6 +1061,11 @@ fhandler_socket::recvfrom (void *ptr, size_t len, int flags,
       if (WSAGetLastError () == WSAEMSGSIZE)
        return len;
 
+      /* ESHUTDOWN isn't defined for recv in SUSv3.  Simply EOF is returned
+         in this case. */
+      if (WSAGetLastError () == WSAESHUTDOWN)
+        return 0;
+
       set_winsock_errno ();
     }
   else
@@ -1142,6 +1147,11 @@ fhandler_socket::recvmsg (struct msghdr *msg, int flags, ssize_t tot)
       if (WSAGetLastError () == WSAEMSGSIZE)
        return len;
 
+      /* ESHUTDOWN isn't defined for recv in SUSv3.  Simply EOF is returned
+         in this case. */
+      if (WSAGetLastError () == WSAESHUTDOWN)
+        return 0;
+
       set_winsock_errno ();
     }
   else
index 633696c..0ff6237 100644 (file)
@@ -118,8 +118,11 @@ poll (struct pollfd *fds, unsigned int nfds, int timeout)
                              else
                                fds[i].revents |= POLLIN;
                              break;
-                           case 0:  /* Closed on the read side. */
-                             fds[i].revents |= POLLHUP;
+                           case 0:  /* Closed on the read side... */
+                             /* ...or shutdown(SHUT_WR) on the write side.
+                                We set revents to POLLHUP until 1.5.18, but
+                                this is semantically borderline. */
+                             fds[i].revents |= POLLIN;
                              break;
                            default:
                              fds[i].revents |= POLLIN;