* fhandler_socket.cc (fhandler_socket::connect): Don't restrict
WSAEINVAL -> WSAEISCONN conversion to nonblocking sockets. (fhandler_socket::accept): Use event driven technique to implement interuptible accept. (fhandler_socket::wait): Allow FD_ACCEPT handling. * net.cc (cygwin_accept): Remove workaround for allowing blocking accept. That's entirely in fhandler_socket::accept now.
This commit is contained in:
@ -710,9 +710,9 @@ fhandler_socket::connect (const struct sockaddr *name, int namelen)
|
||||
|
||||
if (err == WSAEWOULDBLOCK)
|
||||
WSASetLastError (err = WSAEINPROGRESS);
|
||||
else if (err == WSAEINVAL)
|
||||
WSASetLastError (err = WSAEISCONN);
|
||||
}
|
||||
if (err == WSAEINVAL)
|
||||
WSASetLastError (err = WSAEISCONN);
|
||||
set_winsock_errno ();
|
||||
}
|
||||
|
||||
@ -779,7 +779,21 @@ fhandler_socket::accept (struct sockaddr *peer, int *len)
|
||||
if (len && ((unsigned) *len < sizeof (struct sockaddr_in)))
|
||||
*len = sizeof (struct sockaddr_in);
|
||||
|
||||
res = ::accept (get_socket (), peer, len);
|
||||
if (is_nonblocking ())
|
||||
res = ::accept (get_socket (), peer, len);
|
||||
else
|
||||
{
|
||||
HANDLE evt;
|
||||
if (prepare (evt, FD_ACCEPT))
|
||||
{
|
||||
res = wait (evt, 0, INFINITE);
|
||||
if (res != -1
|
||||
|| (WSAGetLastError () != WSAEINTR
|
||||
&& WSAGetLastError () != WSAEFAULT))
|
||||
res = ::accept (get_socket (), peer, len);
|
||||
release (evt);
|
||||
}
|
||||
}
|
||||
|
||||
if (res == (int) INVALID_SOCKET)
|
||||
set_winsock_errno ();
|
||||
@ -923,6 +937,13 @@ fhandler_socket::wait (HANDLE event, int flags, DWORD timeout)
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (evts.lNetworkEvents & FD_ACCEPT)
|
||||
{
|
||||
if (evts.iErrorCode[FD_ACCEPT_BIT])
|
||||
wsa_err = evts.iErrorCode[FD_ACCEPT_BIT];
|
||||
else
|
||||
ret = 0;
|
||||
}
|
||||
if (evts.lNetworkEvents & FD_CONNECT)
|
||||
{
|
||||
if (evts.iErrorCode[FD_CONNECT_BIT])
|
||||
|
Reference in New Issue
Block a user