From: Howard Chu Date: Thu, 17 Mar 2005 23:07:44 +0000 (+0000) Subject: More for loading config from database. Fix non-reentrant strtok_quote. X-Git-Tag: OPENLDAP_REL_ENG_2_3_BP~43 X-Git-Url: https://git.sur5r.net/?a=commitdiff_plain;h=83c748fe5ccf7d1267a8cd416f232f1bd8a3240d;p=openldap More for loading config from database. Fix non-reentrant strtok_quote. --- diff --git a/servers/slapd/back-bdb/config.c b/servers/slapd/back-bdb/config.c index 84bfb5e724..a70fbb3e8f 100644 --- a/servers/slapd/back-bdb/config.c +++ b/servers/slapd/back-bdb/config.c @@ -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; } diff --git a/servers/slapd/back-ldif/ldif.c b/servers/slapd/back-ldif/ldif.c index 5a6730ed65..bba08ade48 100644 --- a/servers/slapd/back-ldif/ldif.c +++ b/servers/slapd/back-ldif/ldif.c @@ -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; } diff --git a/servers/slapd/bconfig.c b/servers/slapd/bconfig.c index 57d08c7152..e83f6c737b 100644 --- a/servers/slapd/bconfig.c +++ b/servers/slapd/bconfig.c @@ -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; } diff --git a/servers/slapd/config.c b/servers/slapd/config.c index 84dc1ca5b9..747df41959 100644 --- a/servers/slapd/config.c +++ b/servers/slapd/config.c @@ -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", "e_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", "e_ptr)) { if(c->argc == c->argv_size - 1) { char **tmp; tmp = ch_realloc(c->argv, (c->argv_size + ARGS_STEP) * sizeof(*c->argv)); diff --git a/servers/slapd/config.h b/servers/slapd/config.h index b9b9466f1b..ac4ceab069 100644 --- a/servers/slapd/config.h +++ b/servers/slapd/config.h @@ -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);