mirror of
https://git.openldap.org/openldap/openldap.git
synced 2025-12-23 08:09:34 -05:00
allow backends to automatically install overlays; issue warnings in case of duplicates (fixes ITS#3395 for cases (1.a), (1.b) and (2) simultaneously)
This commit is contained in:
parent
04b078d6eb
commit
ee4c10d5d0
2 changed files with 52 additions and 4 deletions
|
|
@ -265,7 +265,7 @@ ldap_back_db_config(
|
||||||
|| strcasecmp( argv[0], "map" ) == 0
|
|| strcasecmp( argv[0], "map" ) == 0
|
||||||
|| strncasecmp( argv[0], "rewrite", STRLENOF( "rewrite" ) ) == 0 )
|
|| strncasecmp( argv[0], "rewrite", STRLENOF( "rewrite" ) ) == 0 )
|
||||||
{
|
{
|
||||||
if ( li->rwm_started == 0 && !overlay_is_inst( be, "rwm" ) ) {
|
if ( li->rwm_started == 0 ) {
|
||||||
if ( overlay_config( be, "rwm" ) ) {
|
if ( overlay_config( be, "rwm" ) ) {
|
||||||
fprintf( stderr, "%s: line %d: "
|
fprintf( stderr, "%s: line %d: "
|
||||||
"unable to configure the \"rwm\" "
|
"unable to configure the \"rwm\" "
|
||||||
|
|
|
||||||
|
|
@ -77,6 +77,48 @@ over_db_config(
|
||||||
be->bd_info = oi->oi_orig;
|
be->bd_info = oi->oi_orig;
|
||||||
rc = oi->oi_orig->bi_db_config( be, fname, lineno,
|
rc = oi->oi_orig->bi_db_config( be, fname, lineno,
|
||||||
argc, argv );
|
argc, argv );
|
||||||
|
|
||||||
|
if ( be->bd_info != oi->oi_orig ) {
|
||||||
|
slap_overinfo *oi2;
|
||||||
|
slap_overinst *on2, **onp;
|
||||||
|
BackendDB be2 = *be;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
/* a database added an overlay;
|
||||||
|
* work it around... */
|
||||||
|
assert( overlay_is_over( be ) );
|
||||||
|
|
||||||
|
oi2 = ( slap_overinfo * )be->bd_info->bi_private;
|
||||||
|
on2 = oi2->oi_list;
|
||||||
|
|
||||||
|
/* need to put a uniqueness check here as well;
|
||||||
|
* note that in principle there could be more than
|
||||||
|
* one overlay as a result of multiple calls to
|
||||||
|
* overlay_config() */
|
||||||
|
be2.bd_info = (BackendInfo *)oi;
|
||||||
|
|
||||||
|
for ( i = 0, onp = &on2; *onp; i++, onp = &(*onp)->on_next ) {
|
||||||
|
if ( overlay_is_inst( &be2, (*onp)->on_bi.bi_type ) ) {
|
||||||
|
Debug( LDAP_DEBUG_ANY, "over_db_config(): "
|
||||||
|
"warning, freshly added "
|
||||||
|
"overlay #%d \"%s\" is already in list\n",
|
||||||
|
i, (*onp)->on_bi.bi_type, 0 );
|
||||||
|
|
||||||
|
/* NOTE: if the overlay already exists,
|
||||||
|
* there is no way to merge the results
|
||||||
|
* of the configuration that may have
|
||||||
|
* occurred during bi_db_config(); we
|
||||||
|
* just issue a warning, and the
|
||||||
|
* administrator should deal with this */
|
||||||
|
}
|
||||||
|
}
|
||||||
|
*onp = oi->oi_list;
|
||||||
|
|
||||||
|
oi->oi_list = on2;
|
||||||
|
|
||||||
|
ch_free( be->bd_info );
|
||||||
|
}
|
||||||
|
|
||||||
be->bd_info = (BackendInfo *)oi;
|
be->bd_info = (BackendInfo *)oi;
|
||||||
if ( rc != SLAP_CONF_UNKNOWN ) return rc;
|
if ( rc != SLAP_CONF_UNKNOWN ) return rc;
|
||||||
}
|
}
|
||||||
|
|
@ -404,8 +446,8 @@ overlay_config( BackendDB *be, const char *ov )
|
||||||
BackendInfo *bi = NULL;
|
BackendInfo *bi = NULL;
|
||||||
|
|
||||||
on = overlay_find( ov );
|
on = overlay_find( ov );
|
||||||
if (!on) {
|
if ( !on ) {
|
||||||
Debug( LDAP_DEBUG_ANY, "overlay %s not found\n", ov, 0, 0 );
|
Debug( LDAP_DEBUG_ANY, "overlay \"%s\" not found\n", ov, 0, 0 );
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -413,7 +455,7 @@ overlay_config( BackendDB *be, const char *ov )
|
||||||
* overlay info structure
|
* overlay info structure
|
||||||
*/
|
*/
|
||||||
if ( !overlay_is_over( be ) ) {
|
if ( !overlay_is_over( be ) ) {
|
||||||
oi = ch_malloc( sizeof(slap_overinfo) );
|
oi = ch_malloc( sizeof( slap_overinfo ) );
|
||||||
oi->oi_orig = be->bd_info;
|
oi->oi_orig = be->bd_info;
|
||||||
oi->oi_bi = *be->bd_info;
|
oi->oi_bi = *be->bd_info;
|
||||||
|
|
||||||
|
|
@ -457,6 +499,12 @@ overlay_config( BackendDB *be, const char *ov )
|
||||||
be->bd_info = bi;
|
be->bd_info = bi;
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
|
if ( overlay_is_inst( be, ov ) ) {
|
||||||
|
Debug( LDAP_DEBUG_ANY, "overlay_config(): "
|
||||||
|
"warning, overlay \"%s\" "
|
||||||
|
"already in list\n", ov, 0, 0 );
|
||||||
|
}
|
||||||
|
|
||||||
oi = be->bd_info->bi_private;
|
oi = be->bd_info->bi_private;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue