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.2.26~206 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=a8fce6af6ad65be8f72c4759879927e8dc79e263;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 e6ef03bb5c..aa100e8698 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, @@ -747,3 +745,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 bbadca0627..f08fdb4d5a 100644 --- a/src/lib-ssl-iostream/iostream-openssl.h +++ b/src/lib-ssl-iostream/iostream-openssl.h @@ -101,4 +101,7 @@ int openssl_iostream_context_import_params(struct ssl_iostream_context *ctx, const buffer_t *input); void openssl_iostream_context_free_params(struct ssl_iostream_context *ctx); +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 d20d606ddc..e5531c8e92 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); @@ -42,4 +41,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 a0659ab2c4..6c3d30bb7c 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";