return 0;
}
+static void
+config_parse_merge_default_filters(struct config_parser_context *ctx,
+ struct config_parsed *config)
+{
+ struct config_filter_parser *root_parser, *defaults_parser;
+
+ root_parser = array_idx_elem(&ctx->all_filter_parsers, 0);
+ defaults_parser = array_idx_elem(&ctx->all_filter_parsers, 1);
+ i_assert(config_filter_is_empty_defaults(&defaults_parser->filter));
+
+ config_filters_merge(ctx, config, root_parser, defaults_parser);
+}
+
static void
config_parse_finish_service_defaults(struct config_parser_context *ctx)
{
ctx->path, error);
}
+ /* Merge defaults into main settings after running settings checks. */
+ if (ret == 0 && (flags & CONFIG_PARSE_FLAG_MERGE_DEFAULT_FILTERS) != 0)
+ config_parse_merge_default_filters(ctx, new_config);
+
if (ret < 0 && (flags & CONFIG_PARSE_FLAG_RETURN_BROKEN_CONFIG) == 0) {
config_parsed_free(&new_config);
return -1;
/* Expand include @groups after parsing settings. This can be useful
for doveconf output. */
CONFIG_PARSE_FLAG_MERGE_GROUP_FILTERS = BIT(8),
+ /* Merge default filters with non-default filters. This can be useful
+ for doveconf output. */
+ CONFIG_PARSE_FLAG_MERGE_DEFAULT_FILTERS = BIT(9),
};
/* Used to track changed settings for a setting_parser_info. Initially only
case 'd':
scope = CONFIG_DUMP_SCOPE_ALL_WITHOUT_HIDDEN;
dump_defaults = TRUE;
+ flags |= CONFIG_PARSE_FLAG_MERGE_DEFAULT_FILTERS;
break;
case 'F':
dump_full = TRUE;
if (scope == CONFIG_DUMP_SCOPE_ALL_WITHOUT_HIDDEN)
scope = CONFIG_DUMP_SCOPE_ALL_WITH_HIDDEN;
flags |= CONFIG_PARSE_FLAG_PREFIXES_IN_FILTERS |
- CONFIG_PARSE_FLAG_MERGE_GROUP_FILTERS;
+ CONFIG_PARSE_FLAG_MERGE_GROUP_FILTERS |
+ CONFIG_PARSE_FLAG_MERGE_DEFAULT_FILTERS;
} else if (!simple_output) {
/* print the config file path before parsing it, so in case
of errors it's still shown */