From: Timo Sirainen Date: Fri, 19 Mar 2010 18:56:22 +0000 (+0200) Subject: config: Changed key=$key to expand to first parser that changed it. X-Git-Tag: 2.0.beta4~9 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=19ddb3a08a51e533a8f793b1d9beebd87c201d10;p=thirdparty%2Fdovecot%2Fcore.git config: Changed key=$key to expand to first parser that changed it. This allows adding chained settings, like: key=foo key=$key bar key=$key baz -> key=foo bar baz --HG-- branch : HEAD --- diff --git a/src/config/config-parser.c b/src/config/config-parser.c index b2e0cf3f67..eb01f2fe06 100644 --- a/src/config/config-parser.c +++ b/src/config/config-parser.c @@ -582,23 +582,23 @@ static int config_parse_finish(struct config_parser_context *ctx, const char **e } static const void * -config_get_value(struct config_parser_context *ctx, const char *key, +config_get_value(struct config_section_stack *section, const char *key, bool expand_parent, enum setting_type *type_r) { - struct config_section_stack *section; struct config_module_parser *l; const void *value; - section = ctx->cur_section; - if (expand_parent && ctx->cur_section->prev != NULL) { - /* for: key = $key stuff */ - section = section->prev; - } - for (l = section->parsers; l->root != NULL; l++) { value = settings_parse_get_value(l->parser, key, type_r); - if (value != NULL) - return value; + if (value != NULL) { + if (!expand_parent || section->prev == NULL || + settings_parse_is_changed(l->parser, key)) + return value; + + /* not changed by this parser. maybe parent has. */ + return config_get_value(section->prev, + key, TRUE, type_r); + } } return NULL; } @@ -640,8 +640,9 @@ static int config_write_value(struct config_parser_context *ctx, else var_name = t_strdup_until(value, p); + /* expand_parent=TRUE for "key = $key stuff" */ expand_parent = strcmp(key, var_name) == 0; - var_value = config_get_value(ctx, var_name, + var_value = config_get_value(ctx->cur_section, var_name, expand_parent, &var_type); if (var_value == NULL) { ctx->error = p_strconcat(ctx->pool,