summaryrefslogtreecommitdiffstats
path: root/winsup/cygwin/fhandler_socket.cc
diff options
context:
space:
mode:
authorCorinna Vinschen <corinna@vinschen.de>2005-10-22 15:11:49 +0000
committerCorinna Vinschen <corinna@vinschen.de>2005-10-22 15:11:49 +0000
commit152a9caf58265c5a966f978df1ef4f8adbd2543c (patch)
treef2733a29ba624a502beada889712eeeda9891ad6 /winsup/cygwin/fhandler_socket.cc
parentecebee48383c7f6c287f6518e92b36a1372d8d2b (diff)
downloadcygnal-152a9caf58265c5a966f978df1ef4f8adbd2543c.tar.gz
cygnal-152a9caf58265c5a966f978df1ef4f8adbd2543c.tar.bz2
cygnal-152a9caf58265c5a966f978df1ef4f8adbd2543c.zip
* fhandler.h (class fhandler_socket): Add timeout parameter to wait()
method. * fhandler_socket.cc (fhandler_socket::connect): Use event driven technique (prepare/wait/release) to implement interuptible connect. (fhandler_socket::wait): Add timeout parameter. Allow FD_CONNECT handling. * net.cc (cygwin_connect): Remove braindead workaround for allowing blocking connect. That's entirely in fhandler_socket::connect now.
Diffstat (limited to 'winsup/cygwin/fhandler_socket.cc')
-rw-r--r--winsup/cygwin/fhandler_socket.cc28
1 files changed, 24 insertions, 4 deletions
diff --git a/winsup/cygwin/fhandler_socket.cc b/winsup/cygwin/fhandler_socket.cc
index 420eb627a..f9b913729 100644
--- a/winsup/cygwin/fhandler_socket.cc
+++ b/winsup/cygwin/fhandler_socket.cc
@@ -681,7 +681,20 @@ fhandler_socket::connect (const struct sockaddr *name, int namelen)
return -1;
}
- res = ::connect (get_socket (), (struct sockaddr *) &sin, namelen);
+ if (is_nonblocking ())
+ res = ::connect (get_socket (), (struct sockaddr *) &sin, namelen);
+ else
+ {
+ HANDLE evt;
+ if (prepare (evt, FD_CONNECT))
+ {
+ res = ::connect (get_socket (), (struct sockaddr *) &sin, namelen);
+ if (res == SOCKET_ERROR
+ && WSAGetLastError () == WSAEWOULDBLOCK)
+ res = wait (evt, 0, INFINITE);
+ release (evt);
+ }
+ }
if (!res)
err = 0;
@@ -877,14 +890,14 @@ fhandler_socket::prepare (HANDLE &event, long event_mask)
}
int
-fhandler_socket::wait (HANDLE event, int flags)
+fhandler_socket::wait (HANDLE event, int flags, DWORD timeout)
{
int ret = SOCKET_ERROR;
int wsa_err = 0;
WSAEVENT ev[2] = { event, signal_arrived };
WSANETWORKEVENTS evts;
- switch (WSAWaitForMultipleEvents (2, ev, FALSE, 10, FALSE))
+ switch (WSAWaitForMultipleEvents (2, ev, FALSE, timeout, FALSE))
{
case WSA_WAIT_TIMEOUT:
ret = 0;
@@ -910,7 +923,14 @@ fhandler_socket::wait (HANDLE event, int flags)
break;
}
}
- if (evts.lNetworkEvents & FD_READ)
+ if (evts.lNetworkEvents & FD_CONNECT)
+ {
+ if (evts.iErrorCode[FD_CONNECT_BIT])
+ wsa_err = evts.iErrorCode[FD_CONNECT_BIT];
+ else
+ ret = 0;
+ }
+ else if (evts.lNetworkEvents & FD_READ)
{
if (evts.iErrorCode[FD_READ_BIT])
wsa_err = evts.iErrorCode[FD_READ_BIT];