summaryrefslogtreecommitdiffstats
path: root/winsup/cygwin/fhandler_socket.cc
diff options
context:
space:
mode:
authorCorinna Vinschen <corinna@vinschen.de>2005-04-18 18:56:52 +0000
committerCorinna Vinschen <corinna@vinschen.de>2005-04-18 18:56:52 +0000
commit04843bf4a05314c57cf2036917a0e52d95b79ade (patch)
treebbca4a0ea3133a0d6fbee71d9ff7e6057e2ee8d0 /winsup/cygwin/fhandler_socket.cc
parent2180b9627dbb4ef05b6205b678b36376511967e6 (diff)
downloadcygnal-04843bf4a05314c57cf2036917a0e52d95b79ade.tar.gz
cygnal-04843bf4a05314c57cf2036917a0e52d95b79ade.tar.bz2
cygnal-04843bf4a05314c57cf2036917a0e52d95b79ade.zip
* fhandler.h (enum conn_state): Add connect_failed state.
* fhandler_socket.cc (fhandler_socket::connect): Set connect_state to connect_failed when connect failed. * poll.cc (poll): Change errno to EINVAL if allocating memory fails, according to SUSv3. Add socket descriptors always to except_fds. Test for failed connect and set revents flags appropriately. * select.cc (set_bits): Set connect_state to connect_failed when select indicates failed nonblocking connect. (fhandler_dev_null::select_except): Set except_ready to false so that /dev/null is not always in except state. (peek_socket): Fix bogus conditional. (fhandler_socket::select_write): Treat all connect_states except unconnected equivalent to return consistent results. (fhandler_windows::select_except): Set except_ready to false so that /dev/windows is not always in except state.
Diffstat (limited to 'winsup/cygwin/fhandler_socket.cc')
-rw-r--r--winsup/cygwin/fhandler_socket.cc4
1 files changed, 3 insertions, 1 deletions
diff --git a/winsup/cygwin/fhandler_socket.cc b/winsup/cygwin/fhandler_socket.cc
index aa412081e..7c7e2daf8 100644
--- a/winsup/cygwin/fhandler_socket.cc
+++ b/winsup/cygwin/fhandler_socket.cc
@@ -706,7 +706,7 @@ fhandler_socket::connect (const struct sockaddr *name, int namelen)
err = WSAGetLastError ();
/* Special handling for connect to return the correct error code
when called on a non-blocking socket. */
- if (is_nonblocking () || connect_state () == connect_pending)
+ if (is_nonblocking ())
{
if (err == WSAEWOULDBLOCK || err == WSAEALREADY)
in_progress = true;
@@ -736,6 +736,8 @@ fhandler_socket::connect (const struct sockaddr *name, int namelen)
if (err == WSAEINPROGRESS || err == WSAEALREADY)
connect_state (connect_pending);
+ else if (err)
+ connect_state (connect_failed);
else
connect_state (connected);