]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/overlays/memberof.c
Partial revert of f30269f5d2e4bb5ee7486fe6542078d1b59dba6d
[openldap] / servers / slapd / overlays / memberof.c
index 4fa3946973cdbd8f34ac331c6b55553a6004ee0f..502cb46fc1bd4f8037fe32dd158d21b4437bf918 100644 (file)
@@ -357,6 +357,10 @@ memberof_value_modify(
        op2.o_ndn = op->o_bd->be_rootndn;
        op2.orm_modlist = NULL;
 
+       /* Internal ops, never replicate these */
+       op2.orm_no_opattrs = 1;
+       op2.o_dont_replicate = 1;
+
        if ( !BER_BVISNULL( &mo->mo_ndn ) ) {
                ml = &mod[ mcnt ];
                ml->sml_numvals = 1;
@@ -387,9 +391,11 @@ memberof_value_modify(
        ml->sml_flags = SLAP_MOD_INTERNAL;
        ml->sml_next = op2.orm_modlist;
        op2.orm_modlist = ml;
-       op2.orm_no_opattrs = 0;
 
        if ( new_ndn != NULL ) {
+               BackendInfo *bi = op2.o_bd->bd_info;
+               OpExtra oex;
+
                assert( !BER_BVISNULL( new_dn ) );
                assert( !BER_BVISNULL( new_ndn ) );
 
@@ -399,12 +405,17 @@ memberof_value_modify(
                ml->sml_values[ 0 ] = *new_dn;
                ml->sml_nvalues[ 0 ] = *new_ndn;
 
+               oex.oe_key = (void *)&memberof;
+               LDAP_SLIST_INSERT_HEAD(&op2.o_extra, &oex, oe_next);
+               op2.o_bd->bd_info = (BackendInfo *)on->on_info;
                (void)op->o_bd->be_modify( &op2, &rs2 );
+               op2.o_bd->bd_info = bi;
+               LDAP_SLIST_REMOVE(&op2.o_extra, &oex, OpExtra, oe_next);
                if ( rs2.sr_err != LDAP_SUCCESS ) {
                        char buf[ SLAP_TEXT_BUFLEN ];
                        snprintf( buf, sizeof( buf ),
-                               "memberof_value_modify %s=\"%s\" failed err=%d",
-                               ad->ad_cname.bv_val, new_dn->bv_val, rs2.sr_err );
+                               "memberof_value_modify DN=\"%s\" add %s=\"%s\" failed err=%d",
+                               op2.o_req_dn.bv_val, ad->ad_cname.bv_val, new_dn->bv_val, rs2.sr_err );
                        Debug( LDAP_DEBUG_ANY, "%s: %s\n",
                                op->o_log_prefix, buf, 0 );
                }
@@ -424,6 +435,9 @@ memberof_value_modify(
        }
 
        if ( old_ndn != NULL ) {
+               BackendInfo *bi = op2.o_bd->bd_info;
+               OpExtra oex;
+
                assert( !BER_BVISNULL( old_dn ) );
                assert( !BER_BVISNULL( old_ndn ) );
 
@@ -433,12 +447,17 @@ memberof_value_modify(
                ml->sml_values[ 0 ] = *old_dn;
                ml->sml_nvalues[ 0 ] = *old_ndn;
 
+               oex.oe_key = (void *)&memberof;
+               LDAP_SLIST_INSERT_HEAD(&op2.o_extra, &oex, oe_next);
+               op2.o_bd->bd_info = (BackendInfo *)on->on_info;
                (void)op->o_bd->be_modify( &op2, &rs2 );
+               op2.o_bd->bd_info = bi;
+               LDAP_SLIST_REMOVE(&op2.o_extra, &oex, OpExtra, oe_next);
                if ( rs2.sr_err != LDAP_SUCCESS ) {
                        char buf[ SLAP_TEXT_BUFLEN ];
                        snprintf( buf, sizeof( buf ),
-                               "memberof_value_modify %s=\"%s\" failed err=%d",
-                               ad->ad_cname.bv_val, old_dn->bv_val, rs2.sr_err );
+                               "memberof_value_modify DN=\"%s\" delete %s=\"%s\" failed err=%d",
+                               op2.o_req_dn.bv_val, ad->ad_cname.bv_val, old_dn->bv_val, rs2.sr_err );
                        Debug( LDAP_DEBUG_ANY, "%s: %s\n",
                                op->o_log_prefix, buf, 0 );
                }
@@ -492,6 +511,12 @@ memberof_op_add( Operation *op, SlapReply *rs )
        struct berval   save_dn, save_ndn;
        slap_callback *sc;
        memberof_cbinfo_t *mci;
+       OpExtra         *oex;
+
+       LDAP_SLIST_FOREACH( oex, &op->o_extra, oe_next ) {
+               if ( oex->oe_key == (void *)&memberof )
+                       return SLAP_CB_CONTINUE;
+       }
 
        if ( op->ora_e->e_attrs == NULL ) {
                /* FIXME: global overlay; need to deal with */
@@ -720,7 +745,12 @@ memberof_op_delete( Operation *op, SlapReply *rs )
 
        slap_callback *sc;
        memberof_cbinfo_t *mci;
+       OpExtra         *oex;
 
+       LDAP_SLIST_FOREACH( oex, &op->o_extra, oe_next ) {
+               if ( oex->oe_key == (void *)&memberof )
+                       return SLAP_CB_CONTINUE;
+       }
 
        sc = op->o_tmpalloc( sizeof(slap_callback)+sizeof(*mci), op->o_tmpmemctx );
        sc->sc_private = sc+1;
@@ -754,6 +784,12 @@ memberof_op_modify( Operation *op, SlapReply *rs )
        struct berval   save_dn, save_ndn;
        slap_callback *sc;
        memberof_cbinfo_t *mci, mcis;
+       OpExtra         *oex;
+
+       LDAP_SLIST_FOREACH( oex, &op->o_extra, oe_next ) {
+               if ( oex->oe_key == (void *)&memberof )
+                       return SLAP_CB_CONTINUE;
+       }
 
        if ( MEMBEROF_REVERSE( mo ) ) {
                for ( mlp = &op->orm_modlist; *mlp; mlp = &(*mlp)->sml_next ) {
@@ -1165,6 +1201,12 @@ memberof_op_modrdn( Operation *op, SlapReply *rs )
        slap_overinst   *on = (slap_overinst *)op->o_bd->bd_info;
        slap_callback *sc;
        memberof_cbinfo_t *mci;
+       OpExtra         *oex;
+
+       LDAP_SLIST_FOREACH( oex, &op->o_extra, oe_next ) {
+               if ( oex->oe_key == (void *)&memberof )
+                       return SLAP_CB_CONTINUE;
+       }
 
        sc = op->o_tmpalloc( sizeof(slap_callback)+sizeof(*mci), op->o_tmpmemctx );
        sc->sc_private = sc+1;