}
be->bd_info = bi;
+ be->bd_orig = be;
be->be_def_limit = frontendDB->be_def_limit;
be->be_dfltaccess = frontendDB->be_dfltaccess;
int rc;
GroupAssertion *g;
Backend *be = op->o_bd;
+ fe_extra *fex;
- op->o_bd = select_backend( gr_ndn, 0 );
+ for ( fex = (fe_extra *)op->o_extra; fex; fex = (fe_extra *)fex->fe_oe.oe_next ) {
+ if ( fex->fe_oe.oe_key == (void *)backend_group )
+ break;
+ }
+
+ if ( fex && fex->fe_be )
+ op->o_bd = fex->fe_be;
+ else
+ op->o_bd = select_backend( gr_ndn, 0 );
for ( g = op->o_groups; g; g = g->ga_next ) {
if ( g->ga_be != op->o_bd || g->ga_oc != group_oc ||
AttributeDescription *group_at )
{
int rc;
- BackendDB *be_orig;
+ BackendDB *be_orig;
+ fe_extra fex;
if ( op->o_abandon ) {
return SLAPD_ABANDON;
}
+ if ( op->o_bd && SLAP_ISOVERLAY( op->o_bd ))
+ fex.fe_be = op->o_bd->bd_orig;
+ else
+ fex.fe_be = op->o_bd;
+ fex.fe_oe.oe_key = (void *)backend_group;
+ fex.fe_oe.oe_next = op->o_extra;
+ op->o_extra = (OpExtra *)&fex;
+
be_orig = op->o_bd;
op->o_bd = frontendDB;
rc = frontendDB->be_group( op, target, gr_ndn,
op_ndn, group_oc, group_at );
op->o_bd = be_orig;
+ slap_op_popextra( op, (OpExtra *)&fex );
return rc;
}
fe_extra *fex;
for ( fex = (fe_extra *)op->o_extra; fex; fex = (fe_extra *)fex->fe_oe.oe_next ) {
- if ( fex->fe_oe.oe_key == (void *)frontend_init )
+ if ( fex->fe_oe.oe_key == (void *)backend_attribute )
break;
}
slap_access_t access )
{
int rc;
+ BackendDB *be_orig;
fe_extra fex;
- fex.fe_be = op->o_bd;
- fex.fe_oe.oe_key = (void *)frontend_init;
+ if ( op->o_bd && SLAP_ISOVERLAY( op->o_bd ))
+ fex.fe_be = op->o_bd->bd_orig;
+ else
+ fex.fe_be = op->o_bd;
+ fex.fe_oe.oe_key = (void *)backend_attribute;
fex.fe_oe.oe_next = op->o_extra;
op->o_extra = (OpExtra *)&fex;
+ be_orig = op->o_bd;
op->o_bd = frontendDB;
rc = frontendDB->be_attribute( op, target, edn,
entry_at, vals, access );
- op->o_bd = fex.fe_be;
+ op->o_bd = be_orig;
slap_op_popextra( op, (OpExtra *)&fex );
return rc;
assert( edn != NULL );
assert( access > ACL_NONE );
- op->o_bd = select_backend( edn, 0 );
+ if ( op->o_bd ) {
+ if ( SLAP_ISOVERLAY( op->o_bd ))
+ op->o_bd = op->o_bd->bd_orig;
+ } else {
+ op->o_bd = select_backend( edn, 0 );
+ }
if ( target && dn_match( &target->e_nname, edn ) ) {
e = target;
{
Attribute **ap;
int rc = LDAP_SUCCESS;
+ BackendDB *be_orig = op->o_bd;
+ fe_extra *fex;
+
+ for ( fex = (fe_extra *)op->o_extra; fex; fex = (fe_extra *)fex->fe_oe.oe_next ) {
+ if ( fex->fe_oe.oe_key == (void *)backend_operational )
+ break;
+ }
for ( ap = &rs->sr_operational_attrs; *ap; ap = &(*ap)->a_next )
/* just count them */ ;
ap = &(*ap)->a_next;
}
- if ( op->o_bd != NULL ) {
- BackendDB *be_orig = op->o_bd;
-
- /* Let the overlays have a chance at this */
+ /* Let the overlays have a chance at this */
+ if ( fex && fex->fe_be ) {
+ op->o_bd = fex->fe_be;
+ } else {
op->o_bd = select_backend( &op->o_req_ndn, 0 );
- if ( op->o_bd != NULL && !be_match( op->o_bd, frontendDB ) &&
- ( SLAP_OPATTRS( rs->sr_attr_flags ) || rs->sr_attrs ) &&
- op->o_bd->be_operational != NULL )
- {
- rc = op->o_bd->be_operational( op, rs );
- }
- op->o_bd = be_orig;
}
+ if ( op->o_bd != NULL && !be_match( op->o_bd, frontendDB ) &&
+ ( SLAP_OPATTRS( rs->sr_attr_flags ) || rs->sr_attrs ) &&
+ op->o_bd->be_operational != NULL )
+ {
+ rc = op->o_bd->be_operational( op, rs );
+ }
+ op->o_bd = be_orig;
return rc;
}
{
int rc;
BackendDB *be_orig;
+ fe_extra fex;
+
+ if ( op->o_bd && SLAP_ISOVERLAY( op->o_bd ))
+ fex.fe_be = op->o_bd->bd_orig;
+ else
+ fex.fe_be = op->o_bd;
+ fex.fe_oe.oe_key = (void *)backend_operational;
+ fex.fe_oe.oe_next = op->o_extra;
+ op->o_extra = (OpExtra *)&fex;
/* Moved this into the frontend so global overlays are called */
op->o_bd = frontendDB;
rc = frontendDB->be_operational( op, rs );
op->o_bd = be_orig;
+ slap_op_popextra( op, (OpExtra *)&fex );
return rc;
}