diff options
author | Corinna Vinschen <corinna@vinschen.de> | 2005-10-22 16:02:15 +0000 |
---|---|---|
committer | Corinna Vinschen <corinna@vinschen.de> | 2005-10-22 16:02:15 +0000 |
commit | c2c020d1fb082baff8dfd2f2ca93c66bf7151bd0 (patch) | |
tree | 8f5d7adb2cb402b5131cee69dd0a34049e75002f /winsup/cygwin/fhandler_socket.cc | |
parent | 152a9caf58265c5a966f978df1ef4f8adbd2543c (diff) | |
download | cygnal-c2c020d1fb082baff8dfd2f2ca93c66bf7151bd0.tar.gz cygnal-c2c020d1fb082baff8dfd2f2ca93c66bf7151bd0.tar.bz2 cygnal-c2c020d1fb082baff8dfd2f2ca93c66bf7151bd0.zip |
* 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.
Diffstat (limited to 'winsup/cygwin/fhandler_socket.cc')
-rw-r--r-- | winsup/cygwin/fhandler_socket.cc | 27 |
1 files changed, 24 insertions, 3 deletions
diff --git a/winsup/cygwin/fhandler_socket.cc b/winsup/cygwin/fhandler_socket.cc index f9b913729..79b59ff9b 100644 --- a/winsup/cygwin/fhandler_socket.cc +++ b/winsup/cygwin/fhandler_socket.cc @@ -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]) |