From: Howard Chu Date: Thu, 24 Apr 2008 10:13:39 +0000 (+0000) Subject: ITS#5346 from HEAD X-Git-Tag: OPENLDAP_REL_ENG_2_4_9~22 X-Git-Url: https://git.sur5r.net/?a=commitdiff_plain;h=03ee129fe59bc588d5ebcd86acc65000fd0a05ba;p=openldap ITS#5346 from HEAD --- diff --git a/servers/slapd/back-monitor/init.c b/servers/slapd/back-monitor/init.c index 1f82cfa9a4..3fd6cf978d 100644 --- a/servers/slapd/back-monitor/init.c +++ b/servers/slapd/back-monitor/init.c @@ -356,7 +356,7 @@ monitor_back_register_database_limbo( el.el_type = LIMBO_DATABASE; - el.el_be = be; + el.el_be = be->bd_self; el.el_ndn = ndn; for ( elpp = &mi->mi_entry_limbo; diff --git a/servers/slapd/backend.c b/servers/slapd/backend.c index 1314c10e6a..78c655cc64 100644 --- a/servers/slapd/backend.c +++ b/servers/slapd/backend.c @@ -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; diff --git a/servers/slapd/backover.c b/servers/slapd/backover.c index 8d3ed4022e..46d879b63b 100644 --- a/servers/slapd/backover.c +++ b/servers/slapd/backover.c @@ -29,43 +29,6 @@ static slap_overinst *overlays; -enum db_which { - db_open = 0, - db_close, - db_destroy, - db_last -}; - -static int -over_db_func( - BackendDB *be, - ConfigReply *cr, - enum db_which which -) -{ - slap_overinfo *oi = be->bd_info->bi_private; - slap_overinst *on = oi->oi_list; - BackendInfo *bi_orig = be->bd_info; - BI_db_open **func; - int rc = 0; - - func = &oi->oi_orig->bi_db_open; - if ( func[which] ) { - be->bd_info = oi->oi_orig; - rc = func[which]( be, cr ); - } - - for (; on && rc == 0; on=on->on_next) { - be->bd_info = &on->on_bi; - func = &on->on_bi.bi_db_open; - if (func[which]) { - rc = func[which]( be, cr ); - } - } - be->bd_info = bi_orig; - return rc; -} - static int over_db_config( BackendDB *be, @@ -173,7 +136,25 @@ over_db_open( ConfigReply *cr ) { - return over_db_func( be, cr, db_open ); + slap_overinfo *oi = be->bd_info->bi_private; + slap_overinst *on = oi->oi_list; + BackendDB db = *be; + int rc = 0; + + db.be_flags |= SLAP_DBFLAG_OVERLAY; + db.bd_info = oi->oi_orig; + if ( db.bd_info->bi_db_open ) { + rc = db.bd_info->bi_db_open( &db, cr ); + } + + for (; on && rc == 0; on=on->on_next) { + db.bd_info = &on->on_bi; + if ( db.bd_info->bi_db_open ) { + rc = db.bd_info->bi_db_open( &db, cr ); + } + } + + return rc; } static int @@ -211,17 +192,29 @@ over_db_destroy( { slap_overinfo *oi = be->bd_info->bi_private; slap_overinst *on = oi->oi_list, *next; + BackendInfo *bi_orig = be->bd_info; int rc; - rc = over_db_func( be, cr, db_destroy ); + be->bd_info = oi->oi_orig; + if ( be->bd_info->bi_db_destroy ) { + rc = be->bd_info->bi_db_destroy( be, cr ); + } + for (; on && rc == 0; on=on->on_next) { + be->bd_info = &on->on_bi; + if ( be->bd_info->bi_db_destroy ) { + rc = be->bd_info->bi_db_destroy( be, cr ); + } + } + + on = oi->oi_list; if ( on ) { for (next = on->on_next; on; on=next) { next = on->on_next; free( on ); } } - + be->bd_info = bi_orig; free( oi ); return rc; } diff --git a/servers/slapd/frontend.c b/servers/slapd/frontend.c index 63271f6882..4ab36e5a2a 100644 --- a/servers/slapd/frontend.c +++ b/servers/slapd/frontend.c @@ -93,6 +93,7 @@ frontend_init( void ) { /* data */ frontendDB = &slap_frontendDB; + frontendDB->bd_self = frontendDB; /* ACLs */ frontendDB->be_dfltaccess = ACL_READ; diff --git a/servers/slapd/slap.h b/servers/slapd/slap.h index 8507e3cc93..da02058f8c 100644 --- a/servers/slapd/slap.h +++ b/servers/slapd/slap.h @@ -1707,6 +1707,7 @@ struct ConfigOCs; /* config.h */ struct BackendDB { BackendInfo *bd_info; /* pointer to shared backend info */ + BackendDB *bd_self; /* pointer to this struct */ /* fields in this structure (and routines acting on this structure) should be renamed from be_ to bd_ */