]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/config.c
allow to programmatically register new response code names
[openldap] / servers / slapd / config.c
index 6e20e6a09c28b9f734560bde3165a1a2c07de14b..8c2e633bf3b76915cf3e75d4eed8d96ab3c6c836 100644 (file)
@@ -1007,6 +1007,47 @@ enum_to_verb(slap_verbmasks *v, slap_mask_t m, struct berval *bv) {
        return -1;
 }
 
+/* register a new verbmask */
+static int
+slap_verbmask_register( slap_verbmasks *vm_, slap_verbmasks **vmp, struct berval *bv, int mask )
+{
+       slap_verbmasks  *vm = *vmp;
+       int             i;
+
+       /* check for duplicate word */
+       /* NOTE: we accept duplicate codes; the first occurrence will be used
+        * when mapping from mask to verb */
+       i = verb_to_mask( bv->bv_val, vm );
+       if ( !BER_BVISNULL( &vm[ i ].word ) ) {
+               return -1;
+       }
+
+       for ( i = 0; !BER_BVISNULL( &vm[ i ].word ); i++ )
+               ;
+
+       if ( vm == vm_ ) {
+               /* first time: duplicate array */
+               vm = ch_calloc( i + 2, sizeof( slap_verbmasks ) );
+               for ( i = 0; !BER_BVISNULL( &vm_[ i ].word ); i++ )
+               {
+                       ber_dupbv( &vm[ i ].word, &vm_[ i ].word );
+                       *((slap_mask_t*)&vm[ i ].mask) = vm_[ i ].mask;
+               }
+
+       } else {
+               vm = ch_realloc( vm, (i + 2) * sizeof( slap_verbmasks ) );
+       }
+
+       ber_dupbv( &vm[ i ].word, bv );
+       *((slap_mask_t*)&vm[ i ].mask) = mask;
+
+       BER_BVZERO( &vm[ i+1 ].word );
+
+       *vmp = vm;
+
+       return i;
+}
+
 static slap_verbmasks slap_ldap_response_code_[] = {
        { BER_BVC("success"),                           LDAP_SUCCESS },
 
@@ -1093,6 +1134,13 @@ static slap_verbmasks slap_ldap_response_code_[] = {
 
 slap_verbmasks *slap_ldap_response_code = slap_ldap_response_code_;
 
+int
+slap_ldap_response_code_register( struct berval *bv, int err )
+{
+       return slap_verbmask_register( slap_ldap_response_code_,
+               &slap_ldap_response_code, bv, err );
+}
+
 #ifdef HAVE_TLS
 static slap_verbmasks tlskey[] = {
        { BER_BVC("no"),        SB_TLS_OFF },