Diff for /libraries/libldap/result.c between versions 1.84 and 1.84.2.10

version 1.84, 2003/02/28 12:41:53 version 1.84.2.10, 2005/01/31 15:53:39
Line 1 Line 1
 /* $OpenLDAP: pkg/ldap/libraries/libldap/result.c,v 1.83 2003/02/28 11:57:28 hyc Exp $ */  /* result.c - wait for an ldap result */
 /*  /* $OpenLDAP: pkg/ldap/libraries/libldap/result.c,v 1.84.2.9 2005/01/20 17:01:02 kurt Exp $ */
  * Copyright 1998-2003 The OpenLDAP Foundation, All Rights Reserved.  /* This work is part of OpenLDAP Software <http://www.openldap.org/>.
  * COPYING RESTRICTIONS APPLY, see COPYRIGHT file   *
    * Copyright 1998-2005 The OpenLDAP Foundation.
    * All rights reserved.
    *
    * Redistribution and use in source and binary forms, with or without
    * modification, are permitted only as authorized by the OpenLDAP
    * Public License.
    *
    * A copy of this license is available in the file LICENSE in the
    * top-level directory of the distribution or, alternatively, at
    * <http://www.OpenLDAP.org/license.html>.
  */   */
 /*  Portions  /* Portions Copyright (c) 1990 Regents of the University of Michigan.
  *  Copyright (c) 1990 Regents of the University of Michigan.   * All rights reserved.
  *  All rights reserved.  
  */   */
 /*---  /* This notice applies to changes, created by or for Novell, Inc.,
  * This notice applies to changes, created by or for Novell, Inc.,  
  * to preexisting works for which notices appear elsewhere in this file.   * to preexisting works for which notices appear elsewhere in this file.
  *   *
  * Copyright (C) 1999, 2000 Novell, Inc. All Rights Reserved.   * Copyright (C) 1999, 2000 Novell, Inc. All Rights Reserved.
Line 24 Line 32
  *---   *---
  * Modification to OpenLDAP source by Novell, Inc.   * Modification to OpenLDAP source by Novell, Inc.
  * April 2000 sfs Add code to process V3 referrals and search results   * April 2000 sfs Add code to process V3 referrals and search results
  *   *---
  *  result.c - wait for an ldap result   * Note: A verbatim copy of version 2.0.1 of the OpenLDAP Public License 
  */  
 /* Note: A verbatim copy of version 2.0.1 of the OpenLDAP Public License   
  * can be found in the file "build/LICENSE-2.0.1" in this distribution   * can be found in the file "build/LICENSE-2.0.1" in this distribution
  * of OpenLDAP Software.   * of OpenLDAP Software.
  */   */
   /* Portions Copyright (C) The Internet Society (1997)
    * ASN.1 fragments are from RFC 2251; see RFC for full legal notices.
    */
   
 /*  /*
  * LDAPv3 (RFC2251)   * LDAPv3 (RFC2251)
Line 64  static int ldap_mark_abandoned LDAP_P(( Line 73  static int ldap_mark_abandoned LDAP_P((
 static int wait4msg LDAP_P(( LDAP *ld, ber_int_t msgid, int all, struct timeval *timeout,  static int wait4msg LDAP_P(( LDAP *ld, ber_int_t msgid, int all, struct timeval *timeout,
         LDAPMessage **result ));          LDAPMessage **result ));
 static ber_tag_t try_read1msg LDAP_P(( LDAP *ld, ber_int_t msgid,  static ber_tag_t try_read1msg LDAP_P(( LDAP *ld, ber_int_t msgid,
         int all, Sockbuf *sb, LDAPConn *lc, LDAPMessage **result ));          int all, Sockbuf *sb, LDAPConn **lc, LDAPMessage **result ));
 static ber_tag_t build_result_ber LDAP_P(( LDAP *ld, BerElement **bp, LDAPRequest *lr ));  static ber_tag_t build_result_ber LDAP_P(( LDAP *ld, BerElement **bp, LDAPRequest *lr ));
 static void merge_error_info LDAP_P(( LDAP *ld, LDAPRequest *parentr, LDAPRequest *lr ));  static void merge_error_info LDAP_P(( LDAP *ld, LDAPRequest *parentr, LDAPRequest *lr ));
 static LDAPMessage * chkResponseList LDAP_P(( LDAP *ld, int msgid, int all));  static LDAPMessage * chkResponseList LDAP_P(( LDAP *ld, int msgid, int all));
Line 182  chkResponseList( Line 191  chkResponseList(
                                 break;                                  break;
                         }                          }
   
                         for ( tmp = lm; tmp != NULL; tmp = tmp->lm_chain ) {                          if ( lm->lm_chain == NULL ) {
                                 if ( tmp->lm_msgtype != LDAP_RES_SEARCH_ENTRY                                  if ((lm->lm_msgtype == LDAP_RES_SEARCH_ENTRY) ||
                                     && tmp->lm_msgtype != LDAP_RES_SEARCH_REFERENCE                                          (lm->lm_msgtype == LDAP_RES_SEARCH_REFERENCE) ||
                                         && tmp->lm_msgtype != LDAP_RES_EXTENDED_PARTIAL )                                          (lm->lm_msgtype == LDAP_RES_INTERMEDIATE)) {
                                 {                                          tmp = NULL;
                                         break;                                  } else {
                                           tmp = lm;
                                   }
                           } else {
                                   if ((lm->lm_chain_tail->lm_chain->lm_msgtype
                                                   == LDAP_RES_SEARCH_ENTRY) ||
                                           (lm->lm_chain_tail->lm_chain->lm_msgtype
                                                   == LDAP_RES_SEARCH_REFERENCE) ||
                                           (lm->lm_chain_tail->lm_chain->lm_msgtype
                                                   == LDAP_RES_INTERMEDIATE)) {
                                           tmp = NULL;
                                   } else {
                                           tmp = lm->lm_chain_tail->lm_chain;
                                 }                                  }
                         }                          }
   
Line 305  wait4msg( Line 326  wait4msg(
         if( (*result = chkResponseList(ld, msgid, all)) != NULL ) {          if( (*result = chkResponseList(ld, msgid, all)) != NULL ) {
             rc = (*result)->lm_msgtype;              rc = (*result)->lm_msgtype;
         } else {          } else {
                           int lc_ready = 0;
   
                         for ( lc = ld->ld_conns; lc != NULL; lc = lc->lconn_next ) {                          for ( lc = ld->ld_conns; lc != NULL; lc = nextlc ) {
                                   nextlc = lc->lconn_next;
                                 if ( ber_sockbuf_ctrl( lc->lconn_sb,                                  if ( ber_sockbuf_ctrl( lc->lconn_sb,
                                                 LBER_SB_OPT_DATA_READY, NULL ) ) {                                                  LBER_SB_OPT_DATA_READY, NULL ) ) {
                                             rc = try_read1msg( ld, msgid, all, lc->lconn_sb,                                          rc = try_read1msg( ld, msgid, all, lc->lconn_sb,
                                                 lc, result );                                                  &lc, result );
                                           lc_ready = 1;
                                     break;                                      break;
                                 }                                  }
                 }                  }
   
                     if ( lc == NULL ) {                      if ( !lc_ready ) {
                             rc = ldap_int_select( ld, tvp );                              rc = ldap_int_select( ld, tvp );
 #ifdef LDAP_DEBUG  #ifdef LDAP_DEBUG
                             if ( rc == -1 ) {                              if ( rc == -1 ) {
Line 337  wait4msg( Line 361  wait4msg(
                             {                              {
                                     ld->ld_errno = (rc == -1 ? LDAP_SERVER_DOWN :                                      ld->ld_errno = (rc == -1 ? LDAP_SERVER_DOWN :
                                         LDAP_TIMEOUT);                                          LDAP_TIMEOUT);
                                     return( rc );                                      return rc;
                             }                              }
   
                             if ( rc == -1 ) {                              if ( rc == -1 ) {
Line 364  wait4msg( Line 388  wait4msg(
                                                 ldap_is_read_ready( ld,                                                  ldap_is_read_ready( ld,
                                                 lc->lconn_sb )) {                                                  lc->lconn_sb )) {
                                                     rc = try_read1msg( ld, msgid, all,                                                      rc = try_read1msg( ld, msgid, all,
                                                         lc->lconn_sb, lc, result );                                                          lc->lconn_sb, &lc, result );
                                                           if ( lc == NULL ) lc = nextlc;
                                             }                                              }
                                     }                                      }
                             }                              }
Line 400  try_read1msg( Line 425  try_read1msg(
         ber_int_t msgid,          ber_int_t msgid,
         int all,          int all,
         Sockbuf *sb,          Sockbuf *sb,
         LDAPConn *lc,          LDAPConn **lcp,
         LDAPMessage **result )          LDAPMessage **result )
 {  {
         BerElement      *ber;          BerElement      *ber;
         LDAPMessage     *new, *l, *prev, *tmp;          LDAPMessage     *new, *l, *prev, *tmp, *chain_head;
         ber_int_t       id;          ber_int_t       id;
         ber_tag_t       tag;          ber_tag_t       tag;
         ber_len_t       len;          ber_len_t       len;
         int             foundit = 0;          int             foundit = 0;
         LDAPRequest     *lr, *tmplr;          LDAPRequest     *lr, *tmplr;
           LDAPConn        *lc;
         BerElement      tmpber;          BerElement      tmpber;
         int             rc, refer_cnt, hadref, simple_request;          int             rc, refer_cnt, hadref, simple_request;
         ber_int_t       lderr;          ber_int_t       lderr;
Line 423  try_read1msg( Line 449  try_read1msg(
         int     v3ref;          int     v3ref;
   
         assert( ld != NULL );          assert( ld != NULL );
         assert( lc != NULL );          assert( lcp != NULL );
           assert( *lcp != NULL );
                   
 #ifdef NEW_LOGGING  #ifdef NEW_LOGGING
         LDAP_LOG ( OPERATION, ARGS, "read1msg: msgid %d, all %d\n", msgid, all, 0 );          LDAP_LOG ( OPERATION, ARGS, "read1msg: msgid %d, all %d\n", msgid, all, 0 );
Line 431  try_read1msg( Line 458  try_read1msg(
         Debug( LDAP_DEBUG_TRACE, "read1msg: msgid %d, all %d\n", msgid, all, 0 );          Debug( LDAP_DEBUG_TRACE, "read1msg: msgid %d, all %d\n", msgid, all, 0 );
 #endif  #endif
   
           lc = *lcp;
   
 retry:  retry:
         if ( lc->lconn_ber == NULL ) {          if ( lc->lconn_ber == NULL ) {
                 lc->lconn_ber = ldap_alloc_ber_with_options(ld);                  lc->lconn_ber = ldap_alloc_ber_with_options(ld);
Line 660  nextresp2: Line 689  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 > -1)          if ( (tag != LDAP_RES_SEARCH_ENTRY) && (v3ref > -1) &&
 #ifdef LDAP_RES_INTERMEDIATE_RESP                  (tag != LDAP_RES_INTERMEDIATE ))
                 && (tag != LDAP_RES_INTERMEDIATE_RESP )          {
 #endif  
         ) {  
                 /* 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 &&
                         ( lr->lr_parent != NULL ||                          ( lr->lr_parent != NULL ||
Line 808  lr->lr_res_matched ? lr->lr_res_matched Line 835  lr->lr_res_matched ? lr->lr_res_matched
   
                         if ( lc != NULL ) {                          if ( lc != NULL ) {
                                 ldap_free_connection( ld, lc, 0, 1 );                                  ldap_free_connection( ld, lc, 0, 1 );
                                   *lcp = NULL;
                         }                          }
                 }                  }
         }          }
Line 875  lr->lr_res_matched ? lr->lr_res_matched Line 903  lr->lr_res_matched ? lr->lr_res_matched
                                 firstmsg = 0;                                  firstmsg = 0;
                                 new->lm_next = ld->ld_responses;                                  new->lm_next = ld->ld_responses;
                                 ld->ld_responses = new;                                  ld->ld_responses = new;
                                   new->lm_chain_tail = new;
                                   chain_head = new;
                         } else {                          } else {
                                 tmp->lm_chain = new;                                  tmp->lm_chain = new;
                                   chain_head->lm_chain_tail = tmp;
                         }                          }
                         tmp = new;                          tmp = new;
                         /* "ok" means there's more to parse */                          /* "ok" means there's more to parse */
