Welcome to mirror list, hosted at ThFree Co, Russian Federation.

cygwin.com/git/newlib-cygwin.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCorinna Vinschen <corinna@vinschen.de>2005-10-22 20:02:15 +0400
committerCorinna Vinschen <corinna@vinschen.de>2005-10-22 20:02:15 +0400
commitc2c020d1fb082baff8dfd2f2ca93c66bf7151bd0 (patch)
tree8f5d7adb2cb402b5131cee69dd0a34049e75002f /winsup/cygwin/fhandler_socket.cc
parent152a9caf58265c5a966f978df1ef4f8adbd2543c (diff)
* 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.cc27
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])