From: Pierangelo Masarati Date: Sun, 27 Nov 2005 23:17:57 +0000 (+0000) Subject: allow to register (and expose) a supported feature X-Git-Tag: OPENLDAP_REL_ENG_2_4_BP~669 X-Git-Url: https://git.sur5r.net/?a=commitdiff_plain;h=84bb488ec2e718db050748cf78c93e34bb2f2be2;p=openldap allow to register (and expose) a supported feature --- diff --git a/servers/slapd/main.c b/servers/slapd/main.c index c47f477893..3f5e91adf5 100644 --- a/servers/slapd/main.c +++ b/servers/slapd/main.c @@ -813,6 +813,8 @@ destroy: extops_kill(); + supported_feature_destroy(); + stop: #ifdef HAVE_NT_EVENT_LOG if (is_NT_Service) diff --git a/servers/slapd/proto-slap.h b/servers/slapd/proto-slap.h index 6727669d99..6f41c2f0b1 100644 --- a/servers/slapd/proto-slap.h +++ b/servers/slapd/proto-slap.h @@ -1362,6 +1362,9 @@ LDAP_SLAPD_F (int) slap_discover_feature LDAP_P(( const char *attr, const char *val )); +LDAP_SLAPD_F (int) supported_feature_load LDAP_P(( struct berval *f )); +LDAP_SLAPD_F (int) supported_feature_destroy LDAP_P(( void )); + /* * sasl.c */ diff --git a/servers/slapd/root_dse.c b/servers/slapd/root_dse.c index 810c5316c0..a166feea9c 100644 --- a/servers/slapd/root_dse.c +++ b/servers/slapd/root_dse.c @@ -28,21 +28,89 @@ #include "slapi/slapi.h" #endif -static struct berval supportedFeatures[] = { +static struct berval builtin_supportedFeatures[] = { BER_BVC(LDAP_FEATURE_MODIFY_INCREMENT), /* Modify/increment */ - BER_BVC(LDAP_FEATURE_ALL_OP_ATTRS), /* All Op Attrs (+) */ + BER_BVC(LDAP_FEATURE_ALL_OP_ATTRS), /* All Op Attrs (+) */ BER_BVC(LDAP_FEATURE_OBJECTCLASS_ATTRS), /* OCs in Attrs List (@class) */ 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 */ + BER_BVC(LDAP_FEATURE_LANGUAGE_TAG_OPTIONS), /* Language Tag Options */ + BER_BVC(LDAP_FEATURE_LANGUAGE_RANGE_OPTIONS), /* Language Range Options */ #ifdef LDAP_FEATURE_SUBORDINATE_SCOPE BER_BVC(LDAP_FEATURE_SUBORDINATE_SCOPE), /* "children" search scope */ #endif - {0,NULL} + BER_BVNULL }; +static struct berval *supportedFeatures; static Entry *usr_attr = NULL; +static int +supported_feature_init( void ) +{ + int i; + + if ( supportedFeatures != NULL ) { + return 0; + } + + for ( i = 0; !BER_BVISNULL( &builtin_supportedFeatures[ i ] ); i++ ) + ; + + supportedFeatures = ch_calloc( sizeof( struct berval ), i + 1 ); + if ( supportedFeatures == NULL ) { + return -1; + } + + for ( i = 0; !BER_BVISNULL( &builtin_supportedFeatures[ i ] ); i++ ) { + ber_dupbv( &supportedFeatures[ i ], &builtin_supportedFeatures[ i ] ); + } + BER_BVZERO( &supportedFeatures[ i ] ); + + return 0; +} + +int +supported_feature_destroy( void ) +{ + int i; + + if ( supportedFeatures == NULL ) { + return 0; + } + + for ( i = 0; !BER_BVISNULL( &supportedFeatures[ i ] ); i++ ) { + ch_free( supportedFeatures[ i ].bv_val ); + } + + ch_free( supportedFeatures ); + supportedFeatures = NULL; + + return 0; +} + +int +supported_feature_load( struct berval *f ) +{ + struct berval *tmp; + int i; + + supported_feature_init(); + + for ( i = 0; !BER_BVISNULL( &supportedFeatures[ i ] ); i++ ) + ; + + tmp = ch_realloc( supportedFeatures, sizeof( struct berval ) * ( i + 2 ) ); + if ( tmp == NULL ) { + return -1; + } + supportedFeatures = tmp; + + ber_dupbv( &supportedFeatures[ i ], f ); + BER_BVZERO( &supportedFeatures[ i + 1 ] ); + + return 0; +} + int root_dse_info( Connection *conn, @@ -173,6 +241,10 @@ root_dse_info( #endif /* LDAP_SLAPI */ /* supportedFeatures */ + if ( supportedFeatures == NULL ) { + supported_feature_init(); + } + if( attr_merge( e, ad_supportedFeatures, supportedFeatures, NULL ) ) { return LDAP_OTHER; }