]> git.sur5r.net Git - openldap/commitdiff
More for loading config from database. Fix non-reentrant strtok_quote.
authorHoward Chu <hyc@openldap.org>
Thu, 17 Mar 2005 23:07:44 +0000 (23:07 +0000)
committerHoward Chu <hyc@openldap.org>
Thu, 17 Mar 2005 23:07:44 +0000 (23:07 +0000)
servers/slapd/back-bdb/config.c
servers/slapd/back-ldif/ldif.c
servers/slapd/bconfig.c
servers/slapd/config.c
servers/slapd/config.h

index 84bfb5e72491255b1891796ffcd1e4cf8f9d7732..a70fbb3e8f0c1b1af1e65fa8fa29d27bf559f2ae 100644 (file)
@@ -240,9 +240,8 @@ int bdb_back_init_cf( BackendInfo *bi )
        int rc;
        bi->bi_cf_table = bdbcfg;
 
-       rc = init_config_attrs( bdbcfg );
+       rc = config_register_schema( bdbcfg, bdbocs );
        if ( rc ) return rc;
        bdbcfg[0].ad = slap_schema.si_ad_objectClass;
-       rc = init_config_ocs( bdbocs );
-       return rc;
+       return 0;
 }
index 5a6730ed65be0624d09c66a017bbdb9146b15719..bba08ade48bd9cf93c68ef08d2002f1174b7149c 100644 (file)
@@ -1026,9 +1026,8 @@ ldif_back_initialize(
        bi->bi_tool_id2entry_get = 0;
        bi->bi_tool_entry_modify = 0;
 
-       rc = init_config_attrs( ldifcfg );
+       rc = config_register_schema( ldifcfg, ldifocs );
        if ( rc ) return rc;
        ldifcfg[0].ad = slap_schema.si_ad_objectClass;
-       rc = init_config_ocs( ldifocs );
-       return rc;
+       return 0;
 }
index 57d08c7152c36c1d4dca592c93c0ec740328ba51..e83f6c737b9683ee0c73c6a2d4b7c3a9cb0acdc3 100644 (file)
@@ -36,7 +36,6 @@
 #include "config.h"
 
 static struct berval config_rdn = BER_BVC("cn=config");
-static struct berval access_rdn = BER_BVC("cn=access");
 
 #ifdef SLAPD_MODULES
 typedef struct modpath_s {
@@ -57,10 +56,24 @@ typedef struct ConfigFile {
        BerVarray c_dseFiles;
 } ConfigFile;
 
+typedef struct CfOcInfo {
+       struct berval *co_name;
+       ConfigTable *co_table;
+} CfOcInfo;
+
+typedef enum {
+       Cf_Global = 1,
+       Cf_Include,
+       Cf_Backend,
+       Cf_Database,
+       Cf_Overlay
+} CfEtypes;
+
 typedef struct CfEntryInfo {
        struct CfEntryInfo *ce_sibs;
        struct CfEntryInfo *ce_kids;
        Entry *ce_entry;
+       CfEtypes ce_type;
        BackendInfo *ce_bi;
        BackendDB *ce_be;
 } CfEntryInfo;
@@ -84,14 +97,17 @@ static BerVarray authz_rewrites;
 
 static struct berval cfdir;
 
+/* Private state */
 static AttributeDescription *cfAd_backend, *cfAd_database, *cfAd_overlay,
        *cfAd_include;
 
 static ObjectClass *cfOc_global, *cfOc_backend, *cfOc_database,
-       *cfOc_include, *cfOc_overlay, *cfOc_access;
+       *cfOc_include, *cfOc_overlay;
 
 static ConfigFile cf_prv, *cfn = &cf_prv;
 
+static Avlnode *CfOcTree;
+
 static int add_syncrepl LDAP_P(( Backend *, char **, int ));
 static int parse_syncrepl_line LDAP_P(( char **, int, syncinfo_t *));
 static void syncrepl_unparse LDAP_P (( syncinfo_t *, struct berval *));
@@ -604,11 +620,6 @@ static ConfigOCs cf_ocs[] = {
                "DESC 'OpenLDAP Overlay-specific options' "
                "SUP olcConfig STRUCTURAL "
                "MAY ( olcOverlay ) )", &cfOc_overlay },
-       { "( OLcfgOc:8 "
-               "NAME 'olcACL' "
-               "DESC 'OpenLDAP Access Control List' "
-               "SUP olcConfig STRUCTURAL "
-               "MUST ( olcAccess ) )", &cfOc_access },
        { NULL, NULL }
 };
 
