]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
doveadm: Add doveadm_setting_roots_*() API for plugins to register settings
authorTimo Sirainen <timo.sirainen@open-xchange.com>
Thu, 11 Feb 2021 23:54:48 +0000 (01:54 +0200)
committeraki.tuomi <aki.tuomi@open-xchange.com>
Fri, 21 May 2021 07:46:29 +0000 (07:46 +0000)
src/doveadm/doveadm-settings.c
src/doveadm/doveadm-settings.h
src/doveadm/doveadm.c
src/doveadm/main.c
src/lib-master/master-service-settings.c

index da8d1dd23c77c69c79970a111919b6baf63e1bbd..c363dce9b50d435ea5a86568673098bf3034dedb 100644 (file)
@@ -1,8 +1,8 @@
 /* Copyright (c) 2010-2018 Dovecot authors, see the included COPYING file */
 
 #include "lib.h"
+#include "array.h"
 #include "var-expand.h"
-#include "buffer.h"
 #include "settings-parser.h"
 #include "service-settings.h"
 #include "mail-storage-settings.h"
@@ -12,6 +12,7 @@
 #include "iostream-ssl.h"
 #include "doveadm-settings.h"
 
+ARRAY_TYPE(doveadm_setting_root) doveadm_setting_roots;
 bool doveadm_verbose_proctitle;
 
 static pool_t doveadm_settings_pool = NULL;
@@ -229,19 +230,35 @@ void doveadm_settings_expand(struct doveadm_settings *set, pool_t pool)
 
 void doveadm_read_settings(void)
 {
-       static const struct setting_parser_info *set_roots[] = {
+       static const struct setting_parser_info *default_set_roots[] = {
                &master_service_ssl_setting_parser_info,
                &doveadm_setting_parser_info,
-               NULL
        };
        struct master_service_settings_input input;
        struct master_service_settings_output output;
        const struct doveadm_settings *set;
+       struct doveadm_setting_root *root;
+       ARRAY(const struct setting_parser_info *) set_roots;
+       ARRAY_TYPE(const_string) module_names;
+       void **sets;
        const char *error;
 
+       t_array_init(&set_roots, N_ELEMENTS(default_set_roots) +
+                    array_count(&doveadm_setting_roots) + 1);
+       array_append(&set_roots, default_set_roots,
+                    N_ELEMENTS(default_set_roots));
+       t_array_init(&module_names, 4);
+       array_foreach_modifiable(&doveadm_setting_roots, root) {
+               array_push_back(&module_names, &root->info->module_name);
+               array_push_back(&set_roots, &root->info);
+       }
+       array_append_zero(&module_names);
+       array_append_zero(&set_roots);
+
        i_zero(&input);
-       input.roots = set_roots;
+       input.roots = array_front(&set_roots);
        input.module = "doveadm";
+       input.extra_modules = array_front(&module_names);
        input.service = "doveadm";
        input.preserve_user = TRUE;
        input.preserve_home = TRUE;
@@ -255,7 +272,8 @@ void doveadm_read_settings(void)
                                   service_set, doveadm_settings_pool);
        doveadm_verbose_proctitle = service_set->verbose_proctitle;
 
-       set = master_service_settings_get_others(master_service)[1];
+       sets = master_service_settings_get_others(master_service);
+       set = sets[1];
        doveadm_settings = settings_dup(&doveadm_setting_parser_info, set,
                                        doveadm_settings_pool);
        doveadm_ssl_set = settings_dup(&master_service_ssl_setting_parser_info,
@@ -263,9 +281,41 @@ void doveadm_read_settings(void)
                                       doveadm_settings_pool);
        doveadm_settings_expand(doveadm_settings, doveadm_settings_pool);
        doveadm_settings->parsed_features = set->parsed_features; /* copy this value by hand */
+
+       array_foreach_modifiable(&doveadm_setting_roots, root) {
+               unsigned int idx =
+                       array_foreach_idx(&doveadm_setting_roots, root);
+               root->settings = settings_dup(root->info, sets[2+idx],
+                                             doveadm_settings_pool);
+       }
+}
+
+void doveadm_setting_roots_add(const struct setting_parser_info *info)
+{
+       struct doveadm_setting_root *root;
+
+       root = array_append_space(&doveadm_setting_roots);
+       root->info = info;
+}
+
+void *doveadm_setting_roots_get_settings(const struct setting_parser_info *info)
+{
+       const struct doveadm_setting_root *root;
+
+       array_foreach(&doveadm_setting_roots, root) {
+               if (root->info == info)
+                       return root->settings;
+       }
+       i_panic("Failed to find settings for module %s", info->module_name);
+}
+
+void doveadm_settings_init(void)
+{
+       i_array_init(&doveadm_setting_roots, 8);
 }
 
 void doveadm_settings_deinit(void)
 {
+       array_free(&doveadm_setting_roots);
        pool_unref(&doveadm_settings_pool);
 }
