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