BerVarray memberof;
memberof_is_t what;
} memberof_cbinfo_t;
-
+
+static void
+memberof_set_backend( Operation *op_target, Operation *op, slap_overinst *on )
+{
+ BackendInfo *bi = op->o_bd->bd_info;
+
+ if ( bi->bi_type == memberof.on_bi.bi_type )
+ op_target->o_bd->bd_info = (BackendInfo *)on->on_info;
+}
+
static int
memberof_isGroupOrMember_cb( Operation *op, SlapReply *rs )
{
an[ 0 ].an_name = an[ 0 ].an_desc->ad_cname;
op2.ors_filterstr = mo->mo_groupFilterstr;
op2.ors_filter = &mo->mo_groupFilter;
+ op2.o_do_not_cache = 1; /* internal search, don't log */
- op2.o_bd->bd_info = (BackendInfo *)on->on_info;
+ memberof_set_backend( &op2, op, on );
(void)op->o_bd->be_search( &op2, &rs2 );
op2.o_bd->bd_info = bi;
an[ 0 ].an_name = an[ 0 ].an_desc->ad_cname;
op2.ors_filterstr = mo->mo_memberFilterstr;
op2.ors_filter = &mo->mo_memberFilter;
+ op2.o_do_not_cache = 1; /* internal search, don't log */
- op2.o_bd->bd_info = (BackendInfo *)on->on_info;
+ memberof_set_backend( &op2, op, on );
(void)op->o_bd->be_search( &op2, &rs2 );
op2.o_bd->bd_info = bi;
memberof_t *mo = (memberof_t *)on->on_bi.bi_private;
Operation op2 = *op;
+ unsigned long opid = op->o_opid;
SlapReply rs2 = { REP_RESULT };
slap_callback cb = { NULL, slap_null_cb, NULL, NULL };
Modifications mod[ 2 ] = { { { 0 } } }, *ml;
op2.orm_modlist = NULL;
/* Internal ops, never replicate these */
+ op2.o_opid = 0; /* shared with op, saved above */
op2.orm_no_opattrs = 1;
op2.o_dont_replicate = 1;
oex.oe_key = (void *)&memberof;
LDAP_SLIST_INSERT_HEAD(&op2.o_extra, &oex, oe_next);
- op2.o_bd->bd_info = (BackendInfo *)on->on_info;
+ memberof_set_backend( &op2, op, on );
(void)op->o_bd->be_modify( &op2, &rs2 );
op2.o_bd->bd_info = bi;
LDAP_SLIST_REMOVE(&op2.o_extra, &oex, OpExtra, oe_next);
oex.oe_key = (void *)&memberof;
LDAP_SLIST_INSERT_HEAD(&op2.o_extra, &oex, oe_next);
- op2.o_bd->bd_info = (BackendInfo *)on->on_info;
+ memberof_set_backend( &op2, op, on );
(void)op->o_bd->be_modify( &op2, &rs2 );
op2.o_bd->bd_info = bi;
LDAP_SLIST_REMOVE(&op2.o_extra, &oex, OpExtra, oe_next);
slap_mods_free( ml, 1 );
}
}
+ /* restore original opid */
+ op->o_opid = opid;
/* FIXME: if old_group_ndn doesn't exist, both delete __and__
* add will fail; better split in two operations, although
ber_memfree( a->a_nvals[ i ].bv_val );
BER_BVZERO( &a->a_nvals[ i ] );
}
+ a->a_numvals--;
if ( j - i == 1 ) {
break;
}
sizeof( struct berval ) * ( j - i ) );
}
i--;
- a->a_numvals--;
}
}
sc->sc_private = sc+1;
sc->sc_response = memberof_res_add;
sc->sc_cleanup = memberof_cleanup;
+ sc->sc_writewait = 0;
mci = sc->sc_private;
mci->on = on;
mci->member = NULL;
sc->sc_private = sc+1;
sc->sc_response = memberof_res_delete;
sc->sc_cleanup = memberof_cleanup;
+ sc->sc_writewait = 0;
mci = sc->sc_private;
mci->on = on;
mci->member = NULL;
assert( ml->sml_nvalues != NULL );
for ( i = 0; !BER_BVISNULL( &ml->sml_nvalues[ i ] ); i++ ) {
- int rc;
Entry *e;
/* ITS#6670 Ignore member pointing to this entry */
sc->sc_private = sc+1;
sc->sc_response = memberof_res_modify;
sc->sc_cleanup = memberof_cleanup;
+ sc->sc_writewait = 0;
mci = sc->sc_private;
mci->on = on;
mci->member = NULL;
sc->sc_private = sc+1;
sc->sc_response = memberof_res_modrdn;
sc->sc_cleanup = memberof_cleanup;
+ sc->sc_writewait = 0;
mci = sc->sc_private;
mci->on = on;
mci->member = NULL;