]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/backover.c
ITS#3777 fix scheme comparison
[openldap] / servers / slapd / backover.c
index 1994ba7ff8891d573d9f8948ae614d5e9d76d9e8..047af4497b5d5ade70ad2360068873c0adb91ccb 100644 (file)
@@ -25,6 +25,7 @@
 
 #define SLAPD_TOOLS
 #include "slap.h"
+#include "config.h"
 
 static slap_overinst *overlays;
 
@@ -71,10 +72,14 @@ over_db_config(
        slap_overinfo *oi = be->bd_info->bi_private;
        slap_overinst *on = oi->oi_list;
        BackendInfo *bi_orig = be->bd_info;
+       struct ConfigOCs *be_cf_ocs = be->be_cf_ocs;
+       ConfigArgs ca = {0};
+       ConfigTable *ct;
        int rc = 0;
 
        if ( oi->oi_orig->bi_db_config ) {
                be->bd_info = oi->oi_orig;
+               be->be_cf_ocs = oi->oi_orig->bi_cf_ocs;
                rc = oi->oi_orig->bi_db_config( be, fname, lineno,
                        argc, argv );
 
@@ -123,8 +128,22 @@ over_db_config(
                if ( rc != SLAP_CONF_UNKNOWN ) return rc;
        }
 
+       ca.argv = argv;
+       ca.argc = argc;
+       ca.fname = fname;
+       ca.lineno = lineno;
+       ca.be = be;
        for (; on; on=on->on_next) {
-               if (on->on_bi.bi_db_config) {
+               rc = SLAP_CONF_UNKNOWN;
+               if (on->on_bi.bi_cf_ocs) {
+                       ConfigTable *ct;
+                       ca.bi = &on->on_bi;
+                       ct = config_find_keyword( on->on_bi.bi_cf_ocs->co_table, &ca );
+                       if ( ct ) {
+                               rc = config_add_vals( ct, &ca );
+                       }
+               }
+               if (on->on_bi.bi_db_config && rc == SLAP_CONF_UNKNOWN) {
                        be->bd_info = &on->on_bi;
                        rc = on->on_bi.bi_db_config( be, fname, lineno,
                                argc, argv );
@@ -132,6 +151,8 @@ over_db_config(
                }
        }
        be->bd_info = bi_orig;
+       be->be_cf_ocs = be_cf_ocs;
+       
        return rc;
 }
 
@@ -261,6 +282,7 @@ over_access_allowed(
 {
        slap_overinfo *oi;
        slap_overinst *on;
+       BackendInfo *bi = op->o_bd->bd_info;
        BackendDB *be = op->o_bd, db;
        int rc = SLAP_CB_CONTINUE;
 
@@ -287,20 +309,22 @@ over_access_allowed(
                }
        }
 
-       if ( rc == SLAP_CB_CONTINUE && oi->oi_orig->bi_access_allowed ) {
-               /* NOTE: do not copy the structure until requiredy */
-               /* NOTE: by default, oi->oi_orig->bi_access_allowed == NULL;
-                * only backends that implement a specific hook
-                * should store it there; by default, slap_access_allowed()
-                * is invoked if oi->oi_orig->bi_access_allowed == NULL */
-               if ( !SLAP_ISOVERLAY( op->o_bd ) ) {
-                       db = *op->o_bd;
-                       db.be_flags |= SLAP_DBFLAG_OVERLAY;
-                       op->o_bd = &db;
+       if ( rc == SLAP_CB_CONTINUE ) {
+               BI_access_allowed       *bi_access_allowed;
+
+               /* if the database structure was changed, o_bd points to a
+                * copy of the structure; put the original bd_info in place */
+               if ( SLAP_ISOVERLAY( op->o_bd ) ) {
+                       op->o_bd->bd_info = oi->oi_orig;
                }
 
-               op->o_bd->bd_info = oi->oi_orig;
-               rc = oi->oi_orig->bi_access_allowed( op, e,
+               if ( oi->oi_orig->bi_access_allowed ) {
+                       bi_access_allowed = oi->oi_orig->bi_access_allowed;
+               } else {
+                       bi_access_allowed = slap_access_allowed;
+               }
+
+               rc = bi_access_allowed( op, e,
                        desc, val, access, state, maskp );
        }
        /* should not fall thru this far without anything happening... */
@@ -310,6 +334,8 @@ over_access_allowed(
        }
 
        op->o_bd = be;
+       op->o_bd->bd_info = bi;
+
        return rc;
 }
 #endif /* SLAP_OVERLAY_ACCESS */
@@ -633,6 +659,27 @@ overlay_register_control( BackendDB *be, const char *oid )
        return rc;
 }
 
+void
+overlay_destroy_one( BackendDB *be, slap_overinst *on )
+{
+       slap_overinfo *oi = on->on_info;
+       slap_overinst **oidx;
+
+       for ( oidx = &oi->oi_list; *oidx; oidx = &(*oidx)->on_next ) {
+               if ( *oidx == on ) {
+                       *oidx = on->on_next;
+                       if ( on->on_bi.bi_db_destroy ) {
+                               BackendInfo *bi_orig = be->bd_info;
+                               be->bd_info = (BackendInfo *)on;
+                               on->on_bi.bi_db_destroy( be );
+                               be->bd_info = bi_orig;
+                       }
+                       free( on );
+                       break;
+               }
+       }
+}
+
 /* add an overlay to a particular backend. */
 int
 overlay_config( BackendDB *be, const char *ov )