From: Timo Sirainen Date: Thu, 11 Feb 2021 23:54:48 +0000 (+0200) Subject: doveadm: Add doveadm_setting_roots_*() API for plugins to register settings X-Git-Tag: 2.3.16~127 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=d8841feb84e15cdd5cb6cb1c63802f1808dcfbd6;p=thirdparty%2Fdovecot%2Fcore.git doveadm: Add doveadm_setting_roots_*() API for plugins to register settings --- diff --git a/src/doveadm/doveadm-settings.c b/src/doveadm/doveadm-settings.c index da8d1dd23c..c363dce9b5 100644 --- a/src/doveadm/doveadm-settings.c +++ b/src/doveadm/doveadm-settings.c @@ -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); } diff --git a/src/doveadm/doveadm-settings.h b/src/doveadm/doveadm-settings.h index 6e72ff6768..b3c2184401 100644 --- a/src/doveadm/doveadm-settings.h +++ b/src/doveadm/doveadm-settings.h @@ -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 diff --git a/src/doveadm/doveadm.c b/src/doveadm/doveadm.c index 8ddb83ce05..792bf90488 100644 --- a/src/doveadm/doveadm.c +++ b/src/doveadm/doveadm.c @@ -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 */ diff --git a/src/doveadm/main.c b/src/doveadm/main.c index 6fb2b5b8f0..e8e9c91c9a 100644 --- a/src/doveadm/main.c +++ b/src/doveadm/main.c @@ -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(); diff --git a/src/lib-master/master-service-settings.c b/src/lib-master/master-service-settings.c index d9c70eb333..4f81c89b9e 100644 --- a/src/lib-master/master-service-settings.c +++ b/src/lib-master/master-service-settings.c @@ -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)