* 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().
This commit is contained in:
Corinna Vinschen 2002-11-20 08:03:50 +00:00
parent ec97538aa2
commit 03b65245db
2 changed files with 37 additions and 13 deletions

View File

@ -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> 2002-11-19 Christopher Faylor <cgf@redhat.com>
* net.cc: Sprinkle sigframes throughout. * net.cc: Sprinkle sigframes throughout.

View File

@ -8,12 +8,16 @@
Cygwin license. Please consult the file "CYGWIN_LICENSE" for Cygwin license. Please consult the file "CYGWIN_LICENSE" for
details. */ details. */
#define __INSIDE_CYGWIN_NET__
#include "winsup.h" #include "winsup.h"
#include <sys/time.h> #include <sys/time.h>
#include <sys/poll.h> #include <sys/poll.h>
#include <sys/socket.h> #include <sys/socket.h>
#include <errno.h> #include <errno.h>
#include <stdlib.h> #include <stdlib.h>
#define USE_SYS_TYPES_FD_SET
#include <winsock2.h>
#include "security.h" #include "security.h"
#include "fhandler.h" #include "fhandler.h"
#include "path.h" #include "path.h"
@ -93,19 +97,33 @@ poll (struct pollfd *fds, unsigned int nfds, int timeout)
if (!sock) if (!sock)
fds[i].revents |= POLLIN; fds[i].revents |= POLLIN;
else else
switch (sock->recvfrom (peek, sizeof (peek), MSG_PEEK, {
NULL, NULL)) /* The following action can change errno. We have to
{ reset it to it's old value. */
case -1: /* Something weird happened */ int old_errno = get_errno ();
fds[i].revents |= POLLERR; switch (sock->recvfrom (peek, sizeof (peek), MSG_PEEK,
break; NULL, NULL))
case 0: /* Closed on the read side. */ {
fds[i].revents |= POLLHUP; case -1: /* Something weird happened */
break; /* When select returns that data is available,
default: that could mean that the socket is in
fds[i].revents |= POLLIN; listen mode and a client tries to connect.
break; 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)) if (FD_ISSET(fds[i].fd, write_fds))
fds[i].revents |= POLLOUT; fds[i].revents |= POLLOUT;