X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=libraries%2Flibldap%2Fos-ip.c;h=4b7de9e690f362c5b72c7c56b3a777f6d315e48a;hb=de01a6e3d791d3458549d2ceeccf4d7e0477ff78;hp=e6a140a9d0acd91163915aab9677da64b263b5a2;hpb=9ece06c8f565f8df9e61685d56a5fc6e4a066d01;p=openldap diff --git a/libraries/libldap/os-ip.c b/libraries/libldap/os-ip.c index e6a140a9d0..4b7de9e690 100644 --- a/libraries/libldap/os-ip.c +++ b/libraries/libldap/os-ip.c @@ -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; }