X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;f=lib%2Fecoli_config.c;h=63b572555c28ca6cfd071f7e75bff1d97e328b3e;hb=d8c60a316b5c2a8b959f6191274504d433cf64f0;hp=838438ea50720480463e427d07f8733a0a29aff7;hpb=786e4464e886f4e1485ba2beb6ed74c8a5914fbf;p=protos%2Flibecoli.git diff --git a/lib/ecoli_config.c b/lib/ecoli_config.c index 838438e..63b5725 100644 --- a/lib/ecoli_config.c +++ b/lib/ecoli_config.c @@ -18,6 +18,13 @@ EC_LOG_TYPE_REGISTER(config); +const char *ec_config_reserved_keys[] = { + "id", + "attrs", + "help", + "type", +}; + static int __ec_config_dump(FILE *out, const char *key, const struct ec_config *config, size_t indent); @@ -25,6 +32,18 @@ static int ec_config_dict_validate(const struct ec_keyval *dict, const struct ec_config_schema *schema); +bool +ec_config_key_is_reserved(const char *name) +{ + size_t i; + + for (i = 0; i < EC_COUNT_OF(ec_config_reserved_keys); i++) { + if (!strcmp(name, ec_config_reserved_keys[i])) + return true; + } + return false; +} + /* return ec_value type as a string */ static const char * ec_config_type_str(enum ec_config_type type) @@ -82,6 +101,13 @@ __ec_config_schema_validate(const struct ec_config_schema *schema, } for (i = 0; schema[i].type != EC_CONFIG_TYPE_NONE; i++) { + if (schema[i].key != NULL && + ec_config_key_is_reserved(schema[i].key)) { + errno = EINVAL; + EC_LOG(EC_LOG_ERR, + "key name <%s> is reserved\n", schema[i].key); + return -1; + } /* check for duplicate name if more than one element */ for (j = i + 1; schema[j].type != EC_CONFIG_TYPE_NONE; j++) { if (!strcmp(schema[i].key, schema[j].key)) { @@ -334,15 +360,14 @@ ec_config_list(void) return value; } -static const struct ec_config_schema * +const struct ec_config_schema * ec_config_schema_lookup(const struct ec_config_schema *schema, - const char *key, enum ec_config_type type) + const char *key) { size_t i; for (i = 0; schema[i].type != EC_CONFIG_TYPE_NONE; i++) { - if (!strcmp(key, schema[i].key) && - type == schema[i].type) + if (!strcmp(key, schema[i].key)) return &schema[i]; } @@ -510,12 +535,11 @@ ec_config_dict_validate(const struct ec_keyval *dict, key = ec_keyval_iter_get_key(iter); value = ec_keyval_iter_get_val(iter); - sch = ec_config_schema_lookup(schema, key, value->type); - if (sch == NULL) { + sch = ec_config_schema_lookup(schema, key); + if (sch == NULL || sch->type != value->type) { errno = EBADMSG; goto fail; } - if (value->type == EC_CONFIG_TYPE_LIST) { if (ec_config_list_validate(&value->list, sch->subschema) < 0) @@ -935,6 +959,11 @@ static int ec_config_testcase(void) int testres = 0; int ret; + testres |= EC_TEST_CHECK(ec_config_key_is_reserved("id"), + "'id' should be reserved"); + testres |= EC_TEST_CHECK(!ec_config_key_is_reserved("foo"), + "'foo' should not be reserved"); + node = ec_node("empty", EC_NO_ID); if (node == NULL) goto fail;