]> git.sur5r.net Git - openldap/commitdiff
For Windows, use getsockopt() to retrieve error if connect() fails.
authorHoward Chu <hyc@openldap.org>
Thu, 10 Jan 2002 05:12:11 +0000 (05:12 +0000)
committerHoward Chu <hyc@openldap.org>
Thu, 10 Jan 2002 05:12:11 +0000 (05:12 +0000)
Don't use ldap_pvt_is_socket_ready() at all on Windows, it is
totally unneeded and getpeername() misbehaves on W2K.

libraries/libldap/os-ip.c

index 0f7621df7de90859fbcd031538a142437d8d06d6..d579eab02157a00f4eedee3831ae6ff34ae503d6 100644 (file)
@@ -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 );