Welcome to mirror list, hosted at ThFree Co, Russian Federation.

cygwin.com/git/newlib-cygwin.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCorinna Vinschen <corinna@vinschen.de>2002-11-20 11:03:50 +0300
committerCorinna Vinschen <corinna@vinschen.de>2002-11-20 11:03:50 +0300
commit03b65245db3457d7df414ea7b07c56594362c20a (patch)
tree019df8eb47c0923d1fea13490bf18e75e1d8a526
parentec97538aa23e27bf1b79486ada811e97aa31e741 (diff)
* poll.cc (poll): Don't set POLLERR if a listening socket has a
pending connect. Don't use errno value from call to fhandler_socket::recvfrom().
-rw-r--r--winsup/cygwin/ChangeLog6
-rw-r--r--winsup/cygwin/poll.cc44
2 files changed, 37 insertions, 13 deletions
diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog
index 1351b5444..6bfb81b6d 100644
--- a/winsup/cygwin/ChangeLog
+++ b/winsup/cygwin/ChangeLog
@@ -1,3 +1,9 @@
+2002-11-20 Corinna Vinschen <corinna@vinschen.de>
+
+ * poll.cc (poll): Don't set POLLERR if a listening socket has a
+ pending connect. Don't use errno value from call to
+ fhandler_socket::recvfrom().
+
2002-11-19 Christopher Faylor <cgf@redhat.com>
* net.cc: Sprinkle sigframes throughout.
diff --git a/winsup/cygwin/poll.cc b/winsup/cygwin/poll.cc
index 3c61c565e..52c05dd50 100644
--- a/winsup/cygwin/poll.cc
+++ b/winsup/cygwin/poll.cc
@@ -8,12 +8,16 @@
Cygwin license. Please consult the file "CYGWIN_LICENSE" for
details. */
+#define __INSIDE_CYGWIN_NET__
+
#include "winsup.h"
#include <sys/time.h>
#include <sys/poll.h>
#include <sys/socket.h>
#include <errno.h>
#include <stdlib.h>
+#define USE_SYS_TYPES_FD_SET
+#include <winsock2.h>
#include "security.h"
#include "fhandler.h"
#include "path.h"
@@ -93,19 +97,33 @@ poll (struct pollfd *fds, unsigned int nfds, int timeout)
if (!sock)
fds[i].revents |= POLLIN;
else
- switch (sock->recvfrom (peek, sizeof (peek), MSG_PEEK,
- NULL, NULL))
- {
- case -1: /* Something weird happened */
- fds[i].revents |= POLLERR;
- break;
- case 0: /* Closed on the read side. */
- fds[i].revents |= POLLHUP;
- break;
- default:
- fds[i].revents |= POLLIN;
- break;
- }
+ {
+ /* The following action can change errno. We have to
+ reset it to it's old value. */
+ int old_errno = get_errno ();
+ switch (sock->recvfrom (peek, sizeof (peek), MSG_PEEK,
+ NULL, NULL))
+ {
+ case -1: /* Something weird happened */
+ /* When select returns that data is available,
+ that could mean that the socket is in
+ listen mode and a client tries to connect.
+ Unfortunately, recvfrom() doesn't make much
+ sense then. It returns WSAENOTCONN in that
+ case. Since that's not actually an error,
+ we must not set POLLERR. */
+ if (WSAGetLastError () != WSAENOTCONN)
+ fds[i].revents |= POLLERR;
+ break;
+ case 0: /* Closed on the read side. */
+ fds[i].revents |= POLLHUP;
+ break;
+ default:
+ fds[i].revents |= POLLIN;
+ break;
+ }
+ set_errno (old_errno);
+ }
}
if (FD_ISSET(fds[i].fd, write_fds))
fds[i].revents |= POLLOUT;