From: Timo Sirainen Date: Wed, 7 Jun 2023 08:23:04 +0000 (+0300) Subject: config: Apply setting_parser_info.default_settings to default config X-Git-Tag: 2.4.1~1565 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=8911ca5bf78563c238155b60ed05b2df6802c314;p=thirdparty%2Fdovecot%2Fcore.git config: Apply setting_parser_info.default_settings to default config --- diff --git a/src/config/config-parser.c b/src/config/config-parser.c index a615f6f917..859b40ebdc 100644 --- a/src/config/config-parser.c +++ b/src/config/config-parser.c @@ -234,6 +234,25 @@ static void config_parser_add_services(struct config_parser_context *ctx, } T_END; } +static void config_parser_add_info_defaults(struct config_parser_context *ctx, + const struct setting_parser_info *info) +{ + if (info->default_settings == NULL) + return; + + config_parser_set_change_counter(ctx, CONFIG_PARSER_CHANGE_INTERNAL); + for (unsigned int i = 0; info->default_settings[i].key != NULL; i++) { + if (config_apply_line(ctx, info->default_settings[i].key, + info->default_settings[i].value, NULL) < 0) { + i_panic("Failed to add default setting %s=%s for struct %s: %s", + info->default_settings[i].key, + info->default_settings[i].value, + info->name, ctx->error); + } + } + config_parser_set_change_counter(ctx, CONFIG_PARSER_CHANGE_EXPLICIT); +} + static bool config_parser_is_in_localremote(struct config_section_stack *section) { @@ -1856,8 +1875,11 @@ int config_parse_file(const char *path, enum config_parse_flags flags, i_stream_create_from_data("", 0); i_stream_set_return_partial_line(ctx.cur_input->input, TRUE); old_settings_init(&ctx); - if ((flags & CONFIG_PARSE_FLAG_NO_DEFAULTS) == 0) + if ((flags & CONFIG_PARSE_FLAG_NO_DEFAULTS) == 0) { config_parser_add_services(&ctx, service_info_idx); + for (i = 0; i < count; i++) + config_parser_add_info_defaults(&ctx, all_infos[i]); + } if (hook_config_parser_begin != NULL && (flags & CONFIG_PARSE_FLAG_EXTERNAL_HOOKS) != 0) T_BEGIN { hook_config_parser_begin(&ctx); diff --git a/src/config/settings-get.pl b/src/config/settings-get.pl index f29dc850ac..3e58abc0c4 100755 --- a/src/config/settings-get.pl +++ b/src/config/settings-get.pl @@ -52,7 +52,8 @@ foreach my $file (@ARGV) { if ($state eq "root") { if (/struct .*_settings \{/ || /struct setting_define.*\{/ || - /struct .*_default_settings = \{/) { + /struct .*_default_settings = \{/ || + /struct setting_keyvalue.*_default_settings_keyvalue\[\] = \{/) { # settings-related structure - copy. $state = "copy-to-end-of-block"; } elsif (/^struct service_settings (.*) = \{/) {