]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
config: Changed key=$key to expand to first parser that changed it.
authorTimo Sirainen <tss@iki.fi>
Fri, 19 Mar 2010 18:56:22 +0000 (20:56 +0200)
committerTimo Sirainen <tss@iki.fi>
Fri, 19 Mar 2010 18:56:22 +0000 (20:56 +0200)
This allows adding chained settings, like:

key=foo
key=$key bar
key=$key baz

-> key=foo bar baz

--HG--
branch : HEAD

src/config/config-parser.c

index b2e0cf3f67a047286252e25d21ed85651038189d..eb01f2fe06c91efe935cc24eb41ad028581072b1 100644 (file)
@@ -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,