commit 088279cc44ec62ae2befb0ce1c0ac9900f2f444a Author: Jacob Welsh AuthorDate: Sat Oct 29 19:18:22 2022 +0000 Commit: Jacob Welsh CommitDate: Sat Oct 29 19:40:24 2022 +0000 Type: adopting new structure doveadm, lib-storage, lmtp: switch to static module loading Covers 8, 10, 12 and 14 from http://fixpoint.welshcomputing.com/2022/classifying-the-dovecot-module-menagerie-by-load-point/ diff --git a/src/doveadm/Makefile.am b/src/doveadm/Makefile.am index 440af73e37..04935ddc2c 100644 --- a/src/doveadm/Makefile.am +++ b/src/doveadm/Makefile.am @@ -27,7 +27,6 @@ AM_CPPFLAGS = \ -I$(top_srcdir)/src/stats \ -DMODULEDIR=\""$(moduledir)"\" \ -DAUTH_MODULE_DIR=\""$(moduledir)/auth"\" \ - -DDOVEADM_MODULEDIR=\""$(doveadm_moduledir)"\" \ -DPKG_RUNDIR=\""$(rundir)"\" \ -DPKG_STATEDIR=\""$(statedir)"\" \ -DPKG_LIBEXECDIR=\""$(pkglibexecdir)"\" \ diff --git a/src/doveadm/doveadm-mail.c b/src/doveadm/doveadm-mail.c index 574c3b7f34..5983e77917 100644 --- a/src/doveadm/doveadm-mail.c +++ b/src/doveadm/doveadm-mail.c @@ -785,20 +785,9 @@ void doveadm_mail_init(void) void doveadm_mail_init_finish(void) { - struct module_dir_load_settings mod_set; - - i_zero(&mod_set); - mod_set.abi_version = DOVECOT_ABI_VERSION; - mod_set.require_init_funcs = TRUE; - mod_set.debug = doveadm_debug; - mod_set.binary_name = "doveadm"; - /* load all configured mail plugins */ - mail_storage_service_modules = - module_dir_load_missing(mail_storage_service_modules, - doveadm_settings->mail_plugin_dir, - doveadm_settings->mail_plugins, - &mod_set); + module_dir_load_mail(&mail_storage_service_modules, + doveadm_settings->mail_plugins); /* keep mail_storage_init() referenced so that its _deinit() doesn't try to free doveadm plugins' hooks too early. */ mail_storage_init(); diff --git a/src/doveadm/doveadm-util.c b/src/doveadm/doveadm-util.c index a65ef7f723..daf4cf3592 100644 --- a/src/doveadm/doveadm-util.c +++ b/src/doveadm/doveadm-util.c @@ -11,9 +11,6 @@ #include "doveadm-util.h" #include -#include -#include -#include #define DOVEADM_TCP_CONNECT_TIMEOUT_SECS 30 @@ -22,19 +19,11 @@ static struct module *modules = NULL; void doveadm_load_modules(void) { - struct module_dir_load_settings mod_set; - /* some doveadm plugins have dependencies to mail plugins. we can load only those whose dependencies have been loaded earlier, the rest are - ignored. */ - i_zero(&mod_set); - mod_set.abi_version = DOVECOT_ABI_VERSION; - mod_set.require_init_funcs = TRUE; - mod_set.debug = doveadm_debug; - mod_set.ignore_dlopen_errors = TRUE; - - modules = module_dir_load_missing(modules, DOVEADM_MODULEDIR, - NULL, &mod_set); + ignored. + (XXX is this still meaningful with static modules? what dependencies are those?) */ + module_dir_load_adm(&modules, NULL); module_dir_init(modules); } @@ -43,41 +32,6 @@ void doveadm_unload_modules(void) module_dir_unload(&modules); } -bool doveadm_has_unloaded_plugin(const char *name) -{ - struct module *module; - DIR *dir; - struct dirent *d; - const char *plugin_name; - size_t name_len = strlen(name); - bool found = FALSE; - - /* first check that it's not actually loaded */ - for (module = modules; module != NULL; module = module->next) { - if (strcmp(module_get_plugin_name(module), name) == 0) - return FALSE; - } - - dir = opendir(DOVEADM_MODULEDIR); - if (dir == NULL) - return FALSE; - - while ((d = readdir(dir)) != NULL) { - plugin_name = module_file_get_name(d->d_name); - if (str_begins(plugin_name, "doveadm_")) - plugin_name += 8; - - if (strncmp(plugin_name, name, name_len) == 0 && - (plugin_name[name_len] == '\0' || - strcmp(plugin_name + name_len, "_plugin") == 0)) { - found = TRUE; - break; - } - } - (void)closedir(dir); - return found; -} - const char *unixdate2str(time_t timestamp) { return t_strflocaltime("%Y-%m-%d %H:%M:%S", timestamp); diff --git a/src/doveadm/doveadm-util.h b/src/doveadm/doveadm-util.h index 8aefd92f34..6049d36cbf 100644 --- a/src/doveadm/doveadm-util.h +++ b/src/doveadm/doveadm-util.h @@ -19,7 +19,6 @@ int doveadm_connect_with_default_port(const char *path, void doveadm_load_modules(void); void doveadm_unload_modules(void); -bool doveadm_has_unloaded_plugin(const char *name); char doveadm_log_type_to_char(enum log_type type) ATTR_PURE; bool doveadm_log_type_from_char(char c, enum log_type *type_r); diff --git a/src/doveadm/doveadm.c b/src/doveadm/doveadm.c index f175f2c7b5..424447b17c 100644 --- a/src/doveadm/doveadm.c +++ b/src/doveadm/doveadm.c @@ -361,11 +361,6 @@ int main(int argc, char *argv[]) if (!doveadm_cmd_try_run_ver2(cmd_name, argc, (const char**)argv, &cctx)) { if (doveadm_has_subcommands(cmd_name)) usage_prefix(cmd_name); - if (doveadm_has_unloaded_plugin(cmd_name)) { - i_fatal("Unknown command '%s', but plugin %s exists. " - "Try to set mail_plugins=%s", - cmd_name, cmd_name, cmd_name); - } usage(); } diff --git a/src/lib-storage/mail-storage-service.c b/src/lib-storage/mail-storage-service.c index 567ecb8bc3..35b0151770 100644 --- a/src/lib-storage/mail-storage-service.c +++ b/src/lib-storage/mail-storage-service.c @@ -1138,28 +1138,14 @@ mail_storage_service_first_init(struct mail_storage_service_ctx *ctx, static int mail_storage_service_load_modules(struct mail_storage_service_ctx *ctx, - const struct setting_parser_info *user_info, - const struct mail_user_settings *user_set, - const char **error_r) + const struct mail_user_settings *user_set) { - struct module_dir_load_settings mod_set; - if (*user_set->mail_plugins == '\0') return 0; if ((ctx->flags & MAIL_STORAGE_SERVICE_FLAG_NO_PLUGINS) != 0) return 0; - - i_zero(&mod_set); - mod_set.abi_version = DOVECOT_ABI_VERSION; - mod_set.binary_name = master_service_get_name(ctx->service); - mod_set.setting_name = "mail_plugins"; - mod_set.require_init_funcs = TRUE; - mod_set.debug = mail_user_set_get_mail_debug(user_info, user_set); - - return module_dir_try_load_missing(&mail_storage_service_modules, - user_set->mail_plugin_dir, - user_set->mail_plugins, - &mod_set, error_r); + module_dir_load_mail(&mail_storage_service_modules, + user_set->mail_plugins); } static int extra_field_key_cmp_p(const char *const *s1, const char *const *s2) @@ -1273,10 +1259,7 @@ mail_storage_service_lookup_real(struct mail_storage_service_ctx *ctx, if (ctx->conn == NULL) mail_storage_service_first_init(ctx, user_info, user_set, flags); /* load global plugins */ - if (mail_storage_service_load_modules(ctx, user_info, user_set, error_r) < 0) { - pool_unref(&user_pool); - return -1; - } + mail_storage_service_load_modules(ctx, user_set); if (ctx->userdb_next_pool == NULL) temp_pool = pool_alloconly_create("userdb lookup", 2048); @@ -1364,11 +1347,7 @@ mail_storage_service_lookup_real(struct mail_storage_service_ctx *ctx, /* load per-user plugins */ if (ret > 0) { - if (mail_storage_service_load_modules(ctx, user_info, - user->user_set, - error_r) < 0) { - ret = -2; - } + mail_storage_service_load_modules(ctx, user->user_set); } if ((ctx->flags & MAIL_STORAGE_SERVICE_FLAG_NO_PLUGINS) != 0 && user_set->mail_plugins[0] != '\0') { diff --git a/src/lmtp/lmtp-client.c b/src/lmtp/lmtp-client.c index 2757c803a6..93c23f4328 100644 --- a/src/lmtp/lmtp-client.c +++ b/src/lmtp/lmtp-client.c @@ -81,19 +81,8 @@ static void refresh_proctitle(void) static void client_load_modules(struct client *client) { - struct module_dir_load_settings mod_set; - - i_zero(&mod_set); - mod_set.abi_version = DOVECOT_ABI_VERSION; - mod_set.require_init_funcs = TRUE; - mod_set.binary_name = "lmtp"; - - /* pre-load all configured mail plugins */ - mail_storage_service_modules = - module_dir_load_missing(mail_storage_service_modules, - client->lmtp_set->mail_plugin_dir, - client->lmtp_set->mail_plugins, - &mod_set); + module_dir_load_mail(&mail_storage_service_modules, + client->lmtp_set->mail_plugins); module_dir_init(mail_storage_service_modules); }