Diff for /servers/slapd/back-ldap/chain.c between versions 1.12.2.10 and 1.12.2.11

version 1.12.2.10, 2005/11/03 18:03:00 version 1.12.2.11, 2005/11/04 23:08:35
Line 1 Line 1
 /* chain.c - chain LDAP operations */  /* chain.c - chain LDAP operations */
 /* $OpenLDAP: pkg/ldap/servers/slapd/back-ldap/chain.c,v 1.12.2.9 2005/08/09 21:04:02 kurt Exp $ */  /* $OpenLDAP: pkg/ldap/servers/slapd/back-ldap/chain.c,v 1.12.2.10 2005/11/03 18:03:00 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 2003-2005 The OpenLDAP Foundation.   * Copyright 2003-2005 The OpenLDAP Foundation.
Line 69  typedef struct ldap_chain_t { Line 69  typedef struct ldap_chain_t {
 #define LDAP_CHAIN_F_NONE               0x00U  #define LDAP_CHAIN_F_NONE               0x00U
 #define LDAP_CHAIN_F_CHAINING           0x01U  #define LDAP_CHAIN_F_CHAINING           0x01U
   
           ldap_pvt_thread_mutex_t lc_mutex;
   
 #ifdef LDAP_CONTROL_X_CHAINING_BEHAVIOR  #ifdef LDAP_CONTROL_X_CHAINING_BEHAVIOR
         LDAPControl             lc_chaining_ctrl;          LDAPControl             lc_chaining_ctrl;
         char                    lc_chaining_ctrlflag;          char                    lc_chaining_ctrlflag;
Line 259  ldap_chain_op( Line 261  ldap_chain_op(
 {  {
         slap_overinst   *on = (slap_overinst *) op->o_bd->bd_info;          slap_overinst   *on = (slap_overinst *) op->o_bd->bd_info;
         ldap_chain_t    *lc = (ldap_chain_t *)on->on_bi.bi_private;          ldap_chain_t    *lc = (ldap_chain_t *)on->on_bi.bi_private;
         struct ldapinfo li, *lip = lc->lc_li;  
           struct ldapinfo *lip = lc->lc_li;
           char            *save_url = NULL;
           SlapReply       rs2 = { 0 };
   
         /* NOTE: returned if ref is empty... */          /* NOTE: returned if ref is empty... */
         int             rc = LDAP_OTHER;          int             rc = LDAP_OTHER;
Line 272  ldap_chain_op( Line 277  ldap_chain_op(
   
         if ( lip->url != NULL ) {          if ( lip->url != NULL ) {
                 op->o_bd->be_private = lip;                  op->o_bd->be_private = lip;
                 rc = ( *op_f )( op, rs );                  rc = ( *op_f )( op, &rs2 );
                   rs->sr_err = rs2.sr_err;
                 goto done;                  goto done;
         }          }
   
         li = *lip;          save_url = lip->url;
         op->o_bd->be_private = &li;          lip->url = NULL;
           op->o_bd->be_private = lip;
   
         /* if we parse the URI then by no means           /* if we parse the URI then by no means 
          * we can cache stuff or reuse connections,            * we can cache stuff or reuse connections, 
Line 321  Document: draft-ietf-ldapbis-protocol-27 Line 328  Document: draft-ietf-ldapbis-protocol-27
                 save_dn = srv->lud_dn;                  save_dn = srv->lud_dn;
                 srv->lud_dn = "";                  srv->lud_dn = "";
                 srv->lud_scope = LDAP_SCOPE_DEFAULT;                  srv->lud_scope = LDAP_SCOPE_DEFAULT;
                 li.url = ldap_url_desc2str( srv );                  lip->url = ldap_url_desc2str( srv );
                 srv->lud_dn = save_dn;                  srv->lud_dn = save_dn;
                 ldap_free_urldesc( srv );                  ldap_free_urldesc( srv );
   
                 if ( li.url == NULL ) {                  if ( lip->url == NULL ) {
                         /* try next */                          /* try next */
                         rc = LDAP_OTHER;                          rc = LDAP_OTHER;
                         continue;                          continue;
                 }                  }
   
                 rc = ( *op_f )( op, rs );                  rc = ( *op_f )( op, &rs2 );
                   rs->sr_err = rs2.sr_err;
   
                 ldap_memfree( li.url );                  ldap_memfree( lip->url );
                 li.url = NULL;                  lip->url = NULL;
                                   
                 if ( rc == LDAP_SUCCESS && rs->sr_err == LDAP_SUCCESS ) {                  if ( rc == LDAP_SUCCESS && rs->sr_err == LDAP_SUCCESS ) {
                         break;                          break;
                 }                  }
         }          }
   
           lip->url = save_url;
   
 done:;  done:;
 #ifdef LDAP_CONTROL_X_CHAINING_BEHAVIOR  #ifdef LDAP_CONTROL_X_CHAINING_BEHAVIOR
         (void)chaining_control_remove( op, &ctrls );          (void)chaining_control_remove( op, &ctrls );
