]> git.sur5r.net Git - openldap/commitdiff
allow to register (and expose) a supported feature
authorPierangelo Masarati <ando@openldap.org>
Sun, 27 Nov 2005 23:17:57 +0000 (23:17 +0000)
committerPierangelo Masarati <ando@openldap.org>
Sun, 27 Nov 2005 23:17:57 +0000 (23:17 +0000)
servers/slapd/main.c
servers/slapd/proto-slap.h
servers/slapd/root_dse.c

index c47f477893e0ed665ea504d4a6b2a2afd105ba05..3f5e91adf5d984fe880c551669877233e9b2d7eb 100644 (file)
@@ -813,6 +813,8 @@ destroy:
 
        extops_kill();
 
+       supported_feature_destroy();
+
 stop:
 #ifdef HAVE_NT_EVENT_LOG
        if (is_NT_Service)
index 6727669d9996d57f1d8b6a6fe29ec7b89f7eef61..6f41c2f0b1d7154c313d8a9729693f7fe48f51dd 100644 (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
  */
index 810c5316c0c823e57500e96748d7157dab463d22..a166feea9c737049bbf781417d26e94b7ce9a971 100644 (file)
 #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;
        }