From: Howard Chu Date: Thu, 10 Jan 2002 05:12:11 +0000 (+0000) Subject: For Windows, use getsockopt() to retrieve error if connect() fails. X-Git-Tag: LDBM_PRE_GIANT_RWLOCK~216 X-Git-Url: https://git.sur5r.net/?a=commitdiff_plain;h=627d354b9865c3b16996c2297762accdd8036e87;p=openldap For Windows, use getsockopt() to retrieve error if connect() fails. Don't use ldap_pvt_is_socket_ready() at all on Windows, it is totally unneeded and getpeername() misbehaves on W2K. --- diff --git a/libraries/libldap/os-ip.c b/libraries/libldap/os-ip.c index 0f7621df7d..d579eab021 100644 --- a/libraries/libldap/os-ip.c +++ b/libraries/libldap/os-ip.c @@ -130,6 +130,8 @@ ldap_int_prepare_socket(LDAP *ld, int s, int proto ) return 0; } +#ifndef HAVE_WINSOCK + #undef TRACE #define TRACE do { \ osip_debug(ld, \ @@ -174,9 +176,6 @@ ldap_pvt_is_socket_ready(LDAP *ld, int s) { /* XXX: needs to be replace with ber_stream_read() */ read(s, &ch, 1); -#ifdef HAVE_WINSOCK - ldap_pvt_set_errno( WSAGetLastError() ); -#endif TRACE; return -1; } @@ -187,6 +186,8 @@ ldap_pvt_is_socket_ready(LDAP *ld, int s) } #undef TRACE +#endif /* HAVE_WINSOCK */ + static int ldap_pvt_connect(LDAP *ld, ber_socket_t s, struct sockaddr *sin, socklen_t addrlen, @@ -262,15 +263,25 @@ ldap_pvt_connect(LDAP *ld, ber_socket_t s, #ifdef HAVE_WINSOCK /* This means the connection failed */ if ( FD_ISSET(s, &efds) ) { - ldap_pvt_set_errno(WSAECONNREFUSED); + int so_errno; + int dummy = sizeof(so_errno); + if ( getsockopt( s, SOL_SOCKET, SO_ERROR, &so_errno, &dummy ) + == AC_SOCKET_ERROR || !so_errno ) + { + /* impossible */ + so_errno = WSAGetLastError(); + } + ldap_pvt_set_errno(so_errno); osip_debug(ld, "ldap_pvt_connect: error on socket %d: " "errno: %d (%s)\n", s, errno, sock_errstr(errno)); return -1; } #endif if ( FD_ISSET(s, &wfds) ) { +#ifndef HAVE_WINSOCK if ( ldap_pvt_is_socket_ready(ld, s) == -1 ) return ( -1 ); +#endif if ( ldap_pvt_ndelay_off(ld, s) == -1 ) return ( -1 ); return ( 0 );