mirror of
https://git.openldap.org/openldap/openldap.git
synced 2024-12-21 03:10:25 +08:00
ITS#5346 overlay_db_open needs to preserve the original *be.
This commit is contained in:
parent
c0f5fad0f8
commit
75eecdc539
@ -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;
|
||||
}
|
||||
|
@ -1707,7 +1707,7 @@ struct ConfigOCs; /* config.h */
|
||||
|
||||
struct BackendDB {
|
||||
BackendInfo *bd_info; /* pointer to shared backend info */
|
||||
struct BackendDB *bd_self; /* pointer to this struct */
|
||||
BackendDB *bd_self; /* pointer to this struct */
|
||||
|
||||
/* fields in this structure (and routines acting on this structure)
|
||||
should be renamed from be_ to bd_ */
|
||||
|
Loading…
Reference in New Issue
Block a user