Diff for /servers/slapd/back-ldap/modrdn.c between versions 1.47 and 1.47.2.10

version 1.47, 2006/03/28 17:20:01 version 1.47.2.10, 2011/01/04 23:50:33
Line 1 Line 1
 /* modrdn.c - ldap backend modrdn function */  /* modrdn.c - ldap backend modrdn function */
 /* $OpenLDAP: pkg/ldap/servers/slapd/back-ldap/modrdn.c,v 1.46 2006/01/03 22:12:19 kurt Exp $ */  /* $OpenLDAP: pkg/ldap/servers/slapd/back-ldap/modrdn.c,v 1.47.2.9 2010/04/13 20:23:29 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 1999-2006 The OpenLDAP Foundation.   * Copyright 1999-2011 The OpenLDAP Foundation.
  * Portions Copyright 1999-2003 Howard Chu.   * Portions Copyright 1999-2003 Howard Chu.
  * Portions Copyright 2000-2003 Pierangelo Masarati.   * Portions Copyright 2000-2003 Pierangelo Masarati.
  * All rights reserved.   * All rights reserved.
Line 36  ldap_back_modrdn( Line 36  ldap_back_modrdn(
                 Operation       *op,                  Operation       *op,
                 SlapReply       *rs )                  SlapReply       *rs )
 {  {
         ldapinfo_t      *li = (ldapinfo_t *)op->o_bd->be_private;          ldapinfo_t              *li = (ldapinfo_t *)op->o_bd->be_private;
   
         ldapconn_t      *lc;          ldapconn_t              *lc = NULL;
         ber_int_t       msgid;          ber_int_t               msgid;
         LDAPControl     **ctrls = NULL;          LDAPControl             **ctrls = NULL;
         int             do_retry = 1;          ldap_back_send_t        retrying = LDAP_BACK_RETRYING;
         int             rc = LDAP_SUCCESS;          int                     rc = LDAP_SUCCESS;
         char            *newSup = NULL;          char                    *newSup = NULL;
           struct berval           newrdn = BER_BVNULL;
   
         lc = ldap_back_getconn( op, rs, LDAP_BACK_SENDERR );          if ( !ldap_back_dobind( &lc, op, rs, LDAP_BACK_SENDERR ) ) {
         if ( !lc || !ldap_back_dobind( lc, op, rs, LDAP_BACK_SENDERR ) ) {  
                 return rs->sr_err;                  return rs->sr_err;
         }          }
   
         if ( op->orr_newSup ) {          if ( op->orr_newSup ) {
                 int     version = LDAP_VERSION3;                  /* needs LDAPv3 */
                   switch ( li->li_version ) {
                   case LDAP_VERSION3:
                           break;
   
                   case 0:
                           if ( op->o_protocol == 0 || op->o_protocol == LDAP_VERSION3 ) {
                                   break;
                           }
                           /* fall thru */
   
                   default:
                           /* op->o_protocol cannot be anything but LDAPv3,
                            * otherwise wouldn't be here */
                           rs->sr_err = LDAP_UNWILLING_TO_PERFORM;
                           send_ldap_result( op, rs );
                           goto cleanup;
                   }
                                   
                 ldap_set_option( lc->lc_ld, LDAP_OPT_PROTOCOL_VERSION, &version );  
                 newSup = op->orr_newSup->bv_val;                  newSup = op->orr_newSup->bv_val;
         }          }
   
           /* NOTE: we need to copy the newRDN in case it was formed
            * from a DN by simply changing the length (ITS#5397) */
           newrdn = op->orr_newrdn;
           if ( newrdn.bv_val[ newrdn.bv_len ] != '\0' ) {
                   ber_dupbv_x( &newrdn, &op->orr_newrdn, op->o_tmpmemctx );
           }
   
   retry:
         ctrls = op->o_ctrls;          ctrls = op->o_ctrls;
         rc = ldap_back_proxy_authz_ctrl( lc, op, rs, &ctrls );          rc = ldap_back_controls_add( op, rs, lc, &ctrls );
         if ( rc != LDAP_SUCCESS ) {          if ( rc != LDAP_SUCCESS ) {
                 send_ldap_result( op, rs );                  send_ldap_result( op, rs );
                 rc = -1;                  rc = -1;
                 goto cleanup;                  goto cleanup;
         }          }
   
 retry:  
         rs->sr_err = ldap_rename( lc->lc_ld, op->o_req_dn.bv_val,          rs->sr_err = ldap_rename( lc->lc_ld, op->o_req_dn.bv_val,
                         op->orr_newrdn.bv_val, newSup,                          newrdn.bv_val, newSup,
                         op->orr_deleteoldrdn, ctrls, NULL, &msgid );                          op->orr_deleteoldrdn, ctrls, NULL, &msgid );
         rc = ldap_back_op_result( lc, op, rs, msgid,          rc = ldap_back_op_result( lc, op, rs, msgid,
                 li->li_timeout[ LDAP_BACK_OP_MODRDN ], LDAP_BACK_SENDRESULT );                  li->li_timeout[ SLAP_OP_MODRDN ],
         if ( rs->sr_err == LDAP_SERVER_DOWN && do_retry ) {                  ( LDAP_BACK_SENDRESULT | retrying ) );
                 do_retry = 0;          if ( rs->sr_err == LDAP_UNAVAILABLE && retrying ) {
                   retrying &= ~LDAP_BACK_RETRYING;
                 if ( ldap_back_retry( &lc, op, rs, LDAP_BACK_SENDERR ) ) {                  if ( ldap_back_retry( &lc, op, rs, LDAP_BACK_SENDERR ) ) {
                           /* if the identity changed, there might be need to re-authz */
                           (void)ldap_back_controls_free( op, rs, &ctrls );
                         goto retry;                          goto retry;
                 }                  }
         }          }
   
 cleanup:  cleanup:
         (void)ldap_back_proxy_authz_ctrl_free( op, &ctrls );          (void)ldap_back_controls_free( op, rs, &ctrls );
   
           if ( newrdn.bv_val != op->orr_newrdn.bv_val ) {
                   op->o_tmpfree( newrdn.bv_val, op->o_tmpmemctx );
           }
   
         if ( lc != NULL ) {          if ( lc != NULL ) {
                 ldap_back_release_conn( op, rs, lc );                  ldap_back_release_conn( li, lc );
         }          }
   
         return rc;          return rc;

Removed from v.1.47  
changed lines
  Added in v.1.47.2.10


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