--- servers/slapd/root_dse.c 2004/10/01 05:33:17 1.94 +++ servers/slapd/root_dse.c 2005/04/29 21:29:05 1.95.2.4 @@ -1,8 +1,8 @@ /* root_dse.c - Provides the Root DSA-Specific Entry */ -/* $OpenLDAP: pkg/ldap/servers/slapd/root_dse.c,v 1.93 2004/09/04 02:54:30 kurt Exp $ */ +/* $OpenLDAP: pkg/ldap/servers/slapd/root_dse.c,v 1.95.2.3 2005/03/14 22:33:12 kurt Exp $ */ /* This work is part of OpenLDAP Software . * - * Copyright 1999-2004 The OpenLDAP Foundation. + * Copyright 1999-2005 The OpenLDAP Foundation. * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -34,9 +34,10 @@ static struct berval supportedFeatures[] BER_BVC(LDAP_FEATURE_ABSOLUTE_FILTERS), /* (&) and (|) search filters */ BER_BVC(LDAP_FEATURE_LANGUAGE_TAG_OPTIONS), /* Language Tag Options */ BER_BVC(LDAP_FEATURE_LANGUAGE_RANGE_OPTIONS),/* Language Range Options */ - -#ifdef LDAP_DEVEL +#ifdef LDAP_FEATURE_SUBORDINATE_SCOPE BER_BVC(LDAP_FEATURE_SUBORDINATE_SCOPE), /* "children" search scope */ +#endif +#ifdef LDAP_FEATURE_MODIFY_INCREMENT BER_BVC(LDAP_FEATURE_MODIFY_INCREMENT), /* Modify/increment */ #endif {0,NULL} @@ -51,10 +52,11 @@ root_dse_info( const char **text ) { Entry *e; - struct berval vals[2], *bv; - struct berval nvals[2]; + struct berval val, *bv; + struct berval nval; int i, j; char ** supportedSASLMechanisms; + BackendDB *be; AttributeDescription *ad_structuralObjectClass = slap_schema.si_ad_structuralObjectClass; @@ -72,12 +74,11 @@ root_dse_info( = slap_schema.si_ad_supportedFeatures; AttributeDescription *ad_monitorContext = slap_schema.si_ad_monitorContext; + AttributeDescription *ad_configContext + = slap_schema.si_ad_configContext; AttributeDescription *ad_ref = slap_schema.si_ad_ref; - vals[1].bv_val = NULL; - nvals[1].bv_val = NULL; - e = (Entry *) SLAP_CALLOC( 1, sizeof(Entry) ); if( e == NULL ) { @@ -98,42 +99,51 @@ root_dse_info( e->e_private = NULL; - vals[0].bv_val = "top"; - vals[0].bv_len = sizeof("top")-1; - if( attr_merge( e, ad_objectClass, vals, NULL ) ) { + BER_BVSTR( &val, "top" ); + if( attr_merge_one( e, ad_objectClass, &val, NULL ) ) { return LDAP_OTHER; } - vals[0].bv_val = "OpenLDAProotDSE"; - vals[0].bv_len = sizeof("OpenLDAProotDSE")-1; - if( attr_merge( e, ad_objectClass, vals, NULL ) ) { + BER_BVSTR( &val, "OpenLDAProotDSE" ); + if( attr_merge_one( e, ad_objectClass, &val, NULL ) ) { return LDAP_OTHER; } - if( attr_merge( e, ad_structuralObjectClass, vals, NULL ) ) { + if( attr_merge_one( e, ad_structuralObjectClass, &val, NULL ) ) { return LDAP_OTHER; } - for ( i = 0; i < nbackends; i++ ) { - if ( backends[i].be_suffix == NULL - || backends[i].be_nsuffix == NULL ) { + LDAP_STAILQ_FOREACH( be, &backendDB, be_next ) { + if ( be->be_suffix == NULL + || be->be_nsuffix == NULL ) { /* no suffix! */ continue; } - if ( SLAP_MONITOR( &backends[i] )) { - vals[0] = backends[i].be_suffix[0]; - nvals[0] = backends[i].be_nsuffix[0]; - if( attr_merge( e, ad_monitorContext, vals, nvals ) ) { + if ( SLAP_MONITOR( be )) { + if( attr_merge_one( e, ad_monitorContext, + &be->be_suffix[0], + &be->be_nsuffix[0] ) ) + { + return LDAP_OTHER; + } + continue; + } + if ( SLAP_CONFIG( be )) { + if( attr_merge_one( e, ad_configContext, + &be->be_suffix[0], + & be->be_nsuffix[0] ) ) + { return LDAP_OTHER; } continue; } - if ( SLAP_GLUE_SUBORDINATE( &backends[i] ) ) { + if ( SLAP_GLUE_SUBORDINATE( be ) && !SLAP_GLUE_ADVERTISE( be ) ) { continue; } - for ( j = 0; backends[i].be_suffix[j].bv_val != NULL; j++ ) { - vals[0] = backends[i].be_suffix[j]; - nvals[0] = backends[i].be_nsuffix[0]; - if( attr_merge( e, ad_namingContexts, vals, nvals ) ) { + for ( j = 0; be->be_suffix[j].bv_val != NULL; j++ ) { + if( attr_merge_one( e, ad_namingContexts, + &be->be_suffix[j], + &be->be_nsuffix[0] ) ) + { return LDAP_OTHER; } } @@ -154,8 +164,7 @@ root_dse_info( #ifdef LDAP_SLAPI /* netscape supportedExtension */ for ( i = 0; (bv = slapi_int_get_supported_extop(i)) != NULL; i++ ) { - vals[0] = *bv; - if( attr_merge( e, ad_supportedExtension, vals, NULL )) { + if( attr_merge_one( e, ad_supportedExtension, bv, NULL ) ) { return LDAP_OTHER; } } @@ -169,16 +178,16 @@ root_dse_info( /* supportedLDAPVersion */ for ( i=LDAP_VERSION_MIN; i<=LDAP_VERSION_MAX; i++ ) { char buf[BUFSIZ]; - if (!( SLAPD_GLOBAL(allows) & SLAP_ALLOW_BIND_V2 ) && + if (!( global_allows & SLAP_ALLOW_BIND_V2 ) && ( i < LDAP_VERSION3 ) ) { /* version 2 and lower are disallowed */ continue; } snprintf(buf, sizeof buf, "%d", i); - vals[0].bv_val = buf; - vals[0].bv_len = strlen( vals[0].bv_val ); - if( attr_merge( e, ad_supportedLDAPVersion, vals, NULL ) ) { + val.bv_val = buf; + val.bv_len = strlen( val.bv_val ); + if( attr_merge_one( e, ad_supportedLDAPVersion, &val, NULL ) ) { return LDAP_OTHER; } } @@ -188,17 +197,17 @@ root_dse_info( if( supportedSASLMechanisms != NULL ) { for ( i=0; supportedSASLMechanisms[i] != NULL; i++ ) { - vals[0].bv_val = supportedSASLMechanisms[i]; - vals[0].bv_len = strlen( vals[0].bv_val ); - if( attr_merge( e, ad_supportedSASLMechanisms, vals, NULL ) ) { + val.bv_val = supportedSASLMechanisms[i]; + val.bv_len = strlen( val.bv_val ); + if( attr_merge_one( e, ad_supportedSASLMechanisms, &val, NULL ) ) { return LDAP_OTHER; } } ldap_charray_free( supportedSASLMechanisms ); } - if ( SLAPD_GLOBAL(default_referral) != NULL ) { - if( attr_merge( e, ad_ref, SLAPD_GLOBAL(default_referral), NULL /* FIXME */ ) ) { + if ( default_referral != NULL ) { + if( attr_merge( e, ad_ref, default_referral, NULL /* FIXME */ ) ) { return LDAP_OTHER; } }