X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=servers%2Fslapd%2Fmodrdn.c;h=84f08f464af43ff48c55013c42faae311fc0d2af;hb=b94d5e17e22b58b990dac4d4af5319be915366a6;hp=91f0442bee5615d1b3babc99baca7dc984e9fd56;hpb=0549d46adfa05cb6b5a51f9245452fa41c67020b;p=openldap diff --git a/servers/slapd/modrdn.c b/servers/slapd/modrdn.c index 91f0442bee..84f08f464a 100644 --- a/servers/slapd/modrdn.c +++ b/servers/slapd/modrdn.c @@ -1,7 +1,7 @@ /* $OpenLDAP$ */ /* This work is part of OpenLDAP Software . * - * Copyright 1998-2003 The OpenLDAP Foundation. + * Copyright 1998-2004 The OpenLDAP Foundation. * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -50,19 +50,26 @@ do_modrdn( SlapReply *rs ) { - struct berval dn = { 0, NULL }; - struct berval newrdn = { 0, NULL }; - struct berval newSuperior = { 0, NULL }; + struct berval dn = BER_BVNULL; + struct berval newrdn = BER_BVNULL; + struct berval newSuperior = BER_BVNULL; ber_int_t deloldrdn; - struct berval pnewSuperior = { 0, NULL }; + struct berval pnewSuperior = BER_BVNULL; - struct berval nnewSuperior = { 0, NULL }; + struct berval nnewSuperior = BER_BVNULL; Backend *newSuperior_be = NULL; ber_len_t length; int manageDSAit; + struct berval pdn = BER_BVNULL; + struct berval org_req_dn = BER_BVNULL; + struct berval org_req_ndn = BER_BVNULL; + struct berval org_dn = BER_BVNULL; + struct berval org_ndn = BER_BVNULL; + int org_managedsait; + #ifdef NEW_LOGGING LDAP_LOG( OPERATION, ENTRY, "do_modrdn: begin\n", 0, 0, 0 ); #else @@ -229,7 +236,7 @@ do_modrdn( goto cleanup; } - if( rdnValidate( &op->orr_newrdn ) != LDAP_SUCCESS ) { + if( rdn_validate( &op->orr_newrdn ) != LDAP_SUCCESS ) { #ifdef NEW_LOGGING LDAP_LOG( OPERATION, ERR, "do_modrdn: invalid rdn (%s).\n", op->orr_newrdn.bv_val, 0, 0 ); @@ -270,7 +277,8 @@ do_modrdn( * appropriate one, or send a referral to our "referral server" * if we don't hold it. */ - if ( (op->o_bd = select_backend( &op->o_req_ndn, manageDSAit, 0 )) == NULL ) { + op->o_bd = select_backend( &op->o_req_ndn, manageDSAit, 0 ); + if ( op->o_bd == NULL ) { rs->sr_ref = referral_rewrite( default_referral, NULL, &op->o_req_dn, LDAP_SCOPE_DEFAULT ); if (!rs->sr_ref) rs->sr_ref = default_referral; @@ -282,7 +290,7 @@ do_modrdn( if (rs->sr_ref != default_referral) ber_bvarray_free( rs->sr_ref ); } else { send_ldap_error( op, rs, LDAP_UNWILLING_TO_PERFORM, - "referral missing" ); + "no global superior knowledge" ); } goto cleanup; } @@ -354,12 +362,9 @@ do_modrdn( */ if ( op->o_bd->be_modrdn ) { /* do the update here */ - int repl_user = be_isupdate( op->o_bd, &op->o_ndn ); + int repl_user = be_isupdate( op ); #ifndef SLAPD_MULTIMASTER - if ( LDAP_STAILQ_EMPTY( &op->o_bd->be_syncinfo ) && - ( !op->o_bd->be_update_ndn.bv_len || repl_user )) -#else - if ( LDAP_STAILQ_EMPTY( &op->o_bd->be_syncinfo )) + if ( !SLAP_SHADOW(op->o_bd) || repl_user ) #endif { slap_callback cb = { NULL, slap_replog_cb, NULL, NULL }; @@ -373,20 +378,44 @@ do_modrdn( } op->o_bd->be_modrdn( op, rs ); -#ifndef SLAPD_MULTIMASTER - } else { - BerVarray defref = NULL; - if ( !LDAP_STAILQ_EMPTY( &op->o_bd->be_syncinfo )) { - syncinfo_t *si; - LDAP_STAILQ_FOREACH( si, &op->o_bd->be_syncinfo, si_next ) { - struct berval tmpbv; - ber_dupbv( &tmpbv, &si->si_provideruri_bv[0] ); - ber_bvarray_add( &defref, &tmpbv ); + if ( op->o_bd->be_delete ) { + org_req_dn = op->o_req_dn; + org_req_ndn = op->o_req_ndn; + org_dn = op->o_dn; + org_ndn = op->o_ndn; + org_managedsait = get_manageDSAit( op ); + op->o_dn = op->o_bd->be_rootdn; + op->o_ndn = op->o_bd->be_rootndn; + op->o_managedsait = 1; + + while ( rs->sr_err == LDAP_SUCCESS && + op->o_delete_glue_parent ) { + op->o_delete_glue_parent = 0; + if ( !be_issuffix( op->o_bd, &op->o_req_ndn )) { + slap_callback cb = { NULL }; + cb.sc_response = slap_null_cb; + dnParent( &op->o_req_ndn, &pdn ); + op->o_req_dn = pdn; + op->o_req_ndn = pdn; + op->o_callback = &cb; + op->o_bd->be_delete( op, rs ); + } else { + break; + } } - } else { - defref = op->o_bd->be_update_refs - ? op->o_bd->be_update_refs : default_referral; + op->o_managedsait = org_managedsait; + op->o_dn = org_dn; + op->o_ndn = org_ndn; + op->o_req_dn = org_req_dn; + op->o_req_ndn = org_req_ndn; + op->o_delete_glue_parent = 0; } + +#ifndef SLAPD_MULTIMASTER + } else { + BerVarray defref = op->o_bd->be_update_refs + ? op->o_bd->be_update_refs : default_referral; + if ( defref != NULL ) { rs->sr_ref = referral_rewrite( defref, NULL, &op->o_req_dn, LDAP_SCOPE_DEFAULT ); @@ -397,9 +426,8 @@ do_modrdn( if (rs->sr_ref != defref) ber_bvarray_free( rs->sr_ref ); } else { - send_ldap_error( op, rs, - LDAP_UNWILLING_TO_PERFORM, - "referral missing" ); + send_ldap_error( op, rs, LDAP_UNWILLING_TO_PERFORM, + "shadow context; no update referral" ); } #endif } @@ -453,7 +481,7 @@ slap_modrdn2mods( assert( new_rdn != NULL ); assert( !op->orr_deleteoldrdn || old_rdn != NULL ); - repl_user = be_isupdate( op->o_bd, &op->o_ndn ); + repl_user = be_isupdate( op ); /* Add new attribute values to the entry */ for ( a_cnt = 0; new_rdn[a_cnt]; a_cnt++ ) {