Line 362  ldap_chain_response( Operation *op, Slap Line 372  ldap_chain_response( Operation *op, Slap
         struct berval   ndn = op->o_ndn;          struct berval   ndn = op->o_ndn;
   
         ldap_chain_t    *lc = (ldap_chain_t *)on->on_bi.bi_private;          ldap_chain_t    *lc = (ldap_chain_t *)on->on_bi.bi_private;
         struct ldapinfo li, *lip = lc->lc_li;          struct ldapinfo *lip = lc->lc_li;
   
 #ifdef LDAP_CONTROL_X_CHAINING_BEHAVIOR  #ifdef LDAP_CONTROL_X_CHAINING_BEHAVIOR
         int             sr_err = rs->sr_err;          int             sr_err = rs->sr_err;
Line 402  ldap_chain_response( Operation *op, Slap Line 412  ldap_chain_response( Operation *op, Slap
         }          }
 #endif /* LDAP_CONTROL_X_CHAINING_BEHAVIOR */  #endif /* LDAP_CONTROL_X_CHAINING_BEHAVIOR */
   
           ldap_pvt_thread_mutex_lock( &lc->lc_mutex );
   
         /*          /*
          * TODO: add checks on who/when chain operations; e.g.:           * TODO: add checks on who/when chain operations; e.g.:
          *   a) what identities are authorized           *   a) what identities are authorized
Line 441  ldap_chain_response( Operation *op, Slap Line 453  ldap_chain_response( Operation *op, Slap
                 }                  }
                 break;                  break;
         case LDAP_REQ_ADD:          case LDAP_REQ_ADD:
                 /* slap_mods2entry () should be called in do_add() */  
                 assert( op->ora_e->e_attrs != NULL );  
                 rc = ldap_chain_op( op, rs, lback->bi_op_add, ref );                  rc = ldap_chain_op( op, rs, lback->bi_op_add, ref );
                 break;                  break;
         case LDAP_REQ_DELETE:          case LDAP_REQ_DELETE:
Line 462  ldap_chain_response( Operation *op, Slap Line 472  ldap_chain_response( Operation *op, Slap
                         struct berval   *curr = ref,                          struct berval   *curr = ref,
                                         odn = op->o_req_dn,                                          odn = op->o_req_dn,
                                         ondn = op->o_req_ndn;                                          ondn = op->o_req_ndn;
                           char            *save_url = NULL;
                           SlapReply       rs2 = { 0 };
   
 #ifdef LDAP_CONTROL_X_CHAINING_BEHAVIOR  #ifdef LDAP_CONTROL_X_CHAINING_BEHAVIOR
                         LDAPControl     **ctrls = NULL;                          LDAPControl     **ctrls = NULL;
Line 473  ldap_chain_response( Operation *op, Slap Line 485  ldap_chain_response( Operation *op, Slap
   
                         sc2.sc_response = ldap_chain_cb_search_response;                          sc2.sc_response = ldap_chain_cb_search_response;
   
                         li = *lip;                          save_url = lip->url;
                         li.url = NULL;                          lip->url = NULL;
                         op->o_bd->be_private = &li;                          op->o_bd->be_private = lip;
                                                   
                         /* if we parse the URI then by no means                           /* if we parse the URI then by no means 
                          * we can cache stuff or reuse connections,                            * we can cache stuff or reuse connections, 
Line 504  ldap_chain_response( Operation *op, Slap Line 516  ldap_chain_response( Operation *op, Slap
                                 save_dn = srv->lud_dn;                                  save_dn = srv->lud_dn;
                                 srv->lud_dn = "";                                  srv->lud_dn = "";
                                 srv->lud_scope = LDAP_SCOPE_DEFAULT;                                  srv->lud_scope = LDAP_SCOPE_DEFAULT;
                                 li.url = ldap_url_desc2str( srv );                                  lip->url = ldap_url_desc2str( srv );
                                 if ( li.url != NULL ) {                                  if ( lip->url != NULL ) {
                                         ber_str2bv_x( save_dn, 0, 1, &op->o_req_dn,                                          ber_str2bv_x( save_dn, 0, 1, &op->o_req_dn,
                                                         op->o_tmpmemctx );                                                          op->o_tmpmemctx );
                                         ber_dupbv_x( &op->o_req_ndn, &op->o_req_dn,                                          ber_dupbv_x( &op->o_req_ndn, &op->o_req_dn,
Line 515  ldap_chain_response( Operation *op, Slap Line 527  ldap_chain_response( Operation *op, Slap
                                 srv->lud_dn = save_dn;                                  srv->lud_dn = save_dn;
                                 ldap_free_urldesc( srv );                                  ldap_free_urldesc( srv );
   
                                 if ( li.url == NULL ) {                                  if ( lip->url == NULL ) {
                                         /* try next */                                          /* try next */
                                         rs->sr_err = LDAP_OTHER;                                          rs->sr_err = LDAP_OTHER;
                                         continue;                                          continue;
Line 524  ldap_chain_response( Operation *op, Slap Line 536  ldap_chain_response( Operation *op, Slap
   
                                 /* FIXME: should we also copy filter and scope?                                  /* FIXME: should we also copy filter and scope?
                                  * according to RFC3296, no */                                   * according to RFC3296, no */
                                 rc = lback->bi_op_search( op, rs );                                  rc = lback->bi_op_search( op, &rs2 );
                                   rs->sr_err = rs2.sr_err;
   
                                 ldap_memfree( li.url );                                  ldap_memfree( lip->url );
                                 li.url = NULL;                                  lip->url = NULL;
   
                                 op->o_tmpfree( op->o_req_dn.bv_val,                                  op->o_tmpfree( op->o_req_dn.bv_val,
                                                 op->o_tmpmemctx );                                                  op->o_tmpmemctx );
Line 545  ldap_chain_response( Operation *op, Slap Line 558  ldap_chain_response( Operation *op, Slap
                         (void)chaining_control_remove( op, &ctrls );                          (void)chaining_control_remove( op, &ctrls );
 #endif /* LDAP_CONTROL_X_CHAINING_BEHAVIOR */  #endif /* LDAP_CONTROL_X_CHAINING_BEHAVIOR */
   
                           lip->url = save_url;
   
                         op->o_req_dn = odn;                          op->o_req_dn = odn;
                         op->o_req_ndn = ondn;                          op->o_req_ndn = ondn;
                         rs->sr_type = REP_SEARCHREF;                          rs->sr_type = REP_SEARCHREF;
Line 613  dont_chain:; Line 628  dont_chain:;
         op->o_ndn = ndn;          op->o_ndn = ndn;
         rs->sr_ref = ref;          rs->sr_ref = ref;
   
           ldap_pvt_thread_mutex_unlock( &lc->lc_mutex );
   
         return rc;          return rc;
 }  }
   
Line 1074  ldap_chain_db_init( Line 1091  ldap_chain_db_init(
         lc = ch_malloc( sizeof( ldap_chain_t ) );          lc = ch_malloc( sizeof( ldap_chain_t ) );
         memset( lc, 0, sizeof( ldap_chain_t ) );          memset( lc, 0, sizeof( ldap_chain_t ) );
   
           ldap_pvt_thread_mutex_init( &lc->lc_mutex );
   
         bd.be_private = NULL;          bd.be_private = NULL;
         rc = lback->bi_db_init( &bd );          rc = lback->bi_db_init( &bd );
         lc->lc_li = (struct ldapinfo *)bd.be_private;          lc->lc_li = (struct ldapinfo *)bd.be_private;
Line 1108  ldap_chain_db_destroy( Line 1127  ldap_chain_db_destroy(
   
         be->be_private = (void *)lc->lc_li;          be->be_private = (void *)lc->lc_li;
         rc = lback->bi_db_destroy( be );          rc = lback->bi_db_destroy( be );
         lc->lc_li = be->be_private;          ldap_pvt_thread_mutex_destroy( &lc->lc_mutex );
         ch_free( lc );          ch_free( lc );
         on->on_bi.bi_private = NULL;          on->on_bi.bi_private = NULL;
         be->be_private = private;          be->be_private = private;

Removed from v.1.12.2.10  
changed lines
  Added in v.1.12.2.11


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