--- result.c.orig 2007-05-14 09:44:27.000000000 -0400 +++ result.c 2007-05-14 15:27:53.000000000 -0400 @@ -263,9 +263,10 @@ int rc; struct timeval tv = { 0 }, tv0 = { 0 }, + start_time_tv = { 0 }, + tmp_time_tv = { 0 }, + delta_time_tv = { 0 }, *tvp; - time_t start_time = 0; - time_t tmp_time; LDAPConn *lc; assert( ld != NULL ); @@ -296,7 +297,7 @@ tv0 = *timeout; tv = *timeout; tvp = &tv; - start_time = time( NULL ); + gettimeofday(&start_time_tv, NULL); } rc = LDAP_MSG_X_KEEP_LOOKING; @@ -423,23 +424,41 @@ } if ( rc == LDAP_MSG_X_KEEP_LOOKING && tvp != NULL ) { - time_t delta_time; + /* tmp_time = now */ + gettimeofday(&tmp_time_tv, NULL); - tmp_time = time( NULL ); - delta_time = tmp_time - start_time; - - /* do not assume time_t is signed */ - if ( tv0.tv_sec <= delta_time ) { - rc = 0; /* timed out */ + /* delta_time = tmp_time - start_time */ + delta_time_tv.tv_sec = tmp_time_tv.tv_sec - start_time_tv.tv_sec; + delta_time_tv.tv_usec = tmp_time_tv.tv_usec - start_time_tv.tv_usec; + if ( delta_time_tv.tv_usec < 0 ) { + delta_time_tv.tv_sec--; + delta_time_tv.tv_usec += 1000000; + } + + /* tv0 < delta_time ? */ + if ( (tv0.tv_sec < delta_time_tv.tv_sec) || + ((tv0.tv_sec == delta_time_tv.tv_sec) && (tv0.tv_usec < delta_time_tv.tv_usec)) ) { + rc = 0; /* timed out */ ld->ld_errno = LDAP_TIMEOUT; break; } - tv0.tv_sec -= delta_time; + + /* tv0 -= delta_time */ + tv0.tv_sec -= delta_time_tv.tv_sec; + tv0.tv_usec -= delta_time_tv.tv_usec; + if ( tv0.tv_usec < 0 ) { + tv0.tv_sec--; + tv0.tv_usec += 1000000; + } + tv.tv_sec = tv0.tv_sec; + tv.tv_usec = tv0.tv_usec; + + Debug( LDAP_DEBUG_TRACE, "wait4msg ld %p %ld secs %ld usecs to go\n", + (void *)ld, (long) tv.tv_sec, (long) tv.tv_usec ); - Debug( LDAP_DEBUG_TRACE, "wait4msg ld %p %ld secs to go\n", - (void *)ld, (long) tv.tv_sec, 0 ); - start_time = tmp_time; + start_time_tv.tv_sec = tmp_time_tv.tv_sec; + start_time_tv.tv_usec = tmp_time_tv.tv_usec; } }