]> git.sur5r.net Git - openldap/blobdiff - libraries/libldap/os-ip.c
ITS#4844 add missing overlays
[openldap] / libraries / libldap / os-ip.c
index e6a140a9d0acd91163915aab9677da64b263b5a2..4b7de9e690f362c5b72c7c56b3a777f6d315e48a 100644 (file)
@@ -221,14 +221,8 @@ ldap_int_poll(
        ber_socket_t s,
        struct timeval *tvp )
 {
-       int             timeout = INFTIM;
-       struct timeval  tv = { 0 };
        int             rc;
                
-       if ( tvp != NULL ) {
-               tv = *tvp;
-               timeout = TV2MILLISEC( tvp );
-       }
 
        osip_debug(ld, "ldap_int_poll: fd: %d tm: %ld\n",
                s, tvp ? tvp->tv_sec : -1L, 0);
@@ -236,10 +230,14 @@ ldap_int_poll(
 #ifdef HAVE_POLL
        {
                struct pollfd fd;
+               int timeout = INFTIM;
 
                fd.fd = s;
                fd.events = POLL_WRITE;
 
+               if ( tvp != NULL ) {
+                       timeout = TV2MILLISEC( tvp );
+               }
                do {
                        fd.revents = 0;
                        rc = poll( &fd, 1, timeout );
@@ -272,6 +270,7 @@ ldap_int_poll(
 #ifdef HAVE_WINSOCK
                fd_set          efds;
 #endif
+               struct timeval  tv = { 0 };
 
 #if defined( FD_SETSIZE ) && !defined( HAVE_WINSOCK )
                if ( s >= FD_SETSIZE ) {
@@ -282,6 +281,10 @@ ldap_int_poll(
                }
 #endif
 
+               if ( tvp != NULL ) {
+                       tv = *tvp;
+               }
+
                do {
                        FD_ZERO(&wfds);
                        FD_SET(s, &wfds );
@@ -305,7 +308,7 @@ ldap_int_poll(
                        return rc;
                }
 
-               if ( timeout == 0 && rc == 0 ) {
+               if ( rc == 0 && tvp && tvp->tv_sec == 0 && tvp->tv_usec == 0 ) {
                        return -2;
                }
 
@@ -351,8 +354,7 @@ ldap_pvt_connect(LDAP *ld, ber_socket_t s,
        int async)
 {
        int rc, err;
-       struct timeval  tv = { 0 },
-                       *opt_tv = NULL;
+       struct timeval  tv, *opt_tv = NULL;
 
 #ifdef LDAP_CONNECTIONLESS
        /* We could do a connect() but that would interfere with
@@ -366,9 +368,9 @@ ldap_pvt_connect(LDAP *ld, ber_socket_t s,
                return ( 0 );
        }
 #endif
-       opt_tv = ld->ld_options.ldo_tm_net;
-       if ( opt_tv != NULL ) {
-               tv = *opt_tv;
+       if ( ld->ld_options.ldo_tm_net.tv_sec >= 0 ) {
+               tv = ld->ld_options.ldo_tm_net;
+               opt_tv = &tv;
        }
 
        osip_debug(ld, "ldap_pvt_connect: fd: %d tm: %ld async: %d\n",
@@ -395,98 +397,8 @@ ldap_pvt_connect(LDAP *ld, ber_socket_t s,
 
        rc = ldap_int_poll( ld, s, opt_tv );
 
-#if 0
-#ifdef HAVE_POLL
-       {
-               struct pollfd fd;
-               int timeout = INFTIM;
-
-               if( opt_tv != NULL ) timeout = TV2MILLISEC( &tv );
-
-               fd.fd = s;
-               fd.events = POLL_WRITE;
-
-               do {
-                       fd.revents = 0;
-                       rc = poll( &fd, 1, timeout );
-               } while( rc == AC_SOCKET_ERROR && errno == EINTR &&
-                       LDAP_BOOL_GET(&ld->ld_options, LDAP_BOOL_RESTART ));
-
-               if( rc == AC_SOCKET_ERROR ) return rc;
-
-               if( fd.revents & POLL_WRITE ) {
-                       if ( ldap_pvt_is_socket_ready(ld, s) == -1 ) return -1;
-                       if ( ldap_pvt_ndelay_off(ld, s) == -1 ) return -1;
-                       return ( 0 );
-               }
-       }
-#else
-       {
-               fd_set          wfds, *z=NULL;
-#ifdef HAVE_WINSOCK
-               fd_set          efds;
-#endif
-
-#if defined( FD_SETSIZE ) && !defined( HAVE_WINSOCK )
-               if ( s >= FD_SETSIZE ) {
-                       rc = AC_SOCKET_ERROR;
-                       tcp_close( s );
-                       ldap_pvt_set_errno( EMFILE );
-                       return rc;
-               }
-#endif
-
-               do {
-                       FD_ZERO(&wfds);
-                       FD_SET(s, &wfds );
-
-#ifdef HAVE_WINSOCK
-                       FD_ZERO(&efds);
-                       FD_SET(s, &efds );
-#endif
-
-                       rc = select(ldap_int_tblsize, z, &wfds,
-#ifdef HAVE_WINSOCK
-                               &efds,
-#else
-                               z,
-#endif
-                               opt_tv ? &tv : NULL);
-               } while( rc == AC_SOCKET_ERROR && errno == EINTR &&
-                       LDAP_BOOL_GET(&ld->ld_options, LDAP_BOOL_RESTART ));
-
-               if( rc == AC_SOCKET_ERROR ) return rc;
-
-#ifdef HAVE_WINSOCK
-               /* This means the connection failed */
-               if ( FD_ISSET(s, &efds) ) {
-                   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;
-               }
-       }
-#endif
-
-#endif
-
        osip_debug(ld, "ldap_pvt_connect: %d\n", rc, 0, 0);
+
        return rc;
 }