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);
#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 );
#ifdef HAVE_WINSOCK
fd_set efds;
#endif
+ struct timeval tv = { 0 };
#if defined( FD_SETSIZE ) && !defined( HAVE_WINSOCK )
if ( s >= FD_SETSIZE ) {
}
#endif
+ if ( tvp != NULL ) {
+ tv = *tvp;
+ }
+
do {
FD_ZERO(&wfds);
FD_SET(s, &wfds );
return rc;
}
- if ( timeout == 0 && rc == 0 ) {
+ if ( rc == 0 && tvp && tvp->tv_sec == 0 && tvp->tv_usec == 0 ) {
return -2;
}
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
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",
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;
}