commit 4bacd273247cd9309f790cdced966b703010388d Author: Jacob Welsh AuthorDate: Thu Nov 3 16:30:02 2022 +0000 Commit: Jacob Welsh CommitDate: Thu Nov 3 17:47:07 2022 +0000 Type: adopting new structure auth, config, lib-dcrypt, lib-ssl-iostream, lib, old-stats: switch to static module loading Covers 2, 3, 5, 7 and 13 from http://fixpoint.welshcomputing.com/2022/classifying-the-dovecot-module-menagerie-by-load-point/ diff --git a/src/auth/Makefile.am b/src/auth/Makefile.am index 5d71848748..207c6f3b20 100644 --- a/src/auth/Makefile.am +++ b/src/auth/Makefile.am @@ -35,7 +35,6 @@ AM_CPPFLAGS = \ -I$(top_srcdir)/src/lib-ssl-iostream \ -I$(top_srcdir)/src/lib-lua \ -I$(top_srcdir)/src/lib-dcrypt \ - -DAUTH_MODULE_DIR=\""$(auth_moduledir)"\" \ -DPKG_LIBEXECDIR=\""$(pkglibexecdir)"\" \ -DPKG_RUNDIR=\""$(rundir)"\" \ -DSYSCONFDIR=\""$(sysconfdir)/dovecot"\" \ diff --git a/src/auth/main.c b/src/auth/main.c index 4bdb84d6b2..de4a8263cc 100644 --- a/src/auth/main.c +++ b/src/auth/main.c @@ -164,7 +164,7 @@ static void main_preinit(void) sql_drivers_register_all(); /* Initialize databases so their configuration files can be readable - only by root. Also load all modules here. */ + only by root. */ passdbs_init(); userdbs_init(); /* init schemes before plugins are loaded */ @@ -192,16 +192,7 @@ static void main_preinit(void) void auth_module_load(const char *names) { - 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 = global_auth_settings->debug; - mod_set.ignore_missing = TRUE; - - modules = module_dir_load_missing(modules, AUTH_MODULE_DIR, names, - &mod_set); + module_dir_load_auth(&modules, names); module_dir_init(modules); } diff --git a/src/config/Makefile.am b/src/config/Makefile.am index 084ec0ed98..206dd39f2f 100644 --- a/src/config/Makefile.am +++ b/src/config/Makefile.am @@ -16,7 +16,6 @@ AM_CPPFLAGS = \ -DPKG_STATEDIR=\""$(statedir)"\" \ -DPKG_LIBEXECDIR=\""$(pkglibexecdir)"\" \ -DEXAMPLE_CONFIG_DIR=\""$(exampledir)"\" \ - -DMODULEDIR=\""$(moduledir)"\" \ -DSSLDIR=\""$(ssldir)\"" \ -DSYSCONFDIR=\""$(pkgsysconfdir)"\" \ $(BINARY_CFLAGS) diff --git a/src/config/config-parser.c b/src/config/config-parser.c index 9d3679621f..c0b0a89503 100644 --- a/src/config/config-parser.c +++ b/src/config/config-parser.c @@ -1098,7 +1098,6 @@ prevfile: void config_parse_load_modules(void) { - struct module_dir_load_settings mod_set; struct module *m; const struct setting_parser_info **roots; ARRAY_TYPE(setting_parser_info_p) new_roots; @@ -1106,11 +1105,10 @@ void config_parse_load_modules(void) struct service_settings *const *services, *service_set; unsigned int i, count; - i_zero(&mod_set); - mod_set.abi_version = DOVECOT_ABI_VERSION; - modules = module_dir_load(CONFIG_MODULE_DIR, NULL, &mod_set); + module_dir_load_settings(&modules, NULL); module_dir_init(modules); + /* TODO make this mess work statically (ie without module_get_symbol*), perhaps by hard-wiring it to pigeonhole's plugins */ i_array_init(&new_roots, 64); i_array_init(&new_services, 64); for (m = modules; m != NULL; m = m->next) { diff --git a/src/config/config-parser.h b/src/config/config-parser.h index e0a0a5bea3..f89ff2cc8f 100644 --- a/src/config/config-parser.h +++ b/src/config/config-parser.h @@ -1,8 +1,6 @@ #ifndef CONFIG_PARSER_H #define CONFIG_PARSER_H -#define CONFIG_MODULE_DIR MODULEDIR"/settings" - #define IS_WHITE(c) ((c) == ' ' || (c) == '\t') struct config_module_parser { diff --git a/src/lib-dcrypt/Makefile.am b/src/lib-dcrypt/Makefile.am index e9e5116953..cbc0029464 100644 --- a/src/lib-dcrypt/Makefile.am +++ b/src/lib-dcrypt/Makefile.am @@ -7,7 +7,6 @@ AM_CPPFLAGS = \ -I$(top_srcdir)/src/lib \ -I$(top_srcdir)/src/lib-test \ -I$(top_srcdir)/src/lib-ssl-iostream \ - -DDCRYPT_MODULE_DIR=\"$(pkglibdir)\" libdcrypt_la_SOURCES = \ dcrypt.c \ @@ -15,7 +14,6 @@ libdcrypt_la_SOURCES = \ ostream-encrypt.c libdcrypt_la_CFLAGS = $(AM_CPPFLAGS) \ - -DDCRYPT_MODULE_DIR=\"$(pkglibdir)\" if BUILD_DCRYPT_OPENSSL pkglib_LTLIBRARIES += libdcrypt_openssl.la diff --git a/src/lib-dcrypt/dcrypt.c b/src/lib-dcrypt/dcrypt.c index 9916754eae..b699fb3989 100644 --- a/src/lib-dcrypt/dcrypt.c +++ b/src/lib-dcrypt/dcrypt.c @@ -9,16 +9,11 @@ static struct module *dcrypt_module = NULL; static struct dcrypt_vfs *dcrypt_vfs = NULL; -static const struct dcrypt_settings dcrypt_default_set = { - .module_dir = DCRYPT_MODULE_DIR, -}; +static const struct dcrypt_settings dcrypt_default_set = { NULL }; bool dcrypt_initialize(const char *backend, const struct dcrypt_settings *set, const char **error_r) { - struct module_dir_load_settings mod_set; - const char *error; - if (dcrypt_vfs != NULL) { return TRUE; } @@ -28,15 +23,7 @@ bool dcrypt_initialize(const char *backend, const struct dcrypt_settings *set, const char *implementation = t_strconcat("dcrypt_",backend,NULL); - i_zero(&mod_set); - mod_set.abi_version = DOVECOT_ABI_VERSION; - mod_set.require_init_funcs = TRUE; - if (module_dir_try_load_missing(&dcrypt_module, set->module_dir, - implementation, &mod_set, &error) < 0) { - if (error_r != NULL) - *error_r = error; - return FALSE; - } + module_dir_load_dcrypt_backend(&dcrypt_module, implementation); module_dir_init(dcrypt_module); i_assert(dcrypt_vfs != NULL); if (dcrypt_vfs->initialize != NULL) { diff --git a/src/lib-dcrypt/dcrypt.h b/src/lib-dcrypt/dcrypt.h index 0e8a9aa6e8..fffee831a5 100644 --- a/src/lib-dcrypt/dcrypt.h +++ b/src/lib-dcrypt/dcrypt.h @@ -78,8 +78,6 @@ enum dcrypt_padding { struct dcrypt_settings { /* OpenSSL engine to use */ const char *crypto_device; - /* Look for backends in this directory */ - const char *module_dir; }; struct dcrypt_raw_key { diff --git a/src/lib-dcrypt/test-crypto.c b/src/lib-dcrypt/test-crypto.c index ce43791a29..11789f4652 100644 --- a/src/lib-dcrypt/test-crypto.c +++ b/src/lib-dcrypt/test-crypto.c @@ -1268,12 +1268,9 @@ static void test_static_verify_ecdsa_x962(void) int main(void) { - struct dcrypt_settings set = { - .module_dir = ".libs" - }; const char *error; - if (!dcrypt_initialize(NULL, &set, &error)) { + if (!dcrypt_initialize(NULL, NULL, &error)) { i_error("No functional dcrypt backend found - " "skipping tests: %s", error); return 0; diff --git a/src/lib-ssl-iostream/Makefile.am b/src/lib-ssl-iostream/Makefile.am index 5aaea5d51f..d6240aaf0f 100644 --- a/src/lib-ssl-iostream/Makefile.am +++ b/src/lib-ssl-iostream/Makefile.am @@ -5,7 +5,6 @@ NOPLUGIN_LDFLAGS = AM_CPPFLAGS = \ -I$(top_srcdir)/src/lib \ -I$(top_srcdir)/src/lib-test \ - -DMODULE_DIR=\""$(moduledir)"\" if BUILD_OPENSSL module_LTLIBRARIES = libssl_iostream_openssl.la diff --git a/src/lib-ssl-iostream/iostream-ssl.c b/src/lib-ssl-iostream/iostream-ssl.c index 430e69de5d..48369be096 100644 --- a/src/lib-ssl-iostream/iostream-ssl.c +++ b/src/lib-ssl-iostream/iostream-ssl.c @@ -48,16 +48,8 @@ int ssl_module_load(const char **error_r) { #ifdef HAVE_SSL const char *plugin_name = "ssl_iostream_openssl"; - struct module_dir_load_settings mod_set; - - i_zero(&mod_set); - mod_set.abi_version = DOVECOT_ABI_VERSION; - mod_set.setting_name = ""; - mod_set.require_init_funcs = TRUE; - ssl_module = module_dir_load(MODULE_DIR, plugin_name, &mod_set); - if (module_dir_try_load_missing(&ssl_module, MODULE_DIR, plugin_name, - &mod_set, error_r) < 0) - return -1; + + module_dir_load_ssl_iostream(&ssl_module, plugin_name); module_dir_init(ssl_module); if (!ssl_module_loaded) { *error_r = t_strdup_printf( diff --git a/src/lib/module-dir-load-auth.c b/src/lib/module-dir-load-auth.c new file mode 100644 index 0000000000..7c1bb1ad5a --- /dev/null +++ b/src/lib/module-dir-load-auth.c @@ -0,0 +1,16 @@ +#include "module-dir.h" + +/* XXX these aren't found in any existing header, and their signature is wrong (no args instead of one) */ +void authdb_imap_init(void); +void authdb_imap_deinit(void); + +void module_dir_load_auth(struct module **modules, const char *mod_names) +{ + T_BEGIN { + const char **names = module_parse_names(mod_names); + + module_load_static(modules, names, "authdb_imap", + authdb_imap_init, + authdb_imap_deinit); + } T_END; +} diff --git a/src/lib/module-dir-load-dcrypt-backend.c b/src/lib/module-dir-load-dcrypt-backend.c new file mode 100644 index 0000000000..052225c91d --- /dev/null +++ b/src/lib/module-dir-load-dcrypt-backend.c @@ -0,0 +1,13 @@ +#include "module-dir.h" +#include "../lib-dcrypt/dcrypt-private.h" + +void module_dir_load_dcrypt_backend(struct module **modules, const char *mod_names) +{ + T_BEGIN { + const char **names = module_parse_names(mod_names); + + module_load_static(modules, names, "dcrypt_openssl", + dcrypt_openssl_init, + dcrypt_openssl_deinit); + } T_END; +} diff --git a/src/lib/module-dir-load-old-stats.c b/src/lib/module-dir-load-old-stats.c new file mode 100644 index 0000000000..a3aa9ee2e9 --- /dev/null +++ b/src/lib/module-dir-load-old-stats.c @@ -0,0 +1,21 @@ +#include "module-dir.h" + +/* XXX these aren't found in any existing header, and their signature is wrong (no args instead of one) */ +void old_stats_mail_init(void); +void old_stats_mail_deinit(void); +void stats_auth_init(void); +void stats_auth_deinit(void); + +void module_dir_load_old_stats(struct module **modules, const char *mod_names) +{ + T_BEGIN { + const char **names = module_parse_names(mod_names); + + module_load_static(modules, names, "old_stats_mail", + old_stats_mail_init, + old_stats_mail_deinit); + module_load_static(modules, names, "stats_auth", + stats_auth_init, + stats_auth_deinit); + } T_END; +} diff --git a/src/lib/module-dir-load-settings.c b/src/lib/module-dir-load-settings.c new file mode 100644 index 0000000000..16719e73e3 --- /dev/null +++ b/src/lib/module-dir-load-settings.c @@ -0,0 +1,10 @@ +#include "module-dir.h" + +void module_dir_load_settings(struct module **modules, const char *mod_names) +{ + T_BEGIN { + const char **names = module_parse_names(mod_names); + + /* none yet; expecting to import from pigeonhole */ + } T_END; +} diff --git a/src/lib/module-dir-load-ssl-iostream.c b/src/lib/module-dir-load-ssl-iostream.c new file mode 100644 index 0000000000..9d8b45f598 --- /dev/null +++ b/src/lib/module-dir-load-ssl-iostream.c @@ -0,0 +1,13 @@ +#include "module-dir.h" +#include "../lib-ssl-iostream/iostream-openssl.h" + +void module_dir_load_ssl_iostream(struct module **modules, const char *mod_names) +{ + T_BEGIN { + const char **names = module_parse_names(mod_names); + + module_load_static(modules, names, "ssl_iostream_openssl", + ssl_iostream_openssl_init, + ssl_iostream_openssl_deinit); + } T_END; +} diff --git a/src/lib/module-dir.h b/src/lib/module-dir.h index bce2447e49..98b4718f56 100644 --- a/src/lib/module-dir.h +++ b/src/lib/module-dir.h @@ -59,7 +59,12 @@ int module_dir_try_load_missing(struct module **modules, /* Load modules of a given type (called a "module directory" due to the prior dlopen based implementation). mod_names is a space separated list of module names to load, or NULL for all available. Each function goes in a separate file so that each module collection links into only the binaries that require it. */ void module_dir_load_adm(struct module **modules, const char *mod_names); +void module_dir_load_auth(struct module **modules, const char *mod_names); +void module_dir_load_dcrypt_backend(struct module **modules, const char *mod_names); void module_dir_load_mail(struct module **modules, const char *mod_names); +void module_dir_load_old_stats(struct module **modules, const char *mod_names); +void module_dir_load_settings(struct module **modules, const char *mod_names); +void module_dir_load_ssl_iostream(struct module **modules, const char *mod_names); /* Call init() in all modules */ void module_dir_init(struct module *modules); diff --git a/src/old-stats/Makefile.am b/src/old-stats/Makefile.am index 8cb9c2fa62..f82ac0cc66 100644 --- a/src/old-stats/Makefile.am +++ b/src/old-stats/Makefile.am @@ -1,10 +1,8 @@ -old_stats_moduledir = $(moduledir)/old-stats pkglibexecdir = $(libexecdir)/dovecot pkglibexec_PROGRAMS = old-stats AM_CPPFLAGS = \ - -DSTATS_MODULE_DIR=\""$(old_stats_moduledir)"\" \ -I$(top_srcdir)/src/lib \ -I$(top_srcdir)/src/lib-settings \ -I$(top_srcdir)/src/lib-master \ diff --git a/src/old-stats/main.c b/src/old-stats/main.c index 49f50f4c64..d16889510f 100644 --- a/src/old-stats/main.c +++ b/src/old-stats/main.c @@ -29,13 +29,7 @@ static void client_connected(struct master_service_connection *conn) static void main_preinit(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; - - modules = module_dir_load(STATS_MODULE_DIR, NULL, &mod_set); + module_dir_load_old_stats(&modules, NULL); module_dir_init(modules); restrict_access_by_env(RESTRICT_ACCESS_FLAG_ALLOW_ROOT, NULL);