* 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:
Corinna Vinschen
2005-10-22 16:02:15 +00:00
parent 152a9caf58
commit c2c020d1fb
3 changed files with 35 additions and 16 deletions

View File

@ -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])