summaryrefslogtreecommitdiffstats
path: root/winsup/cygwin/fhandler_socket.cc
diff options
context:
space:
mode:
authorCorinna Vinschen <corinna@vinschen.de>2014-06-16 13:01:40 +0000
committerCorinna Vinschen <corinna@vinschen.de>2014-06-16 13:01:40 +0000
commitd510072c834371e39bcf61e0d6e9128562eb8a34 (patch)
tree5f865c9981e6c6c06b8999e6405a09c143f4bad3 /winsup/cygwin/fhandler_socket.cc
parent6681d11fd3464c7ba9a74e7f594dcbd3eb96688a (diff)
downloadcygnal-d510072c834371e39bcf61e0d6e9128562eb8a34.tar.gz
cygnal-d510072c834371e39bcf61e0d6e9128562eb8a34.tar.bz2
cygnal-d510072c834371e39bcf61e0d6e9128562eb8a34.zip
* fhandler_socket.cc (fhandler_socket::evaluate_events): Call
WSASetLastError after setsockopt. Explain why.
Diffstat (limited to 'winsup/cygwin/fhandler_socket.cc')
-rw-r--r--winsup/cygwin/fhandler_socket.cc8
1 files changed, 6 insertions, 2 deletions
diff --git a/winsup/cygwin/fhandler_socket.cc b/winsup/cygwin/fhandler_socket.cc
index d4602be8a..2c3c75c91 100644
--- a/winsup/cygwin/fhandler_socket.cc
+++ b/winsup/cygwin/fhandler_socket.cc
@@ -633,7 +633,6 @@ fhandler_socket::evaluate_events (const long event_mask, long &events,
int wsa_err = 0;
if ((wsa_err = wsock_events->connect_errorcode) != 0)
{
- WSASetLastError (wsa_err);
/* CV 2014-04-23: This is really weird. If you call connect
asynchronously on a socket and then select, an error like
"Connection refused" is set in the event and in the SO_ERROR
@@ -642,9 +641,14 @@ fhandler_socket::evaluate_events (const long event_mask, long &events,
option, even if the dup'ed socket handle refers to the same
socket. We're trying to workaround this problem here by
taking the connect errorcode from the event and write it back
- into the SO_ERROR socket option. */
+ into the SO_ERROR socket option.
+
+ CV 2014-06-16: Call WSASetLastError *after* setsockopt since,
+ apparently, setsockopt sets the last WSA error code to 0 on
+ success. */
setsockopt (get_socket (), SOL_SOCKET, SO_ERROR,
(const char *) &wsa_err, sizeof wsa_err);
+ WSASetLastError (wsa_err);
ret = SOCKET_ERROR;
}
else