X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=servers%2Fslapd%2Fback-meta%2Fmodrdn.c;h=d4ea67f895d2c9c950488f354fbfb1666df4cd2c;hb=8d14165274b244d6f91587502bd0a23ec7b08a87;hp=22cdc7c4f51255dab2229997865cf8ff7ea615d2;hpb=44725e73034f8a077ca73f1ad359f913d37a89ac;p=openldap diff --git a/servers/slapd/back-meta/modrdn.c b/servers/slapd/back-meta/modrdn.c index 22cdc7c4f5..d4ea67f895 100644 --- a/servers/slapd/back-meta/modrdn.c +++ b/servers/slapd/back-meta/modrdn.c @@ -1,7 +1,7 @@ /* $OpenLDAP$ */ /* This work is part of OpenLDAP Software . * - * Copyright 1999-2004 The OpenLDAP Foundation. + * Copyright 1999-2005 The OpenLDAP Foundation. * Portions Copyright 2001-2003 Pierangelo Masarati. * Portions Copyright 1999-2003 Howard Chu. * All rights reserved. @@ -33,18 +33,6 @@ int meta_back_modrdn( Operation *op, SlapReply *rs ) - /* - Backend *be, - Connection *conn, - Operation *op, - struct berval *dn, - struct berval *ndn, - struct berval *newrdn, - struct berval *nnewrdn, - int deleteoldrdn, - struct berval *newSuperior, - struct berval *nnewSuperior -) */ { struct metainfo *li = ( struct metainfo * )op->o_bd->be_private; struct metaconn *lc; @@ -61,9 +49,16 @@ meta_back_modrdn( Operation *op, SlapReply *rs ) goto cleanup; } - if ( !meta_back_dobind( lc, op ) - || !meta_back_is_valid( lc, candidate ) ) { + assert( candidate != META_TARGET_NONE ); + + if ( !meta_back_dobind( lc, op ) ) { + rs->sr_err = LDAP_UNAVAILABLE; + + } else if ( !meta_back_is_valid( lc, candidate ) ) { rs->sr_err = LDAP_OTHER; + } + + if ( rs->sr_err != LDAP_SUCCESS ) { rc = -1; goto cleanup; } @@ -71,11 +66,11 @@ meta_back_modrdn( Operation *op, SlapReply *rs ) dc.conn = op->o_conn; dc.rs = rs; - if ( op->oq_modrdn.rs_newSup ) { + if ( op->orr_newSup ) { int nsCandidate, version = LDAP_VERSION3; nsCandidate = meta_back_select_unique_candidate( li, - op->oq_modrdn.rs_newSup ); + op->orr_nnewSup ); if ( nsCandidate != candidate ) { /* @@ -91,19 +86,20 @@ meta_back_modrdn( Operation *op, SlapReply *rs ) * FIXME: is this the correct return code? */ rs->sr_err = LDAP_UNWILLING_TO_PERFORM; + rs->sr_text = "cross-target rename not supported"; rc = -1; goto cleanup; } - ldap_set_option( lc->conns[ nsCandidate ].ld, + ldap_set_option( lc->mc_conns[ nsCandidate ].msc_ld, LDAP_OPT_PROTOCOL_VERSION, &version ); /* * Rewrite the new superior, if defined and required */ - dc.rwmap = &li->targets[ nsCandidate ]->rwmap; + dc.rwmap = &li->targets[ nsCandidate ]->mt_rwmap; dc.ctx = "newSuperiorDN"; - if ( ldap_back_dn_massage( &dc, op->oq_modrdn.rs_newSup, &mnewSuperior ) ) { + if ( ldap_back_dn_massage( &dc, op->orr_newSup, &mnewSuperior ) ) { rc = -1; goto cleanup; } @@ -112,26 +108,30 @@ meta_back_modrdn( Operation *op, SlapReply *rs ) /* * Rewrite the modrdn dn, if required */ - dc.rwmap = &li->targets[ candidate ]->rwmap; + dc.rwmap = &li->targets[ candidate ]->mt_rwmap; dc.ctx = "modrDN"; if ( ldap_back_dn_massage( &dc, &op->o_req_dn, &mdn ) ) { rc = -1; goto cleanup; } - ldap_rename2_s( lc->conns[ candidate ].ld, mdn.bv_val, - op->oq_modrdn.rs_newrdn.bv_val, + rc = ldap_rename_s( lc->mc_conns[ candidate ].msc_ld, mdn.bv_val, + op->orr_newrdn.bv_val, mnewSuperior.bv_val, - op->oq_modrdn.rs_deleteoldrdn ); + op->orr_deleteoldrdn, + NULL, NULL ) != LDAP_SUCCESS; cleanup:; if ( mdn.bv_val != op->o_req_dn.bv_val ) { free( mdn.bv_val ); + BER_BVZERO( &mdn ); } - if ( mnewSuperior.bv_val != NULL - && mnewSuperior.bv_val != op->oq_modrdn.rs_newSup->bv_val ) { + if ( !BER_BVISNULL( &mnewSuperior ) + && mnewSuperior.bv_val != op->orr_newSup->bv_val ) + { free( mnewSuperior.bv_val ); + BER_BVZERO( &mnewSuperior ); } if ( rc == 0 ) { @@ -140,7 +140,7 @@ cleanup:; } /* else */ send_ldap_result( op, rs ); - return rc; + return rc; }