allow to register (and expose) a supported feature

This commit is contained in:
Pierangelo Masarati 2005-11-27 23:17:57 +00:00
parent d24a5f6f0f
commit 84bb488ec2
3 changed files with 82 additions and 5 deletions

View File

@ -813,6 +813,8 @@ destroy:
extops_kill();
supported_feature_destroy();
stop:
#ifdef HAVE_NT_EVENT_LOG
if (is_NT_Service)

View File

@ -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
*/

View File

@ -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;
}