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 */