Line 898  lr->lr_res_matched ? lr->lr_res_matched Line 929  lr->lr_res_matched ? lr->lr_res_matched
                  * first response off the head of the chain.                   * first response off the head of the chain.
                  */                   */
                         tmp->lm_chain = new;                          tmp->lm_chain = new;
                           chain_head->lm_chain_tail = tmp;
                         *result = chkResponseList( ld, msgid, all );                          *result = chkResponseList( ld, msgid, all );
                         ld->ld_errno = LDAP_SUCCESS;                          ld->ld_errno = LDAP_SUCCESS;
                         return( (*result)->lm_msgtype );                          return( (*result)->lm_msgtype );
Line 941  lr->lr_res_matched ? lr->lr_res_matched Line 973  lr->lr_res_matched ? lr->lr_res_matched
   
                 new->lm_next = ld->ld_responses;                  new->lm_next = ld->ld_responses;
                 ld->ld_responses = new;                  ld->ld_responses = new;
                   new->lm_chain_tail = new;
                 goto exit;                  goto exit;
         }          }
   
Line 954  lr->lr_res_matched ? lr->lr_res_matched Line 987  lr->lr_res_matched ? lr->lr_res_matched
 #endif  #endif
   
         /* part of a search response - add to end of list of entries */          /* part of a search response - add to end of list of entries */
         for ( tmp = l; (tmp->lm_chain != NULL) &&          if (l->lm_chain == NULL) {
                 ((tmp->lm_chain->lm_msgtype == LDAP_RES_SEARCH_ENTRY) ||                  if ((l->lm_msgtype == LDAP_RES_SEARCH_ENTRY) ||
                  (tmp->lm_chain->lm_msgtype == LDAP_RES_SEARCH_REFERENCE) ||                          (l->lm_msgtype == LDAP_RES_SEARCH_REFERENCE) ||
                          (tmp->lm_chain->lm_msgtype == LDAP_RES_EXTENDED_PARTIAL ));                          (l->lm_msgtype == LDAP_RES_INTERMEDIATE)) {
             tmp = tmp->lm_chain )                          /* do not advance lm_chain_tail in this case */
                 ;       /* NULL */                          l->lm_chain = new;
         tmp->lm_chain = new;                  } else {
                           /*FIXME: ldap_msgfree( l );*/
                           l = new;
                           l->lm_chain_tail = new;
                   }
           } else {
                   if ((l->lm_chain_tail->lm_chain->lm_msgtype
                                   == LDAP_RES_SEARCH_ENTRY) ||
                           (l->lm_chain_tail->lm_chain->lm_msgtype
                                   == LDAP_RES_SEARCH_REFERENCE) ||
                           (l->lm_chain_tail->lm_chain->lm_msgtype
                                   == LDAP_RES_INTERMEDIATE)) {
                           l->lm_chain_tail->lm_chain->lm_chain = new;
                           l->lm_chain_tail = l->lm_chain_tail->lm_chain;
                   } else {
                           /*FIXME: ldap_msgfree( l->lm_chain_tail->lm_chain );*/
                           l->lm_chain_tail->lm_chain = new;
                   }
           }
   
         /* return the whole chain if that's what we were looking for */          /* return the whole chain if that's what we were looking for */
         if ( foundit ) {          if ( foundit ) {
Line 1109  char * ldap_int_msgtype2str( ber_tag_t t Line 1160  char * ldap_int_msgtype2str( ber_tag_t t
         case LDAP_RES_COMPARE: return "compare";          case LDAP_RES_COMPARE: return "compare";
         case LDAP_RES_DELETE: return "delete";          case LDAP_RES_DELETE: return "delete";
         case LDAP_RES_EXTENDED: return "extended-result";          case LDAP_RES_EXTENDED: return "extended-result";
         case LDAP_RES_EXTENDED_PARTIAL: return "extended-partial";          case LDAP_RES_INTERMEDIATE: return "intermediate";
         case LDAP_RES_MODIFY: return "modify";          case LDAP_RES_MODIFY: return "modify";
         case LDAP_RES_RENAME: return "rename";          case LDAP_RES_RENAME: return "rename";
         case LDAP_RES_SEARCH_ENTRY: return "search-entry";          case LDAP_RES_SEARCH_ENTRY: return "search-entry";

Removed from v.1.84  
changed lines
  Added in v.1.84.2.10


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