Mercurial > dovecot > core-2.2
changeset 22107:164fb0b1d07d
config: When showing an "Unknown setting" error, show the full section path
For example with:
service foo {
inet_listener bar {
key = value
}
}
Instead of showing just:
Unknown setting: key
Show the entire path:
Unknown setting: service { inet_listener { key
Any filters won't be shown, because they don't affect the result.
author | Timo Sirainen <timo.sirainen@dovecot.fi> |
---|---|
date | Sat, 20 May 2017 18:13:45 +0300 |
parents | acd511be5cb5 |
children | f220b0d8af7a |
files | src/config/config-parser-private.h src/config/config-parser.c |
diffstat | 2 files changed, 26 insertions(+), 1 deletions(-) [+] |
line wrap: on
line diff
--- a/src/config/config-parser-private.h Wed May 17 15:20:35 2017 +0300 +++ b/src/config/config-parser-private.h Sat May 20 18:13:45 2017 +0300 @@ -19,6 +19,7 @@ struct config_section_stack { struct config_section_stack *prev; + const char *key; struct config_filter filter; /* root=NULL-terminated list of parsers */ @@ -27,6 +28,7 @@ const char *open_path; unsigned int open_linenum; + bool is_filter; }; struct input_stack {
--- a/src/config/config-parser.c Wed May 17 15:20:35 2017 +0300 +++ b/src/config/config-parser.c Sat May 20 18:13:45 2017 +0300 @@ -99,6 +99,27 @@ filter->remote_bits > 0; } +static void +section_stack_write(string_t *str, struct config_section_stack *section) +{ + if (section == NULL) + return; + + section_stack_write(str, section->prev); + if (!section->is_filter && section->key != NULL) + str_printfa(str, "%s { ", section->key); +} + +static const char * +get_setting_full_path(struct config_parser_context *ctx, const char *key) +{ + string_t *str = t_str_new(128); + + section_stack_write(str, ctx->cur_section); + str_append(str, key); + return str_c(str); +} + int config_apply_line(struct config_parser_context *ctx, const char *key, const char *line, const char *section_name) { @@ -131,7 +152,7 @@ } if (!found) { ctx->error = p_strconcat(ctx->pool, "Unknown setting: ", - key, NULL); + get_setting_full_path(ctx, key), NULL); return -1; } return 0; @@ -332,6 +353,7 @@ ctx->cur_section->parsers = parser->parsers; else config_add_new_parser(ctx); + ctx->cur_section->is_filter = TRUE; return TRUE; } @@ -899,6 +921,7 @@ case CONFIG_LINE_TYPE_SECTION_BEGIN: ctx->cur_section = config_add_new_section(ctx); ctx->cur_section->pathlen = ctx->pathlen; + ctx->cur_section->key = p_strdup(ctx->pool, key); if (config_filter_add_new_filter(ctx, key, value)) { /* new filter */