Diff for /servers/slapd/back-relay/op.c between versions 1.10.2.6 and 1.11

version 1.10.2.6, 2008/02/11 23:24:23 version 1.11, 2004/12/11 15:28:45
Line 1 Line 1
 /* op.c - relay backend operations */  /* op.c - relay backend operations */
 /* This work is part of OpenLDAP Software <http://www.openldap.org/>.  /* This work is part of OpenLDAP Software <http://www.openldap.org/>.
  *   *
  * Copyright 2004-2008 The OpenLDAP Foundation.   * Copyright 2004 The OpenLDAP Foundation.
  * Portions Copyright 2004 Pierangelo Masarati.   * Portions Copyright 2004 Pierangelo Masarati.
  * All rights reserved.   * All rights reserved.
  *   *
Line 47  relay_back_add_cb( slap_callback *cb, st Line 47  relay_back_add_cb( slap_callback *cb, st
         op->o_callback = cb;          op->o_callback = cb;
 }  }
   
 /*  
  * selects the backend if not enforced at config;  
  * in case of failure, behaves based on err:  
  *      -1                      don't send result  
  *      LDAP_SUCCESS            don't send result; may send referral  
  *      any valid error         send as error result  
  */  
 static BackendDB *  static BackendDB *
 relay_back_select_backend( struct slap_op *op, struct slap_rep *rs, int err )  relay_back_select_backend( struct slap_op *op, struct slap_rep *rs, int err )
 {  {
         relay_back_info         *ri = (relay_back_info *)op->o_bd->be_private;          relay_back_info         *ri = (relay_back_info *)op->o_bd->be_private;
         BackendDB               *bd = ri->ri_bd;          BackendDB               *bd = ri->ri_bd;
   
         if ( bd == NULL && !BER_BVISNULL( &op->o_req_ndn ) ) {          if ( bd == NULL ) {
                 bd = select_backend( &op->o_req_ndn, 0, 1 );                  bd = select_backend( &op->o_req_ndn, 0, 1 );
                 if ( bd == op->o_bd ) {                  if ( bd == op->o_bd ) {
                         if ( err > LDAP_SUCCESS ) {                          if ( err != LDAP_SUCCESS ) {
                                 send_ldap_error( op, rs,                                  send_ldap_error( op, rs,
                                                 LDAP_UNWILLING_TO_PERFORM,                                                   LDAP_UNWILLING_TO_PERFORM, 
                                                 "back-relay would call self" );                                                  "would call self" );
                         }                          }
                         return NULL;                          return NULL;
                 }                  }
         }          }
   
         if ( bd == NULL && err > -1 ) {          if ( bd == NULL ) {
                 if ( default_referral ) {                  if ( default_referral ) {
                         rs->sr_ref = referral_rewrite( default_referral,                          rs->sr_ref = referral_rewrite( default_referral,
                                 NULL, &op->o_req_dn, LDAP_SCOPE_DEFAULT );                                  NULL, &op->o_req_dn, LDAP_SCOPE_DEFAULT );
Line 140  relay_back_op_unbind( struct slap_op *op Line 133  relay_back_op_unbind( struct slap_op *op
         BackendDB               *bd;          BackendDB               *bd;
         int                     rc = 1;          int                     rc = 1;
   
         bd = relay_back_select_backend( op, rs, -1 );          bd = ri->ri_bd;
         if ( bd == NULL ) {          if ( bd == NULL ) {
                 return rc;                  bd = select_backend( &op->o_req_ndn, 0, 1 );
         }          }
   
         if ( bd && bd->be_unbind ) {          if ( bd && bd->be_unbind ) {
Line 375  relay_back_op_abandon( struct slap_op *o Line 368  relay_back_op_abandon( struct slap_op *o
         BackendDB               *bd;          BackendDB               *bd;
         int                     rc = 1;          int                     rc = 1;
   
         bd = relay_back_select_backend( op, rs, -1 );          bd = relay_back_select_backend( op, rs, LDAP_NO_SUCH_OBJECT );
         if ( bd == NULL ) {          if ( bd == NULL ) {
                 return 1;                  return 1;
         }          }
Line 393  relay_back_op_abandon( struct slap_op *o Line 386  relay_back_op_abandon( struct slap_op *o
                 if ( op->o_callback == &cb ) {                  if ( op->o_callback == &cb ) {
                         op->o_callback = op->o_callback->sc_next;                          op->o_callback = op->o_callback->sc_next;
                 }                  }
   
           } else {
                   send_ldap_error( op, rs, LDAP_UNWILLING_TO_PERFORM,
                                   "operation not supported "
                                   "within naming context" );
         }          }
   
         return rc;          return rc;
Line 405  relay_back_op_cancel( struct slap_op *op Line 403  relay_back_op_cancel( struct slap_op *op
         BackendDB               *bd;          BackendDB               *bd;
         int                     rc = 1;          int                     rc = 1;
   
         bd = relay_back_select_backend( op, rs, LDAP_CANNOT_CANCEL );          bd = relay_back_select_backend( op, rs, LDAP_NO_SUCH_OBJECT );
         if ( bd == NULL ) {          if ( bd == NULL ) {
                 return 1;                  return 1;
         }          }
Line 524  relay_back_entry_get_rw( struct slap_op Line 522  relay_back_entry_get_rw( struct slap_op
   
 }  }
   
 /*  
  * NOTE: even the existence of this function is questionable: we cannot  
  * pass the bi_chk_referrals() call thru the rwm overlay because there  
  * is no way to rewrite the req_dn back; but then relay_back_chk_referrals()  
  * is passing the target database a DN that likely does not belong to its  
  * naming context... mmmh.  
  */  
 int  int
 relay_back_chk_referrals( struct slap_op *op, struct slap_rep *rs )  relay_back_chk_referrals( struct slap_op *op, struct slap_rep *rs )
 {  {
Line 538  relay_back_chk_referrals( struct slap_op Line 529  relay_back_chk_referrals( struct slap_op
         int                     rc = 0;          int                     rc = 0;
   
         bd = relay_back_select_backend( op, rs, LDAP_SUCCESS );          bd = relay_back_select_backend( op, rs, LDAP_SUCCESS );
         /* FIXME: this test only works if there are no overlays, so  
          * it is nearly useless; if made stricter, no nested back-relays  
          * can be instantiated... too bad. */  
         if ( bd == NULL || bd == op->o_bd ) {          if ( bd == NULL || bd == op->o_bd ) {
                 return 0;                  return 0;
         }          }
   
         /* no nested back-relays... */  
         if ( overlay_is_over( bd ) ) {  
                 slap_overinfo   *oi = (slap_overinfo *)bd->bd_info->bi_private;  
   
                 if ( oi->oi_orig == op->o_bd->bd_info ) {  
                         return 0;  
                 }  
         }  
   
         if ( bd->be_chk_referrals ) {          if ( bd->be_chk_referrals ) {
                 BackendDB       *be = op->o_bd;                  BackendDB       *be = op->o_bd;
                 slap_callback   cb;                  slap_callback   cb;

Removed from v.1.10.2.6  
changed lines
  Added in v.1.11


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