]> git.sur5r.net Git - openldap/commitdiff
More verbmasks cleanup, added index unparsing
authorHoward Chu <hyc@openldap.org>
Wed, 2 Mar 2005 16:35:59 +0000 (16:35 +0000)
committerHoward Chu <hyc@openldap.org>
Wed, 2 Mar 2005 16:35:59 +0000 (16:35 +0000)
servers/slapd/back-bdb/attr.c
servers/slapd/back-bdb/config.c
servers/slapd/back-bdb/proto-bdb.h
servers/slapd/bconfig.c
servers/slapd/config.c
servers/slapd/index.c
servers/slapd/proto-slap.h
servers/slapd/slap.h

index 157383ab3235304d8ba90a8bc4cc48b1952b29ab..50182015cce4b6d854d3b11089b3ce8f0d43c505 100644 (file)
@@ -23,6 +23,7 @@
 
 #include "slap.h"
 #include "back-bdb.h"
+#include "lutil.h"
 
 /* for the cache of attribute information (which are indexed, etc.) */
 typedef struct bdb_attrinfo {
@@ -296,6 +297,39 @@ bdb_attr_index_config(
        return LDAP_SUCCESS;
 }
 
+static int
+bdb_attr_index_unparser( void *v1, void *v2 )
+{
+       AttrInfo *ai = v1;
+       BerVarray *bva = v2;
+       struct berval bv;
+       char *ptr;
+
+       slap_index2bvlen( ai->ai_indexmask, &bv );
+       if ( bv.bv_len ) {
+               bv.bv_len += ai->ai_desc->ad_cname.bv_len + 1;
+               ptr = ch_malloc( bv.bv_len+1 );
+               bv.bv_val = lutil_strcopy( ptr, ai->ai_desc->ad_cname.bv_val );
+               *bv.bv_val++ = ' ';
+               slap_index2bv( ai->ai_indexmask, &bv );
+               bv.bv_val = ptr;
+               ber_bvarray_add( bva, &bv );
+       }
+}
+
+static AttributeDescription addef = { NULL, NULL, BER_BVC("default") };
+static AttrInfo aidef = { &addef };
+
+void
+bdb_attr_index_unparse( struct bdb_info *bdb, BerVarray *bva )
+{
+       if ( bdb->bi_defaultmask ) {
+               aidef.ai_indexmask = bdb->bi_defaultmask;
+               bdb_attr_index_unparser( &aidef, bva );
+       }
+       avl_apply( bdb->bi_attrs, bdb_attr_index_unparser, bva, -1, AVL_INORDER );
+}
+
 void
 bdb_attr_index_destroy( Avlnode *tree )
 {
index db98d7a6d56b878459e749b35d1593137256b0e8..74a297c467367e37e12e83ba05c0b19c8829009c 100644 (file)
@@ -130,12 +130,12 @@ bdb_cf_oc(ConfigArgs *c)
 }
 
 static slap_verbmasks bdb_lockd[] = {
-       { "default", DB_LOCK_DEFAULT },
-       { "oldest", DB_LOCK_OLDEST },
-       { "random", DB_LOCK_RANDOM },
-       { "youngest", DB_LOCK_YOUNGEST },
-       { "fewest", DB_LOCK_MINLOCKS },
-       { NULL, 0 }
+       { BER_BVC("default"), DB_LOCK_DEFAULT },
+       { BER_BVC("oldest"), DB_LOCK_OLDEST },
+       { BER_BVC("random"), DB_LOCK_RANDOM },
+       { BER_BVC("youngest"), DB_LOCK_YOUNGEST },
+       { BER_BVC("fewest"), DB_LOCK_MINLOCKS },
+       { BER_BVNULL, 0 }
 };
 
 static int
@@ -166,18 +166,17 @@ bdb_cf_gen(ConfigArgs *c)
                        break;
                        
                case BDB_INDEX:
-                       rc = 1;
+                       bdb_attr_index_unparse( bdb, &c->rvalue_vals );
+                       if ( !c->rvalue_vals ) rc = 1;
                        break;
 
                case BDB_LOCKD:
                        rc = 1;
                        if ( bdb->bi_lock_detect != DB_LOCK_DEFAULT ) {
                                int i;
-                               for (i=0; bdb_lockd[i].word; i++) {
+                               for (i=0; !BER_BVISNULL(&bdb_lockd[i].word); i++) {
                                        if ( bdb->bi_lock_detect == bdb_lockd[i].mask ) {
-                                               struct berval bv;
-                                               ber_str2bv( bdb_lockd[i].word, 0, 1, &bv );
-                                               ber_bvarray_add( &c->rvalue_vals, &bv );
+                                               value_add_one( &c->rvalue_vals, &bdb_lockd[i].word );
                                                rc = 0;
                                                break;
                                        }
@@ -214,7 +213,7 @@ bdb_cf_gen(ConfigArgs *c)
 
        case BDB_LOCKD:
                rc = verb_to_mask( c->argv[1], bdb_lockd );
-               if ( !bdb_lockd[rc].word ) {
+               if ( BER_BVISNULL(&bdb_lockd[rc].word) ) {
                        fprintf( stderr, "%s: "
                                "bad policy (%s) in \"lockDetect <policy>\" line\n",
                                c->log, c->argv[1] );
index 0606f765383b6b1be14b82b20c50579589ce518b..d3921feca51f1f5f89880d4b734be555357b92a0 100644 (file)
@@ -33,6 +33,7 @@ LDAP_BEGIN_DECL
 #define bdb_attr_mask                          BDB_SYMBOL(attr_mask)
 #define bdb_attr_index_config          BDB_SYMBOL(attr_index_config)
 #define bdb_attr_index_destroy         BDB_SYMBOL(attr_index_destroy)
+#define bdb_attr_index_unparse         BDB_SYMBOL(attr_index_unparse)
 
 #ifdef LDAP_COMP_MATCH
 #define bdb_attr_comp_ref                      BDB_SYMBOL(attr_comp_ref)
@@ -54,6 +55,7 @@ int bdb_attr_index_config LDAP_P(( struct bdb_info *bdb,
        const char *fname, int lineno,
        int argc, char **argv ));
 
+void bdb_attr_index_unparse LDAP_P(( struct bdb_info *bdb, BerVarray *bva ));
 void bdb_attr_index_destroy LDAP_P(( Avlnode *tree ));
 
 /*
index 1a1ffd7e219f5c44c03bbdc3714d79741719f6d8..0c3f2d494fc1b2ea955b8906d97a937778edd22c 100644 (file)
@@ -1324,22 +1324,22 @@ config_restrict(ConfigArgs *c) {
        slap_mask_t restrictops = 0;
        int i;
        slap_verbmasks restrictable_ops[] = {
-               { "bind",               SLAP_RESTRICT_OP_BIND },
-               { "add",                SLAP_RESTRICT_OP_ADD },
-               { "modify",             SLAP_RESTRICT_OP_MODIFY },
-               { "rename",             SLAP_RESTRICT_OP_RENAME },
-               { "modrdn",             0 },
-               { "delete",             SLAP_RESTRICT_OP_DELETE },
-               { "search",             SLAP_RESTRICT_OP_SEARCH },
-               { "compare",    SLAP_RESTRICT_OP_COMPARE },
-               { "read",               SLAP_RESTRICT_OP_READS },
-               { "write",              SLAP_RESTRICT_OP_WRITES },
-               { "extended",   SLAP_RESTRICT_OP_EXTENDED },
-               { "extended=" LDAP_EXOP_START_TLS,              SLAP_RESTRICT_EXOP_START_TLS },
-               { "extended=" LDAP_EXOP_MODIFY_PASSWD,  SLAP_RESTRICT_EXOP_MODIFY_PASSWD },
-               { "extended=" LDAP_EXOP_X_WHO_AM_I,             SLAP_RESTRICT_EXOP_WHOAMI },
-               { "extended=" LDAP_EXOP_X_CANCEL,               SLAP_RESTRICT_EXOP_CANCEL },
-               { NULL, 0 }
+               { BER_BVC("bind"),              SLAP_RESTRICT_OP_BIND },
+               { BER_BVC("add"),               SLAP_RESTRICT_OP_ADD },
+               { BER_BVC("modify"),            SLAP_RESTRICT_OP_MODIFY },
+               { BER_BVC("rename"),            SLAP_RESTRICT_OP_RENAME },
+               { BER_BVC("modrdn"),            0 },
+               { BER_BVC("delete"),            SLAP_RESTRICT_OP_DELETE },
+               { BER_BVC("search"),            SLAP_RESTRICT_OP_SEARCH },
+               { BER_BVC("compare"),   SLAP_RESTRICT_OP_COMPARE },
+               { BER_BVC("read"),              SLAP_RESTRICT_OP_READS },
+               { BER_BVC("write"),             SLAP_RESTRICT_OP_WRITES },
+               { BER_BVC("extended"),  SLAP_RESTRICT_OP_EXTENDED },
+               { BER_BVC("extended=" LDAP_EXOP_START_TLS ),            SLAP_RESTRICT_EXOP_START_TLS },
+               { BER_BVC("extended=" LDAP_EXOP_MODIFY_PASSWD ),        SLAP_RESTRICT_EXOP_MODIFY_PASSWD },
+               { BER_BVC("extended=" LDAP_EXOP_X_WHO_AM_I ),           SLAP_RESTRICT_EXOP_WHOAMI },
+               { BER_BVC("extended=" LDAP_EXOP_X_CANCEL ),             SLAP_RESTRICT_EXOP_CANCEL },
+               { BER_BVNULL,   0 }
        };
 
        if (c->emit) {
@@ -1364,11 +1364,11 @@ config_allows(ConfigArgs *c) {
        slap_mask_t allows = 0;
        int i;
        slap_verbmasks allowable_ops[] = {
-               { "bind_v2",            SLAP_ALLOW_BIND_V2 },
-               { "bind_anon_cred",     SLAP_ALLOW_BIND_ANON_CRED },
-               { "bind_anon_dn",       SLAP_ALLOW_BIND_ANON_DN },
-               { "update_anon",        SLAP_ALLOW_UPDATE_ANON },
-               { NULL, 0 }
+               { BER_BVC("bind_v2"),           SLAP_ALLOW_BIND_V2 },
+               { BER_BVC("bind_anon_cred"),    SLAP_ALLOW_BIND_ANON_CRED },
+               { BER_BVC("bind_anon_dn"),      SLAP_ALLOW_BIND_ANON_DN },
+               { BER_BVC("update_anon"),       SLAP_ALLOW_UPDATE_ANON },
+               { BER_BVNULL,   0 }
        };
        if (c->emit) {
                return mask_to_verbs( allowable_ops, global_allows, &c->rvalue_vals );
@@ -1389,12 +1389,12 @@ config_disallows(ConfigArgs *c) {
        slap_mask_t disallows = 0;
        int i;
        slap_verbmasks disallowable_ops[] = {
-               { "bind_anon",          SLAP_DISALLOW_BIND_ANON },
-               { "bind_simple",        SLAP_DISALLOW_BIND_SIMPLE },
-               { "bind_krb4",          SLAP_DISALLOW_BIND_KRBV4 },
-               { "tls_2_anon",         SLAP_DISALLOW_TLS_2_ANON },
-               { "tls_authc",          SLAP_DISALLOW_TLS_AUTHC },
-               { NULL, 0 }
+               { BER_BVC("bind_anon"),         SLAP_DISALLOW_BIND_ANON },
+               { BER_BVC("bind_simple"),       SLAP_DISALLOW_BIND_SIMPLE },
+               { BER_BVC("bind_krb4"),         SLAP_DISALLOW_BIND_KRBV4 },
+               { BER_BVC("tls_2_anon"),                SLAP_DISALLOW_TLS_2_ANON },
+               { BER_BVC("tls_authc"),         SLAP_DISALLOW_TLS_AUTHC },
+               { BER_BVNULL, 0 }
        };
        if (c->emit) {
                return mask_to_verbs( disallowable_ops, global_disallows, &c->rvalue_vals );
@@ -1415,12 +1415,12 @@ config_requires(ConfigArgs *c) {
        slap_mask_t requires = 0;
        int i;
        slap_verbmasks requires_ops[] = {
-               { "bind",               SLAP_REQUIRE_BIND },
-               { "LDAPv3",             SLAP_REQUIRE_LDAP_V3 },
-               { "authc",              SLAP_REQUIRE_AUTHC },
-               { "sasl",               SLAP_REQUIRE_SASL },
-               { "strong",             SLAP_REQUIRE_STRONG },
-               { NULL, 0 }
+               { BER_BVC("bind"),              SLAP_REQUIRE_BIND },
+               { BER_BVC("LDAPv3"),            SLAP_REQUIRE_LDAP_V3 },
+               { BER_BVC("authc"),             SLAP_REQUIRE_AUTHC },
+               { BER_BVC("sasl"),              SLAP_REQUIRE_SASL },
+               { BER_BVC("strong"),            SLAP_REQUIRE_STRONG },
+               { BER_BVNULL, 0 }
        };
        if (c->emit) {
                return mask_to_verbs( requires_ops, c->be->be_requires, &c->rvalue_vals );
@@ -1441,22 +1441,22 @@ config_loglevel(ConfigArgs *c) {
        int i;
        char *next;
        slap_verbmasks loglevel_ops[] = {
-               { "Trace",      LDAP_DEBUG_TRACE },
-               { "Packets",    LDAP_DEBUG_PACKETS },
-               { "Args",       LDAP_DEBUG_ARGS },
-               { "Conns",      LDAP_DEBUG_CONNS },
-               { "BER",        LDAP_DEBUG_BER },
-               { "Filter",     LDAP_DEBUG_FILTER },
-               { "Config",     LDAP_DEBUG_CONFIG },
-               { "ACL",        LDAP_DEBUG_ACL },
-               { "Stats",      LDAP_DEBUG_STATS },
-               { "Stats2",     LDAP_DEBUG_STATS2 },
-               { "Shell",      LDAP_DEBUG_SHELL },
-               { "Parse",      LDAP_DEBUG_PARSE },
-               { "Cache",      LDAP_DEBUG_CACHE },
-               { "Index",      LDAP_DEBUG_INDEX },
-               { "Any",        -1 },
-               { NULL, 0 }
+               { BER_BVC("Trace"),     LDAP_DEBUG_TRACE },
+               { BER_BVC("Packets"),   LDAP_DEBUG_PACKETS },
+               { BER_BVC("Args"),      LDAP_DEBUG_ARGS },
+               { BER_BVC("Conns"),     LDAP_DEBUG_CONNS },
+               { BER_BVC("BER"),       LDAP_DEBUG_BER },
+               { BER_BVC("Filter"),    LDAP_DEBUG_FILTER },
+               { BER_BVC("Config"),    LDAP_DEBUG_CONFIG },
+               { BER_BVC("ACL"),       LDAP_DEBUG_ACL },
+               { BER_BVC("Stats"),     LDAP_DEBUG_STATS },
+               { BER_BVC("Stats2"),    LDAP_DEBUG_STATS2 },
+               { BER_BVC("Shell"),     LDAP_DEBUG_SHELL },
+               { BER_BVC("Parse"),     LDAP_DEBUG_PARSE },
+               { BER_BVC("Cache"),     LDAP_DEBUG_CACHE },
+               { BER_BVC("Index"),     LDAP_DEBUG_INDEX },
+               { BER_BVC("Any"),       -1 },
+               { BER_BVNULL,   0 }
        };
 
        if (c->emit) {
@@ -1479,7 +1479,7 @@ config_loglevel(ConfigArgs *c) {
                        }
                } else {
                        int j = verb_to_mask(c->argv[i], loglevel_ops);
-                       if(!loglevel_ops[j].word) {
+                       if(BER_BVISNULL(&loglevel_ops[j].word)) {
                                Debug( LDAP_DEBUG_ANY,
                                        "%s: unknown level \"%s\" "
                                        "in \"loglevel <level> [...]\" line.\n",
@@ -1906,17 +1906,17 @@ static int
 config_tls_config(ConfigArgs *c) {
        int i, flag;
        slap_verbmasks crlkeys[] = {
-               { "none",       LDAP_OPT_X_TLS_CRL_NONE },
-               { "peer",       LDAP_OPT_X_TLS_CRL_PEER },
-               { "all",        LDAP_OPT_X_TLS_CRL_ALL },
-               { NULL, 0 }
+               { BER_BVC("none"),      LDAP_OPT_X_TLS_CRL_NONE },
+               { BER_BVC("peer"),      LDAP_OPT_X_TLS_CRL_PEER },
+               { BER_BVC("all"),       LDAP_OPT_X_TLS_CRL_ALL },
+               { BER_BVNULL, 0 }
        };
        slap_verbmasks vfykeys[] = {
-               { "never",      LDAP_OPT_X_TLS_NEVER },
-               { "demand",     LDAP_OPT_X_TLS_DEMAND },
-               { "try",        LDAP_OPT_X_TLS_TRY },
-               { "hard",       LDAP_OPT_X_TLS_HARD },
-               { NULL, 0 }
+               { BER_BVC("never"),     LDAP_OPT_X_TLS_NEVER },
+               { BER_BVC("demand"),    LDAP_OPT_X_TLS_DEMAND },
+               { BER_BVC("try"),       LDAP_OPT_X_TLS_TRY },
+               { BER_BVC("hard"),      LDAP_OPT_X_TLS_HARD },
+               { BER_BVNULL, 0 }
        }, *keys;
        switch(c->type) {
 #ifdef HAVE_OPENSSL_CRL
@@ -1931,9 +1931,9 @@ config_tls_config(ConfigArgs *c) {
        }
        if (c->emit) {
                ldap_pvt_tls_get_option( NULL, flag, &c->value_int );
-               for (i=0; keys[i].word; i++) {
+               for (i=0; !BER_BVISNULL(&keys[i].word); i++) {
                        if (keys[i].mask == c->value_int) {
-                               c->value_string = ch_strdup( keys[i].word );
+                               c->value_string = ch_strdup( keys[i].word.bv_val );
                                return 0;
                        }
                }
index 673c4d43dc6cc74dbe2ac3f02f162cf808c9fca2..da68df480892adc1bc8062f29c8972548e8c9ffc 100644 (file)
@@ -551,8 +551,8 @@ badline:
 int
 verb_to_mask(const char *word, slap_verbmasks *v) {
        int i;
-       for(i = 0; v[i].word; i++)
-               if(!strcasecmp(word, v[i].word))
+       for(i = 0; !BER_BVISNULL(&v[i].word); i++)
+               if(!strcasecmp(word, v[i].word.bv_val))
                        break;
        return(i);
 }
@@ -562,7 +562,7 @@ verbs_to_mask(int argc, char *argv[], slap_verbmasks *v, slap_mask_t *m) {
        int i, j;
        for(i = 1; i < argc; i++) {
                j = verb_to_mask(argv[i], v);
-               if(!v[j].word) return(1);
+               if(BER_BVISNULL(&v[j].word)) return(1);
                while (!v[j].mask) j--;
                *m |= v[j].mask;
        }
@@ -575,28 +575,28 @@ mask_to_verbs(slap_verbmasks *v, slap_mask_t m, BerVarray *bva) {
        struct berval bv;
 
        if (!m) return 1;
-       for (i=0; v[i].word; i++) {
+       for (i=0; !BER_BVISNULL(&v[i].word); i++) {
                if (!v[i].mask) continue;
                if (( m & v[i].mask ) == v[i].mask ) {
-                       ber_str2bv( v[i].word, 0, 0, &bv );
-                       value_add_one( bva, &bv );
+                       value_add_one( bva, &v[i].word );
                }
        }
        return 0;
 }
 
 static slap_verbmasks tlskey[] = {
-       { "no",         SB_TLS_OFF },
-       { "yes",                SB_TLS_ON },
-       { "critical",   SB_TLS_CRITICAL }
+       { BER_BVC("no"),                SB_TLS_OFF },
+       { BER_BVC("yes"),               SB_TLS_ON },
+       { BER_BVC("critical"),  SB_TLS_CRITICAL },
+       { BER_BVNULL, 0 }
 };
 
 static slap_verbmasks methkey[] = {
-       { "simple",     LDAP_AUTH_SIMPLE },
+       { BER_BVC("simple"),    LDAP_AUTH_SIMPLE },
 #ifdef HAVE_CYRUS_SASL
-       { "sasl",       LDAP_AUTH_SASL },
+       { BER_BVC("sasl"),      LDAP_AUTH_SASL },
 #endif
-       { NULL, 0 }
+       { BER_BVNULL, 0 }
 };
 
 typedef struct cf_aux_table {
@@ -630,8 +630,8 @@ int bindconf_parse( const char *word, slap_bindconf *bc ) {
                        if ( tab->aux ) {
                                int j;
                                rc = 1;
-                               for (j=0; tab->aux[j].word; j++) {
-                                       if (!strcasecmp(word+tab->key.bv_len, tab->aux[j].word)) {
+                               for (j=0; !BER_BVISNULL(&tab->aux[j].word); j++) {
+                                       if (!strcasecmp(word+tab->key.bv_len, tab->aux[j].word.bv_val)) {
                                                int *ptr = (int *)cptr;
                                                *ptr = tab->aux[j].mask;
                                                rc = 0;
@@ -661,11 +661,11 @@ int bindconf_unparse( slap_bindconf *bc, struct berval *bv ) {
                cptr = (char **)((char *)bc + tab->off);
                if ( tab->aux ) {
                        int *ip = (int *)cptr, i;
-                       for ( i=0; tab->aux[i].word; i++ ) {
+                       for ( i=0; !BER_BVISNULL(&tab->aux[i].word); i++ ) {
                                if ( *ip == tab->aux[i].mask ) {
                                        *ptr++ = ' ';
                                        ptr = lutil_strcopy( ptr, tab->key.bv_val );
-                                       ptr = lutil_strcopy( ptr, tab->aux[i].word );
+                                       ptr = lutil_strcopy( ptr, tab->aux[i].word.bv_val );
                                        break;
                                }
                        }
index 09ea1dc5c54a5b0e0172f830c0892b590432e851..f4590ccf83acd35e45e6ee201ccfd990436571d8 100644 (file)
 
 #include "slap.h"
 
+static slap_verbmasks idxstr[] = {
+       { BER_BVC("pres"), SLAP_INDEX_PRESENT },
+       { BER_BVC("eq"), SLAP_INDEX_EQUALITY },
+       { BER_BVC("approx"), SLAP_INDEX_APPROX },
+       { BER_BVC("subinitial"), SLAP_INDEX_SUBSTR_INITIAL },
+       { BER_BVC("subany"), SLAP_INDEX_SUBSTR_ANY },
+       { BER_BVC("subfinal"), SLAP_INDEX_SUBSTR_FINAL },
+       { BER_BVC("sub"), SLAP_INDEX_SUBSTR_DEFAULT },
+       { BER_BVC("substr"), 0 },
+       { BER_BVC("notags"), SLAP_INDEX_NOTAGS },
+       { BER_BVC("nolang"), 0 },       /* backwards compat */
+       { BER_BVC("nosubtypes"), SLAP_INDEX_NOSUBTYPES },
+       { BER_BVNULL, 0 }
+};
+
+
 int slap_str2index( const char *str, slap_mask_t *idx )
 {
-       if ( strcasecmp( str, "pres" ) == 0 ) {
-               *idx = SLAP_INDEX_PRESENT;
-       } else if ( strcasecmp( str, "eq" ) == 0 ) {
-               *idx = SLAP_INDEX_EQUALITY;
-       } else if ( strcasecmp( str, "approx" ) == 0 ) {
-               *idx = SLAP_INDEX_APPROX;
-       } else if ( strcasecmp( str, "subinitial" ) == 0 ) {
-               *idx = SLAP_INDEX_SUBSTR_INITIAL;
-       } else if ( strcasecmp( str, "subany" ) == 0 ) {
-               *idx = SLAP_INDEX_SUBSTR_ANY;
-       } else if ( strcasecmp( str, "subfinal" ) == 0 ) {
-               *idx = SLAP_INDEX_SUBSTR_FINAL;
-       } else if ( strcasecmp( str, "substr" ) == 0 ||
-               strcasecmp( str, "sub" ) == 0 )
-       {
-               *idx = SLAP_INDEX_SUBSTR_DEFAULT;
-       } else if ( strcasecmp( str, "nolang" ) == 0 || /* backwards compat */
-                   strcasecmp( str, "notags" ) == 0 ) {
-               *idx = SLAP_INDEX_NOTAGS;
-       } else if ( strcasecmp( str, "nosubtypes" ) == 0 ) {
-               *idx = SLAP_INDEX_NOSUBTYPES;
-       } else {
-               return LDAP_OTHER;
-       }
+       int i;
+
+       i = verb_to_mask( str, idxstr );
+       if ( BER_BVISNULL(&idxstr[i].word) ) return LDAP_OTHER;
+       while ( !idxstr[i].mask ) i--;
+       *idx = idxstr[i].mask;
+
 
        return LDAP_SUCCESS;
 }
+
+void slap_index2bvlen( slap_mask_t idx, struct berval *bv )
+{
+       int i;
+
+       bv->bv_len = 0;
+
+       for ( i=0; !BER_BVISNULL( &idxstr[i].word ); i++ ) {
+               if ( !idxstr[i].mask ) continue;
+               if ( IS_SLAP_INDEX( idx, idxstr[i].mask )) {
+                       if ( (idxstr[i].mask & SLAP_INDEX_SUBSTR) &&
+                               ((idx & SLAP_INDEX_SUBSTR_DEFAULT) != idxstr[i].mask))
+                               continue;
+                       if ( bv->bv_len ) bv->bv_len++;
+                       bv->bv_len += idxstr[i].word.bv_len;
+               }
+       }
+}
+
+/* caller must provide buffer space, after calling index2bvlen */
+void slap_index2bv( slap_mask_t idx, struct berval *bv )
+{
+       int i;
+       char *ptr;
+
+       if ( !bv->bv_len ) return;
+
+       ptr = bv->bv_val;
+       for ( i=0; !BER_BVISNULL( &idxstr[i].word ); i++ ) {
+               if ( !idxstr[i].mask ) continue;
+               if ( IS_SLAP_INDEX( idx, idxstr[i].mask )) {
+                       if ( (idxstr[i].mask & SLAP_INDEX_SUBSTR) &&
+                               ((idx & SLAP_INDEX_SUBSTR_DEFAULT) != idxstr[i].mask))
+                               continue;
+                       if ( ptr != bv->bv_val ) *ptr++ = ',';
+                       ptr = lutil_strcopy( ptr, idxstr[i].word.bv_val );
+               }
+       }
+}
index cdc4e6a5fe65eeaa378e8067ac5caa89854c7820..be1ce92e6052daeb9d228c83dee12d018c8d4a6f 100644 (file)
@@ -762,6 +762,8 @@ LDAP_SLAPD_V( void * ) slap_tls_ctx;
  * index.c
  */
 LDAP_SLAPD_F (int) slap_str2index LDAP_P(( const char *str, slap_mask_t *idx ));
+LDAP_SLAPD_F (void) slap_index2bvlen LDAP_P(( slap_mask_t idx, struct berval *bv ));
+LDAP_SLAPD_F (void) slap_index2bv LDAP_P(( slap_mask_t idx, struct berval *bv ));
 
 /*
  * init.c
index 2913d4cdb891d2c6ced536d1a454b96d2c577a44..2214f0cb8e3247086e1e8f8b01724ac3f932a0d4 100644 (file)
@@ -1419,7 +1419,7 @@ struct slap_replica_info {
 };
 
 typedef struct slap_verbmasks {
-       const char *word;
+       struct berval word;
        const int mask;
 } slap_verbmasks;