]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
doveconf: Add -U parameter to ignore unknown settings in config file
authorTimo Sirainen <timo.sirainen@open-xchange.com>
Mon, 3 Mar 2025 13:12:34 +0000 (15:12 +0200)
committeraki.tuomi <aki.tuomi@open-xchange.com>
Fri, 7 Mar 2025 06:31:10 +0000 (06:31 +0000)
src/config/config-parser-private.h
src/config/config-parser.c
src/config/config-parser.h
src/config/doveconf.c

index 3e9729a2ffbc38dcc38455a590ae752cfb4bcd14..9416f0b10e32e47fd97297500ec0d494f750c57f 100644 (file)
@@ -105,6 +105,7 @@ struct config_parser_context {
        bool hide_errors:1;
        bool delay_errors:1;
        bool hide_obsolete_warnings:1;
+       bool ignore_unknown:1;
 };
 
 extern void (*hook_config_parser_begin)(struct config_parser_context *ctx);
index e1d3d137986321722e2eae1f34be327537a30632..751ffb0fc2f362e7a6de17693e95269a65b42dd5 100644 (file)
@@ -1029,6 +1029,8 @@ again:
        }
        ctx->cur_section->filter_parser = orig_filter_parser;
        if (ret == 0) {
+               if (ctx->ignore_unknown)
+                       return 0;
                ctx->error = p_strconcat(ctx->pool, "Unknown setting: ",
                                         get_setting_full_path(ctx, key), NULL);
                return -1;
@@ -2707,6 +2709,8 @@ void config_parser_apply_line(struct config_parser_context *ctx,
                        break;
                }
                if (hash_table_lookup(ctx->all_keys, key) == NULL) {
+                       if (ctx->ignore_unknown)
+                               break;
                        ctx->error = p_strdup_printf(ctx->pool,
                                "Unknown section name: %s", key);
                        break;
@@ -2851,6 +2855,7 @@ int config_parse_file(const char *path, enum config_parse_flags flags,
        ctx.hide_obsolete_warnings =
                (flags & CONFIG_PARSE_FLAG_HIDE_OBSOLETE_WARNINGS) != 0;
        ctx.delay_errors = (flags & CONFIG_PARSE_FLAG_DELAY_ERRORS) != 0;
+       ctx.ignore_unknown = (flags & CONFIG_PARSE_FLAG_IGNORE_UNKNOWN) != 0;
        hash_table_create(&ctx.all_keys, ctx.pool, 500, str_hash, strcmp);
 
        for (count = 0; all_infos[count] != NULL; count++) ;
index 307c6ecd0d9fc6762b2d087e9ce481ccf57ebb6c..7c1bd128b6b0c36dd8352fcbf1353e2fc6a530f5 100644 (file)
@@ -35,6 +35,8 @@ enum config_parse_flags {
        /* Merge default filters with non-default filters. This can be useful
           for doveconf output. */
        CONFIG_PARSE_FLAG_MERGE_DEFAULT_FILTERS = BIT(9),
+       /* Ignore unknown settings in the config file. */
+       CONFIG_PARSE_FLAG_IGNORE_UNKNOWN = BIT(10),
 };
 
 /* Used to track changed settings for a setting_parser_info. Initially only
index 161a206d3ffec307f0ed4882fbcb5183ceacbe78..41b646f87f84a2010570b4d0be038d13800b7a4b 100644 (file)
@@ -1051,7 +1051,7 @@ int main(int argc, char *argv[])
        }
 
        master_service = master_service_init("config", master_service_flags,
-                                            &argc, &argv, "aCdf:FhHI:nNPwxs");
+                                            &argc, &argv, "aCdf:FhHI:nNPwxsU");
        orig_config_path = t_strdup(master_service_get_config_path(master_service));
 
        i_set_failure_prefix("doveconf: ");
@@ -1108,6 +1108,9 @@ int main(int argc, char *argv[])
                case 's':
                        scope = CONFIG_DUMP_SCOPE_ALL_WITH_HIDDEN;
                        break;
+               case 'U':
+                       flags |= CONFIG_PARSE_FLAG_IGNORE_UNKNOWN;
+                       break;
                case 'w':
                        flags |= CONFIG_PARSE_FLAG_HIDE_OBSOLETE_WARNINGS;
                        break;