controls can be added in two passes (e.g. by backends that actually inherit their controls from someone else)

This commit is contained in:
Pierangelo Masarati 2005-01-26 10:28:37 +00:00
parent e047657f06
commit 5ec9684894

View File

@ -164,7 +164,8 @@ int backend_add(BackendInfo *aBackendInfo)
/* startup a specific backend database */ /* startup a specific backend database */
int backend_startup_one(Backend *be) int backend_startup_one(Backend *be)
{ {
int rc = 0; int rc = 0;
BackendInfo *bi = be->bd_info;
assert(be); assert(be);
@ -173,6 +174,17 @@ int backend_startup_one(Backend *be)
LDAP_TAILQ_INIT( be->be_pending_csn_list ); LDAP_TAILQ_INIT( be->be_pending_csn_list );
/* back-relay takes care of itself; so may do other */
if ( be->be_controls == NULL ) {
if ( overlay_is_over( be ) ) {
bi = ((slap_overinfo *)be->bd_info->bi_private)->oi_orig;
}
if ( bi->bi_controls ) {
be->be_controls = ldap_charray_dup( bi->bi_controls );
}
}
Debug( LDAP_DEBUG_TRACE, Debug( LDAP_DEBUG_TRACE,
"backend_startup: starting \"%s\"\n", "backend_startup: starting \"%s\"\n",
be->be_suffix ? be->be_suffix[0].bv_val : "(unknown)", be->be_suffix ? be->be_suffix[0].bv_val : "(unknown)",
@ -187,15 +199,27 @@ int backend_startup_one(Backend *be)
} }
/* back-relay takes care of itself; so may do other */ /* back-relay takes care of itself; so may do other */
if ( be->be_controls == NULL ) { bi = be->bd_info;
BackendInfo *bi = be->bd_info; if ( overlay_is_over( be ) ) {
bi = ((slap_overinfo *)be->bd_info->bi_private)->oi_orig;
}
if ( overlay_is_over( be ) ) { if ( bi->bi_controls ) {
bi = ((slap_overinfo *)be->bd_info->bi_private)->oi_orig; if ( be->be_controls == NULL ) {
}
if ( bi->bi_controls ) {
be->be_controls = ldap_charray_dup( bi->bi_controls ); be->be_controls = ldap_charray_dup( bi->bi_controls );
} else {
int i;
/* maybe not efficient, but it's startup and few dozens of controls... */
for ( i = 0; bi->bi_controls[ i ]; i++ ) {
if ( !ldap_charray_inlist( be->be_controls, bi->bi_controls[ i ] ) ) {
rc = ldap_charray_add( &be->be_controls, bi->bi_controls[ i ] );
if ( rc != 0 ) {
break;
}
}
}
} }
} }