Diff for /libraries/libldap/result.c between versions 1.99.2.16 and 1.99.2.25

version 1.99.2.16, 2006/08/17 02:43:58 version 1.99.2.25, 2008/07/07 16:52:30
Line 1 Line 1
 /* result.c - wait for an ldap result */  /* result.c - wait for an ldap result */
 /* $OpenLDAP: pkg/ldap/libraries/libldap/result.c,v 1.99.2.15 2006/04/03 19:49:54 kurt Exp $ */  /* $OpenLDAP: pkg/ldap/libraries/libldap/result.c,v 1.99.2.24 2008/02/11 23:24:12 kurt Exp $ */
 /* This work is part of OpenLDAP Software <http://www.openldap.org/>.  /* This work is part of OpenLDAP Software <http://www.openldap.org/>.
  *   *
  * Copyright 1998-2006 The OpenLDAP Foundation.   * Copyright 1998-2008 The OpenLDAP Foundation.
  * All rights reserved.   * All rights reserved.
  *   *
  * Redistribution and use in source and binary forms, with or without   * Redistribution and use in source and binary forms, with or without
Line 296  wait4msg( Line 296  wait4msg(
 #endif  #endif
   
                         if ( !lc_ready ) {                          if ( !lc_ready ) {
                                   int err;
                                 rc = ldap_int_select( ld, tvp );                                  rc = ldap_int_select( ld, tvp );
 #ifdef LDAP_DEBUG  
                                 if ( rc == -1 ) {                                  if ( rc == -1 ) {
                                           err = sock_errno();
   #ifdef LDAP_DEBUG
                                         Debug( LDAP_DEBUG_TRACE,                                          Debug( LDAP_DEBUG_TRACE,
                                                 "ldap_int_select returned -1: errno %d\n",                                                  "ldap_int_select returned -1: errno %d\n",
                                                 errno, 0, 0 );                                                  err, 0, 0 );
                                 }  
 #endif  #endif
                                   }
   
                                 if ( rc == 0 || ( rc == -1 && (                                  if ( rc == 0 || ( rc == -1 && (
                                         !LDAP_BOOL_GET(&ld->ld_options, LDAP_BOOL_RESTART)                                          !LDAP_BOOL_GET(&ld->ld_options, LDAP_BOOL_RESTART)
                                                 || errno != EINTR )))                                                  || err != EINTR )))
                                 {                                  {
                                         ld->ld_errno = (rc == -1 ? LDAP_SERVER_DOWN :                                          ld->ld_errno = (rc == -1 ? LDAP_SERVER_DOWN :
                                                 LDAP_TIMEOUT);                                                  LDAP_TIMEOUT);
Line 333  wait4msg( Line 335  wait4msg(
                                         ldap_pvt_thread_mutex_lock( &ld->ld_conn_mutex );                                          ldap_pvt_thread_mutex_lock( &ld->ld_conn_mutex );
 #endif  #endif
                                         for ( lc = ld->ld_conns;                                          for ( lc = ld->ld_conns;
                                                 rc == LDAP_MSG_X_KEEP_LOOKING && lc != NULL;                                                  rc == LDAP_MSG_X_KEEP_LOOKING && lc != NULL; )
                                                 lc = lc->lconn_next )  
                                         {                                          {
                                                 if ( lc->lconn_status == LDAP_CONNST_CONNECTED &&                                                  if ( lc->lconn_status == LDAP_CONNST_CONNECTED &&
                                                         ldap_is_read_ready( ld, lc->lconn_sb ))                                                          ldap_is_read_ready( ld, lc->lconn_sb ))
Line 353  wait4msg( Line 354  wait4msg(
                                                                  * sane; better restart                                                                   * sane; better restart
                                                                  * (ITS#4405) */                                                                   * (ITS#4405) */
                                                                 lc = ld->ld_conns;                                                                  lc = ld->ld_conns;
   
                                                                   /* don't get to next conn! */
                                                                   break;
                                                         }                                                          }
                                                 }                                                  }
   
                                                   /* next conn */
                                                   lc = lc->lconn_next;
                                         }                                          }
 #ifdef LDAP_R_COMPILE  #ifdef LDAP_R_COMPILE
                                         ldap_pvt_thread_mutex_unlock( &ld->ld_conn_mutex );                                          ldap_pvt_thread_mutex_unlock( &ld->ld_conn_mutex );
Line 364  wait4msg( Line 371  wait4msg(
                 }                  }
   
                 if ( rc == LDAP_MSG_X_KEEP_LOOKING && tvp != NULL ) {                  if ( rc == LDAP_MSG_X_KEEP_LOOKING && tvp != NULL ) {
                           time_t  delta_time;
   
                         tmp_time = time( NULL );                          tmp_time = time( NULL );
                         tv0.tv_sec -= ( tmp_time - start_time );                          delta_time = tmp_time - start_time;
                         if ( tv0.tv_sec <= 0 ) {  
                           /* do not assume time_t is signed */
                           if ( tv0.tv_sec <= delta_time ) {
                                 rc = 0; /* timed out */                                  rc = 0; /* timed out */
                                 ld->ld_errno = LDAP_TIMEOUT;                                  ld->ld_errno = LDAP_TIMEOUT;
                                 break;                                  break;
                         }                          }
                           tv0.tv_sec -= delta_time;
                         tv.tv_sec = tv0.tv_sec;                          tv.tv_sec = tv0.tv_sec;
   
                         Debug( LDAP_DEBUG_TRACE, "wait4msg ld %p %ld secs to go\n",                          Debug( LDAP_DEBUG_TRACE, "wait4msg ld %p %ld secs to go\n",
Line 400  try_read1msg( Line 412  try_read1msg(
         LDAPRequest     *lr, *tmplr;          LDAPRequest     *lr, *tmplr;
         LDAPConn        *lc;          LDAPConn        *lc;
         BerElement      tmpber;          BerElement      tmpber;
         int             rc, refer_cnt, hadref, simple_request;          int             rc, refer_cnt, hadref, simple_request, err;
         ber_int_t       lderr;          ber_int_t       lderr;
   
 #ifdef LDAP_CONNECTIONLESS  #ifdef LDAP_CONNECTIONLESS
Line 440  retry: Line 452  retry:
         assert( LBER_VALID (ber) );          assert( LBER_VALID (ber) );
   
         /* get the next message */          /* get the next message */
         errno = 0;          sock_errset(0);
 #ifdef LDAP_CONNECTIONLESS  #ifdef LDAP_CONNECTIONLESS
         if ( LDAP_IS_UDP(ld) ) {          if ( LDAP_IS_UDP(ld) ) {
                 struct sockaddr from;                  struct sockaddr from;
Line 459  nextresp3: Line 471  nextresp3:
         }          }
         if ( tag != LDAP_TAG_MESSAGE ) {          if ( tag != LDAP_TAG_MESSAGE ) {
                 if ( tag == LBER_DEFAULT) {                  if ( tag == LBER_DEFAULT) {
                           err = sock_errno();
 #ifdef LDAP_DEBUG                    #ifdef LDAP_DEBUG                  
                         Debug( LDAP_DEBUG_CONNS,                          Debug( LDAP_DEBUG_CONNS,
                                 "ber_get_next failed.\n", 0, 0, 0 );                                  "ber_get_next failed.\n", 0, 0, 0 );
 #endif               #endif
 #ifdef EWOULDBLOCK                        #ifdef EWOULDBLOCK                      
                         if (errno==EWOULDBLOCK) return LDAP_MSG_X_KEEP_LOOKING;                          if ( err == EWOULDBLOCK ) return LDAP_MSG_X_KEEP_LOOKING;
 #endif  #endif
 #ifdef EAGAIN  #ifdef EAGAIN
                         if (errno == EAGAIN) return LDAP_MSG_X_KEEP_LOOKING;                          if ( err == EAGAIN ) return LDAP_MSG_X_KEEP_LOOKING;
 #endif  #endif
                         ld->ld_errno = LDAP_SERVER_DOWN;                          ld->ld_errno = LDAP_SERVER_DOWN;
                         return -1;                          return -1;
Line 561  nextresp2: Line 574  nextresp2:
                                                                 lr->lr_msgid, 0, 0);                                                                  lr->lr_msgid, 0, 0);
                                                 }                                                  }
   
                                                 /* We sucessfully chased the reference */                                                  /* We successfully chased the reference */
                                                 v3ref = V3REF_SUCCESS;                                                  v3ref = V3REF_SUCCESS;
                                         }                                          }
                                 }                                  }
Line 607  nextresp2: Line 620  nextresp2:
                                         if( LDAP_BOOL_GET(&ld->ld_options, LDAP_BOOL_REFERRALS)                                          if( LDAP_BOOL_GET(&ld->ld_options, LDAP_BOOL_REFERRALS)
                                                          || (lr->lr_parent != NULL) )                                                           || (lr->lr_parent != NULL) )
                                         {                                          {
                                                 /* Assume referral not chased and return it to app */  
                                                 v3ref = V3REF_TOAPP;  
   
                                                 /* Get the referral list */                                                  /* Get the referral list */
                                                 if( ber_scanf( &tmpber, "{v}", &refs) == LBER_ERROR) {                                                  if( ber_scanf( &tmpber, "{v}", &refs) == LBER_ERROR) {
                                                         rc = LDAP_DECODING_ERROR;                                                          rc = LDAP_DECODING_ERROR;
Line 625  nextresp2: Line 635  nextresp2:
                                                             0, &lr->lr_res_error, &hadref );                                                              0, &lr->lr_res_error, &hadref );
                                                         lr->lr_status = LDAP_REQST_COMPLETED;                                                          lr->lr_status = LDAP_REQST_COMPLETED;
                                                         Debug( LDAP_DEBUG_TRACE,                                                          Debug( LDAP_DEBUG_TRACE,
                                                                 "read1msg: referral chased, mark request completed, ld %p msgid %d\n",                                                                  "read1msg: referral %s chased, "
                                                                 (void *)ld, lr->lr_msgid, 0);                                                                  "mark request completed, ld %p msgid %d\n",
                                                                   hadref ? "" : "not",
                                                                   (void *)ld, lr->lr_msgid);
                                                         if( refer_cnt > 0) {                                                          if( refer_cnt > 0) {
                                                                 /* Referral successfully chased */                                                                  /* Referral successfully chased */
                                                                 v3ref = V3REF_SUCCESS;                                                                  v3ref = V3REF_SUCCESS;
                                                           } else {
                                                                   refer_cnt = 0;
                                                         }                                                          }
                                                 }                                                  }
                                         }                                          }
