]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/backend.c
fix typo
[openldap] / servers / slapd / backend.c
index 7d6884a848d82f2d34343de09b677c7c77b14018..78c655cc64cb8e3fdcdb7c06a48a0b112ac3dd3a 100644 (file)
@@ -269,7 +269,7 @@ int backend_startup(Backend *be)
 
        /* 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",
@@ -585,6 +585,7 @@ backend_db_init(
        }
 
        be->bd_info = bi;
+       be->bd_self = be;
 
        be->be_def_limit = frontendDB->be_def_limit;
        be->be_dfltaccess = frontendDB->be_dfltaccess;
@@ -1349,8 +1350,18 @@ fe_acl_group(
        int rc;
        GroupAssertion *g;
        Backend *be = op->o_bd;
+       OpExtra         *oex;
 
-       op->o_bd = select_backend( gr_ndn, 0 );
+       LDAP_SLIST_FOREACH(oex, &op->o_extra, oe_next) {
+               if ( oex->oe_key == (void *)backend_group )
+                       break;
+       }
+
+       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 ) {
                if ( g->ga_be != op->o_bd || g->ga_oc != group_oc ||
@@ -1556,17 +1567,23 @@ backend_group(
        AttributeDescription *group_at )
 {
        int                     rc;
-       BackendDB               *be_orig;
+       BackendDB *be_orig;
+       OpExtraDB       oex;
 
        if ( op->o_abandon ) {
                return SLAPD_ABANDON;
        }
 
+       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;
+       LDAP_SLIST_REMOVE(&op->o_extra, &oex.oe, OpExtra, oe_next);
 
        return rc;
 }
@@ -1586,8 +1603,18 @@ fe_acl_attribute(
        int                     freeattr = 0, i, j, rc = LDAP_SUCCESS;
        AccessControlState      acl_state = ACL_STATE_INIT;
        Backend                 *be = op->o_bd;
+       OpExtra         *oex;
 
-       op->o_bd = select_backend( edn, 0 );
+       LDAP_SLIST_FOREACH(oex, &op->o_extra, oe_next) {
+               if ( oex->oe_key == (void *)backend_attribute )
+                       break;
+       }
+
+       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 ) ) {
                e = target;
@@ -1706,13 +1733,19 @@ backend_attribute(
        slap_access_t access )
 {
        int                     rc;
-       BackendDB               *be_orig;
+       BackendDB *be_orig;
+       OpExtraDB       oex;
+
+       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;
+       LDAP_SLIST_REMOVE(&op->o_extra, &oex.oe, OpExtra, oe_next);
 
        return rc;
 }
@@ -1738,7 +1771,9 @@ backend_access(
        assert( edn != NULL );
        assert( access > ACL_NONE );
 
-       op->o_bd = select_backend( edn, 0 );
+       if ( !op->o_bd ) {
+               op->o_bd = select_backend( edn, 0 );
+       }
 
        if ( target && dn_match( &target->e_nname, edn ) ) {
                e = target;
@@ -1830,7 +1865,14 @@ fe_aux_operational(
        SlapReply *rs )
 {
        Attribute               **ap;
-       int                     rc = 0;
+       int                     rc = LDAP_SUCCESS;
+       BackendDB               *be_orig = op->o_bd;
+       OpExtra         *oex;
+
+       LDAP_SLIST_FOREACH(oex, &op->o_extra, oe_next) {
+               if ( oex->oe_key == (void *)backend_operational )
+                       break;
+       }
 
        for ( ap = &rs->sr_operational_attrs; *ap; ap = &(*ap)->a_next )
                /* just count them */ ;
@@ -1856,19 +1898,20 @@ fe_aux_operational(
                ap = &(*ap)->a_next;
        }
 
-       if ( op->o_bd != NULL ) {
-               BackendDB               *be_orig = op->o_bd;
+       /* Let the overlays have a chance at this */
+       if ( oex && ((OpExtraDB *)oex)->oe_db )
+               op->o_bd = ((OpExtraDB *)oex)->oe_db;
 
-               /* Let the overlays have a chance at this */
+       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 )
-               {
-                       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;
 }
@@ -1877,6 +1920,11 @@ int backend_operational( Operation *op, SlapReply *rs )
 {
        int rc;
        BackendDB *be_orig;
+       OpExtraDB       oex;
+
+       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 */
 
@@ -1884,6 +1932,7 @@ int backend_operational( Operation *op, SlapReply *rs )
        op->o_bd = frontendDB;
        rc = frontendDB->be_operational( op, rs );
        op->o_bd = be_orig;
+       LDAP_SLIST_REMOVE(&op->o_extra, &oex.oe, OpExtra, oe_next);
 
        return rc;
 }