From: Timo Sirainen Date: Fri, 16 Sep 2016 05:35:55 +0000 (+0300) Subject: lib-ssl-iostream: Use more standard _init() & _deinit() to initialize SSL plugin X-Git-Tag: 2.3.0.rc1~3014 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=fe4058e6f01bf0e104c44815b6df7cfefb80634c;p=thirdparty%2Fdovecot%2Fcore.git lib-ssl-iostream: Use more standard _init() & _deinit() to initialize SSL plugin This is mainly to make it easier for test programs to link to the plugin directly. --- diff --git a/src/lib-ssl-iostream/iostream-openssl.c b/src/lib-ssl-iostream/iostream-openssl.c index 61dd34117d..89dc15079c 100644 --- a/src/lib-ssl-iostream/iostream-openssl.c +++ b/src/lib-ssl-iostream/iostream-openssl.c @@ -719,9 +719,7 @@ openssl_iostream_get_last_error(struct ssl_iostream *ssl_io) return ssl_io->last_error; } -const struct iostream_ssl_vfuncs ssl_vfuncs = { - openssl_iostream_global_deinit, - +static const struct iostream_ssl_vfuncs ssl_vfuncs = { openssl_iostream_context_init_client, openssl_iostream_context_init_server, openssl_iostream_context_deinit, @@ -744,3 +742,13 @@ const struct iostream_ssl_vfuncs ssl_vfuncs = { openssl_iostream_get_security_string, openssl_iostream_get_last_error }; + +void iostream_openssl_init(void) +{ + iostream_ssl_module_init(&ssl_vfuncs); +} + +void iostream_openssl_deinit(void) +{ + openssl_iostream_global_deinit(); +} diff --git a/src/lib-ssl-iostream/iostream-openssl.h b/src/lib-ssl-iostream/iostream-openssl.h index 78c4548a4e..586f49754a 100644 --- a/src/lib-ssl-iostream/iostream-openssl.h +++ b/src/lib-ssl-iostream/iostream-openssl.h @@ -95,4 +95,7 @@ const char * openssl_iostream_use_certificate_error(const char *cert, const char *set_name); void openssl_iostream_clear_errors(void); +void iostream_openssl_init(void); +void iostream_openssl_deinit(void); + #endif diff --git a/src/lib-ssl-iostream/iostream-ssl-private.h b/src/lib-ssl-iostream/iostream-ssl-private.h index 9be2bbd1e9..7a997175a0 100644 --- a/src/lib-ssl-iostream/iostream-ssl-private.h +++ b/src/lib-ssl-iostream/iostream-ssl-private.h @@ -4,7 +4,6 @@ #include "iostream-ssl.h" struct iostream_ssl_vfuncs { - void (*global_deinit)(void); int (*context_init_client)(const struct ssl_iostream_settings *set, struct ssl_iostream_context **ctx_r, const char **error_r); @@ -37,4 +36,6 @@ struct iostream_ssl_vfuncs { const char *(*get_last_error)(struct ssl_iostream *ssl_io); }; +void iostream_ssl_module_init(const struct iostream_ssl_vfuncs *vfuncs); + #endif diff --git a/src/lib-ssl-iostream/iostream-ssl.c b/src/lib-ssl-iostream/iostream-ssl.c index 77349b6c58..a02558b8e2 100644 --- a/src/lib-ssl-iostream/iostream-ssl.c +++ b/src/lib-ssl-iostream/iostream-ssl.c @@ -14,12 +14,16 @@ static const struct iostream_ssl_vfuncs *ssl_vfuncs = NULL; #ifdef HAVE_SSL static void ssl_module_unload(void) { - module_dir_deinit(ssl_module); - ssl_vfuncs->global_deinit(); module_dir_unload(&ssl_module); } #endif +void iostream_ssl_module_init(const struct iostream_ssl_vfuncs *vfuncs) +{ + ssl_vfuncs = vfuncs; + ssl_module_loaded = TRUE; +} + static int ssl_module_load(const char **error_r) { #ifdef HAVE_SSL @@ -29,12 +33,15 @@ static int ssl_module_load(const char **error_r) memset(&mod_set, 0, sizeof(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); - - ssl_vfuncs = module_get_symbol(ssl_module, "ssl_vfuncs"); - if (ssl_vfuncs == NULL) { - *error_r = t_strdup_printf("%s: Broken plugin: " - "ssl_vfuncs symbol not found", plugin_name); + if (module_dir_try_load_missing(&ssl_module, MODULE_DIR, plugin_name, + &mod_set, error_r) < 0) + return -1; + if (!ssl_module_loaded) { + *error_r = t_strdup_printf( + "%s didn't call iostream_ssl_module_init() - SSL not initialized", + plugin_name); module_dir_unload(&ssl_module); return -1; } @@ -43,7 +50,6 @@ static int ssl_module_load(const char **error_r) backends may still want to access SSL module in their own atexit-callbacks. */ lib_atexit_priority(ssl_module_unload, LIB_ATEXIT_PRIORITY_LOW); - ssl_module_loaded = TRUE; return 0; #else *error_r = "SSL support not compiled in";