Line 651  nextresp2: Line 665  nextresp2:
          * go through the following code.  This code also chases V2 referrals           * go through the following code.  This code also chases V2 referrals
          * and checks if all referrals have been chased.           * and checks if all referrals have been chased.
          */           */
         if ( (tag != LDAP_RES_SEARCH_ENTRY) && (v3ref != V3REF_TOAPP) &&          if ( tag != LDAP_RES_SEARCH_ENTRY &&
                 (tag != LDAP_RES_INTERMEDIATE ))                  tag != LDAP_RES_SEARCH_REFERENCE &&
                   tag != LDAP_RES_INTERMEDIATE )
         {          {
                 /* For a v3 search referral/reference, only come here if already chased it */                  /* For a v3 search referral/reference, only come here if already chased it */
                 if ( ld->ld_version >= LDAP_VERSION2 &&                  if ( ld->ld_version >= LDAP_VERSION2 &&
                           v3ref != V3REF_TOAPP &&
                         ( lr->lr_parent != NULL ||                          ( lr->lr_parent != NULL ||
                         LDAP_BOOL_GET(&ld->ld_options, LDAP_BOOL_REFERRALS) ) )                          LDAP_BOOL_GET(&ld->ld_options, LDAP_BOOL_REFERRALS) ) )
                 {                  {

Removed from v.1.99.2.16  
changed lines
  Added in v.1.99.2.25


______________
© Copyright 1998-2020, OpenLDAP Foundation, info@OpenLDAP.org