]> git.sur5r.net Git - openldap/blobdiff - libraries/libldap/os-ip.c
prepare for ldap_bv2dn()
[openldap] / libraries / libldap / os-ip.c
index 23935ad2af8b8c84802b14704e47e434f1b3c270..396873459726dee61288383c461611e62bd9487e 100644 (file)
@@ -1,6 +1,6 @@
 /* $OpenLDAP$ */
 /*
- * Copyright 1998-2000 The OpenLDAP Foundation, All Rights Reserved.
+ * Copyright 1998-2002 The OpenLDAP Foundation, All Rights Reserved.
  * COPYING RESTRICTIONS APPLY, see COPYRIGHT file
  */
 /*  Portions
@@ -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,
+                       (char *) &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 );