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 + + * 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 * 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 #include #include #include #include +#define USE_SYS_TYPES_FD_SET +#include #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;