diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog index 1588f3628..94ec37845 100644 --- a/winsup/cygwin/ChangeLog +++ b/winsup/cygwin/ChangeLog @@ -1,3 +1,9 @@ +2003-06-07 Thomas Pfaff + + * fhandler_socket.cc (fhandler_socket::connect): Change error + handling for nonblocking connects to return EALREADY when + connect is called more than once for the same socket. + 2003-06-06 Corinna Vinschen * cygwin.din: Add vsyslog. diff --git a/winsup/cygwin/fhandler_socket.cc b/winsup/cygwin/fhandler_socket.cc index 894e980e6..3dd8d6762 100644 --- a/winsup/cygwin/fhandler_socket.cc +++ b/winsup/cygwin/fhandler_socket.cc @@ -502,6 +502,7 @@ fhandler_socket::connect (const struct sockaddr *name, int namelen) BOOL in_progress = FALSE; sockaddr_in sin; int secret [4]; + DWORD err; if (!get_inet_addr (name, namelen, &sin, &namelen, secret)) return -1; @@ -514,12 +515,12 @@ fhandler_socket::connect (const struct sockaddr *name, int namelen) when called on a non-blocking socket. */ if (is_nonblocking () || is_connect_pending ()) { - DWORD err = WSAGetLastError (); + err = WSAGetLastError (); if (err == WSAEWOULDBLOCK || err == WSAEALREADY) - { - WSASetLastError (WSAEINPROGRESS); - in_progress = TRUE; - } + in_progress = TRUE; + + if (err == WSAEWOULDBLOCK) + WSASetLastError (WSAEINPROGRESS); else if (err == WSAEINVAL) WSASetLastError (WSAEISCONN); } @@ -556,7 +557,8 @@ fhandler_socket::connect (const struct sockaddr *name, int namelen) } } - if (WSAGetLastError () == WSAEINPROGRESS) + err = WSAGetLastError (); + if (err == WSAEINPROGRESS || err == WSAEALREADY) set_connect_state (CONNECT_PENDING); else set_connect_state (CONNECTED);