index 6e72ff676869c00b1da988776ea663b80f99402a..b3c2184401f2a7cd7ed20c172f59c6382ff17421 100644 (file)
@@ -38,16 +38,28 @@ struct doveadm_settings {
        ARRAY(const char *) plugin_envs;
 };
 
+struct doveadm_setting_root {
+       const struct setting_parser_info *info;
+       void *settings;
+};
+ARRAY_DEFINE_TYPE(doveadm_setting_root, struct doveadm_setting_root);
+
 extern const struct setting_parser_info doveadm_setting_parser_info;
 extern struct doveadm_settings *doveadm_settings;
 extern const struct master_service_settings *service_set;
 extern const struct master_service_ssl_settings *doveadm_ssl_set;
+extern ARRAY_TYPE(doveadm_setting_root) doveadm_setting_roots;
 extern bool doveadm_verbose_proctitle;
 
 void doveadm_get_ssl_settings(struct ssl_iostream_settings *set_r, pool_t pool);
 void doveadm_settings_expand(struct doveadm_settings *set, pool_t pool);
 
+void doveadm_setting_roots_add(const struct setting_parser_info *info);
+void *doveadm_setting_roots_get_settings(const struct setting_parser_info *info);
+
 void doveadm_read_settings(void);
+
+void doveadm_settings_init(void);
 void doveadm_settings_deinit(void);
 
 #endif
index 8ddb83ce050c492dc66c82bff091da6e89ab12f7..792bf904883336a9fd64187ca9c79c1a19692f4f 100644 (file)
@@ -297,6 +297,7 @@ int main(int argc, char *argv[])
        }
        cmd_name = argv[optind];
 
+       doveadm_settings_init();
        if (cmd_name != NULL && strcmp(cmd_name, "help") == 0 &&
            argv[optind+1] != NULL) {
                /* "help cmd" doesn't need any configuration */
index 6fb2b5b8f06579fcf9dbd7d2767815f3d50ed3e2..e8e9c91c9a1755719747ae10dd6464fcd790f601 100644 (file)
@@ -68,6 +68,7 @@ static void main_init(void)
 {
        doveadm_server = TRUE;
 
+       doveadm_settings_init();
        doveadm_cmds_init();
        doveadm_register_auth_server_commands();
        doveadm_dump_init();
index d9c70eb333e612681e59297fc3421f0a5b4e759f..4f81c89b9e6cbb945367e67b8d573c90cc734d4a 100644 (file)
@@ -351,11 +351,15 @@ config_build_request(struct master_service *service, string_t *str,
                     const struct master_service_settings_input *input)
 {
        str_append(str, "REQ");
-       if (input->module != NULL) {
+       if (input->module != NULL)
                str_printfa(str, "\tmodule=%s", input->module);
-               if (service->want_ssl_settings)
-                       str_append(str, "\tmodule=ssl");
+       if (input->extra_modules != NULL) {
+               for (unsigned int i = 0; input->extra_modules[i] != NULL; i++)
+                       str_printfa(str, "\tmodule=%s", input->extra_modules[i]);
        }
+       if (service->want_ssl_settings &&
+           (input->module != NULL || input->extra_modules != NULL))
+               str_append(str, "\tmodule=ssl");
        if (input->service != NULL)
                str_printfa(str, "\tservice=%s", input->service);
        if (input->username != NULL)