From: Timo Sirainen Date: Sat, 20 May 2017 15:13:45 +0000 (+0300) Subject: config: When showing an "Unknown setting" error, show the full section path X-Git-Tag: 2.3.0.rc1~1582 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=e3d797bc851dc90fb88e68ae715c204d0f46e6ff;p=thirdparty%2Fdovecot%2Fcore.git 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. --- diff --git a/src/config/config-parser-private.h b/src/config/config-parser-private.h index 2527c5f9d4..9fe98cee54 100644 --- a/src/config/config-parser-private.h +++ b/src/config/config-parser-private.h @@ -19,6 +19,7 @@ enum config_line_type { 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 @@ struct config_section_stack { const char *open_path; unsigned int open_linenum; + bool is_filter; }; struct input_stack { diff --git a/src/config/config-parser.c b/src/config/config-parser.c index b8578f4785..be0f6c7d6e 100644 --- a/src/config/config-parser.c +++ b/src/config/config-parser.c @@ -99,6 +99,27 @@ config_parser_is_in_localremote(struct config_section_stack *section) 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 @@ int config_apply_line(struct config_parser_context *ctx, const char *key, } 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 @@ config_filter_add_new_filter(struct config_parser_context *ctx, ctx->cur_section->parsers = parser->parsers; else config_add_new_parser(ctx); + ctx->cur_section->is_filter = TRUE; return TRUE; } @@ -899,6 +921,7 @@ void config_parser_apply_line(struct config_parser_context *ctx, 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 */