]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/back-ldbm/modrdn.c
Notices and acknowledgements
[openldap] / servers / slapd / back-ldbm / modrdn.c
index 41db98229b2807fa65a427a021f69057dd3aeeaa..c290fa9af1c8a950cb0d290b0aa8885846d05db6 100644 (file)
@@ -80,17 +80,31 @@ ldbm_back_modrdn(
        /* grab giant lock for writing */
        ldap_pvt_thread_rdwr_wlock(&li->li_giant_rwlock);
 
+       e = dn2entry_w( op->o_bd, &op->o_req_ndn, &matched );
+
        /* get entry with writer lock */
-       if ( (e = dn2entry_w( op->o_bd, &op->o_req_ndn, &matched )) == NULL ) {
-               if( matched != NULL ) {
+       /* FIXME: dn2entry() should return non-glue entry */
+       if (( e == NULL  ) || ( !manageDSAit && e && is_entry_glue( e ))) {
+               if ( matched != NULL ) {
                        rs->sr_matched = strdup( matched->e_dn );
                        rs->sr_ref = is_entry_referral( matched )
                                ? get_entry_referrals( op, matched )
                                : NULL;
                        cache_return_entry_r( &li->li_cache, matched );
                } else {
-                       rs->sr_ref = referral_rewrite( default_referral,
-                               NULL, &op->o_req_dn, LDAP_SCOPE_DEFAULT );
+                       BerVarray deref = 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( &deref, &tmpbv );
+                               }
+                       } else {
+                               deref = default_referral;
+                       }
+                       rs->sr_ref = referral_rewrite( deref, NULL, &op->o_req_dn,
+                                                       LDAP_SCOPE_DEFAULT );
                }
 
                ldap_pvt_thread_rdwr_wunlock(&li->li_giant_rwlock);
@@ -100,8 +114,9 @@ ldbm_back_modrdn(
 
                if ( rs->sr_ref ) ber_bvarray_free( rs->sr_ref );
                free( (char *)rs->sr_matched );
-
-               return( -1 );
+               rs->sr_ref = NULL;
+               rs->sr_matched = NULL;
+               return rs->sr_err;
        }
 
        /* check entry for "entry" acl */
@@ -111,7 +126,7 @@ ldbm_back_modrdn(
 #ifdef NEW_LOGGING
                LDAP_LOG( BACK_LDBM, ERR, 
                        "ldbm_back_modrdn: no write access to entry of (%s)\n", 
-                       dn->bv_val, 0, 0 );
+                       op->o_req_dn.bv_val, 0, 0 );
 #else
                Debug( LDAP_DEBUG_TRACE,
                        "<=- ldbm_back_modrdn: no write access to entry\n", 0,
@@ -142,6 +157,8 @@ ldbm_back_modrdn(
                send_ldap_result( op, rs );
 
                if ( rs->sr_ref ) ber_bvarray_free( rs->sr_ref );
+               rs->sr_ref = NULL;
+               rs->sr_matched = NULL;
                goto return_results;
        }
 
@@ -261,7 +278,7 @@ ldbm_back_modrdn(
 #ifdef NEW_LOGGING
                                LDAP_LOG( BACK_LDBM, ERR, 
                                        "ldbm_back_modrdn: (%s) has no parent & not a root.\n", 
-                                       dn, 0, 0 );
+                                       op->o_ndn, 0, 0 );
 #else
                                Debug( LDAP_DEBUG_TRACE,
                                        "<=- ldbm_back_modrdn: no parent & "
@@ -341,11 +358,11 @@ ldbm_back_modrdn(
 #ifdef NEW_LOGGING
                        LDAP_LOG( BACK_LDBM, DETAIL1,
                                "ldbm_back_modrdn: wr to new parent OK np=%p, id=%ld\n",
-                               np, np->e_id, 0 );
+                               (void *) np, np->e_id, 0 );
 #else
                        Debug( LDAP_DEBUG_TRACE,
                                "ldbm_back_modrdn: wr to new parent OK np=%p, id=%ld\n",
-                               np, np->e_id, 0 );
+                               (void *) np, np->e_id, 0 );
 #endif
 
                        /* check newSuperior for "children" acl */
@@ -465,8 +482,8 @@ ldbm_back_modrdn(
        }
        
        /* Build target dn and make sure target entry doesn't exist already. */
-       build_new_dn( &new_dn, new_parent_dn, &op->oq_modrdn.rs_newrdn ); 
-       dnNormalize2( NULL, &new_dn, &new_ndn, op->o_tmpmemctx );
+       build_new_dn( &new_dn, new_parent_dn, &op->oq_modrdn.rs_newrdn, NULL ); 
+       dnNormalize( 0, NULL, NULL, &new_dn, &new_ndn, NULL );
 
 #ifdef NEW_LOGGING
        LDAP_LOG( BACK_LDBM, DETAIL1, "ldbm_back_modrdn: new ndn=%s\n", 
@@ -629,6 +646,7 @@ ldbm_back_modrdn(
        }
 
        rs->sr_err = LDAP_SUCCESS;
+       rs->sr_text = NULL;
        send_ldap_result( op, rs );
        rc = 0;
        cache_entry_commit( e );
@@ -647,10 +665,16 @@ return_results:
        if ( mod != NULL ) {
                Modifications *tmp;
                for (; mod; mod = tmp ) {
+                       /* slap_modrdn2mods does things one way,
+                        * slap_mods_opattrs does it differently
+                        */
+                       if ( mod->sml_op != SLAP_MOD_SOFTADD &&
+                               mod->sml_op != LDAP_MOD_DELETE ) break;
                        if ( mod->sml_nvalues ) free( mod->sml_nvalues[0].bv_val );
                        tmp = mod->sml_next;
                        free( mod );
                }
+               slap_mods_free( mod );
        }
 
        /* LDAP v3 Support */
@@ -673,5 +697,6 @@ return_results:
                entry_free( e );
        }
        ldap_pvt_thread_rdwr_wunlock(&li->li_giant_rwlock);
+       rs->sr_text = NULL;
        return( rc );
 }