@@ -2639,6 +2650,37 @@ config_setup_ldif( BackendDB *be, const char *dir ) {
        return 0;
 }
 
+static int
+CfOcInfo_cmp( const void *c1, const void *c2 ) {
+       const CfOcInfo *co1 = c1;
+       const CfOcInfo *co2 = c2;
+
+       return ber_bvcmp( co1->co_name, co2->co_name );
+}
+
+int
+config_register_schema(ConfigTable *ct, ConfigOCs *ocs) {
+       int i;
+       CfOcInfo *co;
+
+       i = init_config_attrs( ct );
+       if ( i ) return i;
+
+       /* set up the objectclasses */
+       i = init_config_ocs( ocs );
+       if ( i ) return i;
+
+       for (i=0; ocs[i].def; i++) {
+               if ( ocs[i].oc ) {
+                       co = ch_malloc( sizeof(CfOcInfo) );
+                       co->co_name = &(*ocs[i].oc)->soc_cname;
+                       co->co_table = ct;
+                       avl_insert( &CfOcTree, co, CfOcInfo_cmp, avl_dup_error );
+               }
+       }
+       return 0;
+}
+
 int
 read_config(const char *fname, const char *dir) {
        BackendDB *be;
@@ -2893,6 +2935,8 @@ config_build_includes( ConfigArgs *c, Entry *parent,
                op->ora_e = e;
                op->o_bd->be_add( op, rs );
                ce = e->e_private;
+               ce->ce_type = Cf_Include;
+               ce->ce_bi = c->bi;
                if ( !ceparent->ce_kids ) {
                        ceparent->ce_kids = ce;
                } else {
@@ -2951,6 +2995,8 @@ config_back_db_open( BackendDB *be )
        config_build_entry( &c, e, cfOc_global, &rdn, ct, NO_TABLE );
        op->ora_e = e;
        op->o_bd->be_add( op, &rs );
+       ce->ce_type = Cf_Global;
+       ce->ce_bi = c.bi;
 
        parent = e;
        ceparent = ce;
@@ -2975,6 +3021,7 @@ config_back_db_open( BackendDB *be )
                rdn.bv_len = sprintf(rdn.bv_val, "%s=%s", cfAd_backend->ad_cname.bv_val, bi->bi_type);
                e = config_alloc_entry( &parent->e_nname, &rdn );
                ce = e->e_private;
+               ce->ce_type = Cf_Backend;
                ce->ce_bi = bi;
                c.bi = bi;
                config_build_entry( &c, e, cfOc_backend, &rdn, ct, BI_TABLE );
@@ -3009,6 +3056,7 @@ config_back_db_open( BackendDB *be )
                ce = e->e_private;
                c.be = bptr;
                c.bi = bi;
+               ce->ce_type = Cf_Database;
                ce->ce_be = c.be;
                ce->ce_bi = c.bi;
                config_build_entry( &c, e, cfOc_database, &rdn, ct, BE_TABLE );
@@ -3035,6 +3083,7 @@ config_back_db_open( BackendDB *be )
                                ce = oe->e_private;
                                c.be = bptr;
                                c.bi = &on->on_bi;
+                               ce->ce_type = Cf_Overlay;
                                ce->ce_be = c.be;
                                ce->ce_bi = c.bi;
                                config_build_entry( &c, oe, cfOc_overlay, &rdn, ct, BI_TABLE );
@@ -3140,7 +3189,9 @@ config_back_initialize( BackendInfo *bi )
                parse_oidm( "slapd", i, 3, argv );
        }
 
-       i = init_config_attrs( ct );
+       bi->bi_cf_table = ct;
+
+       i = config_register_schema( ct, cf_ocs );
        if ( i ) return i;
 
        /* set up the notable AttributeDescriptions */
@@ -3148,8 +3199,6 @@ config_back_initialize( BackendInfo *bi )
        ads[3].sub = slap_schema.si_ad_ditContentRules;
        ads[5].sub = slap_schema.si_ad_objectClasses;
 
-       bi->bi_cf_table = ct;
-
        i = 0;
        for (;ct->name;ct++) {
                if (strcmp(ct->name, ads[i].name)) continue;
@@ -3162,9 +3211,6 @@ config_back_initialize( BackendInfo *bi )
                if (!ads[i].name) break;
        }
 
-       /* set up the objectclasses */
-       i = init_config_ocs( cf_ocs );
-
-       return i;
+       return 0;
 }
 
index 84dc1ca5b93b31c42e5b15b50749b8d6f072fe18..747df41959a22ff93d3b5d0f4a7a6733f7208460 100644 (file)
@@ -72,8 +72,6 @@ int   slap_conn_max_pending_auth = SLAP_CONN_MAX_PENDING_AUTH;
 char   *slapd_pid_file  = NULL;
 char   *slapd_args_file = NULL;
 
-char   *strtok_quote_ptr;
-
 int use_reverse_lookup = 0;
 
 #ifdef LDAP_SLAPI
@@ -84,7 +82,7 @@ static int fp_getline(FILE *fp, ConfigArgs *c);
 static void fp_getline_init(ConfigArgs *c);
 static int fp_parse_line(ConfigArgs *c);
 
-static char    *strtok_quote(char *line, char *sep);
+static char    *strtok_quote(char *line, char *sep, char **quote_ptr);
 
 int read_config_file(const char *fname, int depth, ConfigArgs *cf);
 
@@ -458,6 +456,7 @@ read_config_file(const char *fname, int depth, ConfigArgs *cf)
                snprintf( c->log, sizeof( c->log ), "%s: line %lu",
                                c->fname, c->lineno );
 
+               c->argc = 0;
                if ( fp_parse_line( c ) ) {
                        goto badline;
                }
@@ -748,13 +747,13 @@ void bindconf_free( slap_bindconf *bc ) {
 
 
 static char *
-strtok_quote( char *line, char *sep )
+strtok_quote( char *line, char *sep, char **quote_ptr )
 {
        int             inquote;
        char            *tmp;
        static char     *next;
 
-       strtok_quote_ptr = NULL;
+       *quote_ptr = NULL;
        if ( line != NULL ) {
                next = line;
        }
@@ -789,7 +788,7 @@ strtok_quote( char *line, char *sep )
                default:
                        if ( ! inquote ) {
                                if ( strchr( sep, *next ) != NULL ) {
-                                       strtok_quote_ptr = next;
+                                       *quote_ptr = next;
                                        *next++ = '\0';
                                        return( tmp );
                                }
@@ -877,17 +876,18 @@ fp_parse_line(ConfigArgs *c)
        char *token;
        char *tline = ch_strdup(c->line);
        char *hide[] = { "rootpw", "replica", "bindpw", "pseudorootpw", "dbpasswd", '\0' };
+       char *quote_ptr;
        int i;
 
-       c->argc = 0;
-       token = strtok_quote(tline, " \t");
+       token = strtok_quote(tline, " \t", &quote_ptr);
 
        if(token) for(i = 0; hide[i]; i++) if(!strcasecmp(token, hide[i])) break;
-       if(strtok_quote_ptr) *strtok_quote_ptr = ' ';
-       Debug(LDAP_DEBUG_CONFIG, "line %lu (%s%s)\n", c->lineno, hide[i] ? hide[i] : c->line, hide[i] ? " ***" : "");
-       if(strtok_quote_ptr) *strtok_quote_ptr = '\0';
+       if(quote_ptr) *quote_ptr = ' ';
+       Debug(LDAP_DEBUG_CONFIG, "line %lu (%s%s)\n", c->lineno,
+               hide[i] ? hide[i] : c->line, hide[i] ? " ***" : "");
+       if(quote_ptr) *quote_ptr = '\0';
 
-       for(; token; token = strtok_quote(NULL, " \t")) {
+       for(; token; token = strtok_quote(NULL, " \t", &quote_ptr)) {
                if(c->argc == c->argv_size - 1) {
                        char **tmp;
                        tmp = ch_realloc(c->argv, (c->argv_size + ARGS_STEP) * sizeof(*c->argv));
index b9b9466f1b594b8fdc2bf8704fc5f64a1bebd67f..ac4ceab069a504b8fea58acaa9ddc7d4defe41b8 100644 (file)
@@ -103,6 +103,7 @@ typedef struct config_args_s {
 
 typedef int (ConfigDriver)(ConfigArgs *c);
 
+int config_register_schema(ConfigTable *ct, ConfigOCs *co);
 int config_get_vals(ConfigTable *ct, ConfigArgs *c);
 int config_add_vals(ConfigTable *ct, ConfigArgs *c);
 ConfigTable * config_find_keyword(ConfigTable *ct, ConfigArgs *c);