changeset 20795:cdc4eabdb514

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.
author Timo Sirainen <timo.sirainen@dovecot.fi>
date Fri, 16 Sep 2016 08:35:55 +0300
parents 4f23573700c9
children cf915db82d15
files src/lib-ssl-iostream/iostream-openssl.c src/lib-ssl-iostream/iostream-openssl.h src/lib-ssl-iostream/iostream-ssl-private.h src/lib-ssl-iostream/iostream-ssl.c
diffstat 4 files changed, 30 insertions(+), 12 deletions(-) [+]
line wrap: on
line diff
--- a/src/lib-ssl-iostream/iostream-openssl.c	Sat Sep 10 11:15:00 2016 +0300
+++ b/src/lib-ssl-iostream/iostream-openssl.c	Fri Sep 16 08:35:55 2016 +0300
@@ -719,9 +719,7 @@
 	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 @@
 	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();
+}
--- a/src/lib-ssl-iostream/iostream-openssl.h	Sat Sep 10 11:15:00 2016 +0300
+++ b/src/lib-ssl-iostream/iostream-openssl.h	Fri Sep 16 08:35:55 2016 +0300
@@ -101,4 +101,7 @@
 					   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
--- a/src/lib-ssl-iostream/iostream-ssl-private.h	Sat Sep 10 11:15:00 2016 +0300
+++ b/src/lib-ssl-iostream/iostream-ssl-private.h	Fri Sep 16 08:35:55 2016 +0300
@@ -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 @@
 	const char *(*get_last_error)(struct ssl_iostream *ssl_io);
 };
 
+void iostream_ssl_module_init(const struct iostream_ssl_vfuncs *vfuncs);
+
 #endif
--- a/src/lib-ssl-iostream/iostream-ssl.c	Sat Sep 10 11:15:00 2016 +0300
+++ b/src/lib-ssl-iostream/iostream-ssl.c	Fri Sep 16 08:35:55 2016 +0300
@@ -14,12 +14,16 @@
 #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 @@
 	memset(&mod_set, 0, sizeof(mod_set));
 	mod_set.abi_version = DOVECOT_ABI_VERSION;
 	mod_set.setting_name = "<built-in lib-ssl-iostream lookup>";
+	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 @@
 	   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";