diff options
author | Corinna Vinschen <corinna@vinschen.de> | 2005-10-22 15:11:49 +0000 |
---|---|---|
committer | Corinna Vinschen <corinna@vinschen.de> | 2005-10-22 15:11:49 +0000 |
commit | 152a9caf58265c5a966f978df1ef4f8adbd2543c (patch) | |
tree | f2733a29ba624a502beada889712eeeda9891ad6 /winsup/cygwin/fhandler_socket.cc | |
parent | ecebee48383c7f6c287f6518e92b36a1372d8d2b (diff) | |
download | cygnal-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.cc | 28 |
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]; |