/* open frontend, if required */
if ( frontendDB->bd_info->bi_db_open ) {
- rc = frontendDB->bd_info->bi_db_open( frontendDB, NULL );
+ rc = frontendDB->bd_info->bi_db_open( frontendDB, &cr );
if ( rc != 0 ) {
Debug( LDAP_DEBUG_ANY,
"backend_startup: bi_db_open(frontend) failed! (%d)\n",
}
be->bd_info = bi;
- be->bd_orig = be;
+ be->bd_self = be;
be->be_def_limit = frontendDB->be_def_limit;
be->be_dfltaccess = frontendDB->be_dfltaccess;
return LDAP_UNWILLING_TO_PERFORM;
}
-typedef struct fe_extra {
- OpExtra fe_oe;
- BackendDB *fe_be;
-} fe_extra;
-
int
fe_acl_group(
Operation *op,
int rc;
GroupAssertion *g;
Backend *be = op->o_bd;
- fe_extra *fex;
+ OpExtra *oex;
- 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 )
+ LDAP_SLIST_FOREACH(oex, &op->o_extra, oe_next) {
+ if ( oex->oe_key == (void *)backend_group )
break;
}
- if ( fex && fex->fe_be )
- op->o_bd = fex->fe_be;
- else
+ if ( oex && ((OpExtraDB *)oex)->oe_db )
+ op->o_bd = ((OpExtraDB *)oex)->oe_db;
+
+ if ( !op->o_bd || !SLAP_DBHIDDEN( op->o_bd ))
op->o_bd = select_backend( gr_ndn, 0 );
for ( g = op->o_groups; g; g = g->ga_next ) {
{
int rc;
BackendDB *be_orig;
- fe_extra fex;
+ OpExtraDB oex;
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;
+ oex.oe_db = op->o_bd;
+ oex.oe.oe_key = (void *)backend_group;
+ LDAP_SLIST_INSERT_HEAD(&op->o_extra, &oex.oe, oe_next);
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 );
+ LDAP_SLIST_REMOVE(&op->o_extra, &oex.oe, OpExtra, oe_next);
return rc;
}
int freeattr = 0, i, j, rc = LDAP_SUCCESS;
AccessControlState acl_state = ACL_STATE_INIT;
Backend *be = op->o_bd;
- fe_extra *fex;
+ OpExtra *oex;
- for ( fex = (fe_extra *)op->o_extra; fex; fex = (fe_extra *)fex->fe_oe.oe_next ) {
- if ( fex->fe_oe.oe_key == (void *)backend_attribute )
+ LDAP_SLIST_FOREACH(oex, &op->o_extra, oe_next) {
+ if ( oex->oe_key == (void *)backend_attribute )
break;
}
- if ( fex && fex->fe_be )
- op->o_bd = fex->fe_be;
- else
+ if ( oex && ((OpExtraDB *)oex)->oe_db )
+ op->o_bd = ((OpExtraDB *)oex)->oe_db;
+
+ if ( !op->o_bd || !SLAP_DBHIDDEN( op->o_bd ))
op->o_bd = select_backend( edn, 0 );
if ( target && dn_match( &target->e_nname, edn ) ) {
{
int rc;
BackendDB *be_orig;
- fe_extra fex;
+ OpExtraDB oex;
- 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;
+ oex.oe_db = op->o_bd;
+ oex.oe.oe_key = (void *)backend_attribute;
+ LDAP_SLIST_INSERT_HEAD(&op->o_extra, &oex.oe, oe_next);
be_orig = op->o_bd;
op->o_bd = frontendDB;
rc = frontendDB->be_attribute( op, target, edn,
entry_at, vals, access );
op->o_bd = be_orig;
- slap_op_popextra( op, (OpExtra *)&fex );
+ LDAP_SLIST_REMOVE(&op->o_extra, &oex.oe, OpExtra, oe_next);
return rc;
}
assert( edn != NULL );
assert( access > ACL_NONE );
- if ( op->o_bd ) {
- if ( SLAP_ISOVERLAY( op->o_bd ))
- op->o_bd = op->o_bd->bd_orig;
- } else {
+ if ( !op->o_bd ) {
op->o_bd = select_backend( edn, 0 );
}
Attribute **ap;
int rc = LDAP_SUCCESS;
BackendDB *be_orig = op->o_bd;
- fe_extra *fex;
+ OpExtra *oex;
- 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 )
+ LDAP_SLIST_FOREACH(oex, &op->o_extra, oe_next) {
+ if ( oex->oe_key == (void *)backend_operational )
break;
}
}
/* Let the overlays have a chance at this */
- if ( fex && fex->fe_be ) {
- op->o_bd = fex->fe_be;
- } else {
+ if ( oex && ((OpExtraDB *)oex)->oe_db )
+ op->o_bd = ((OpExtraDB *)oex)->oe_db;
+
+ if ( !op->o_bd || !SLAP_DBHIDDEN( op->o_bd ))
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 )
{
int rc;
BackendDB *be_orig;
- fe_extra fex;
+ OpExtraDB oex;
- 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;
+ oex.oe_db = op->o_bd;
+ oex.oe.oe_key = (void *)backend_operational;
+ LDAP_SLIST_INSERT_HEAD(&op->o_extra, &oex.oe, oe_next);
/* 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 );
+ LDAP_SLIST_REMOVE(&op->o_extra, &oex.oe, OpExtra, oe_next);
return rc;
}