From 50335272cb68ecd0bb778bbac00c2438db5adf07 Mon Sep 17 00:00:00 2001 From: =?utf8?q?J=C3=A9r=C3=A9mie=20Galarneau?= Date: Thu, 23 Jul 2015 16:31:33 -0400 Subject: [PATCH] Resolve plugin symbols MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Signed-off-by: Jérémie Galarneau --- plugins/plugin.c | 45 ++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 42 insertions(+), 3 deletions(-) diff --git a/plugins/plugin.c b/plugins/plugin.c index e339c394..35056777 100644 --- a/plugins/plugin.c +++ b/plugins/plugin.c @@ -30,6 +30,12 @@ #include #include +#define PLUGIN_SYMBOL_NAME "__bt_plugin_name" +#define PLUGIN_SYMBOL_AUTHOR "__bt_plugin_author" +#define PLUGIN_SYMBOL_LICENSE "__bt_plugin_license" +#define PLUGIN_SYMBOL_INIT "__bt_plugin_init" +#define PLUGIN_SYMBOL_EXIT "__bt_plugin_exit" + static void bt_plugin_destroy(struct bt_ref *ref) { @@ -50,16 +56,49 @@ void bt_plugin_destroy(struct bt_ref *ref) BT_HIDDEN struct bt_plugin *bt_plugin_create(GModule *module) { - struct bt_plugin *plugin; + struct bt_plugin *plugin = NULL; + + if (!module) { + goto error; + } plugin = g_new0(struct bt_plugin, 1); if (!plugin) { - goto end; + goto error; } bt_ref_init(&plugin->ref, bt_plugin_destroy); -end: + if (!g_module_symbol(module, PLUGIN_SYMBOL_NAME, + (gpointer *) &plugin->name)) + { + printf_error("Unable to resolve plugin symbol %s from %s", + PLUGIN_SYMBOL_NAME, g_module_name(module)); + goto error; + } + if (!g_module_symbol(module, PLUGIN_SYMBOL_LICENSE, + (gpointer *) &plugin->license)) + { + printf_error("Unable to resolve plugin symbol %s from %s", + PLUGIN_SYMBOL_LICENSE, g_module_name(module)); + goto error; + } + if (!g_module_symbol(module, PLUGIN_SYMBOL_INIT, + (gpointer *) &plugin->init)) + { + printf_error("Unable to resolve plugin symbol %s from %s", + PLUGIN_SYMBOL_INIT, g_module_name(module)); + goto error; + } + + /* Optional symbols */ + g_module_symbol(module, PLUGIN_SYMBOL_EXIT, (gpointer *) &plugin->exit); + g_module_symbol(module, PLUGIN_SYMBOL_AUTHOR, + (gpointer *) &plugin->author); + return plugin; +error: + bt_plugin_put(plugin); + return NULL; } BT_HIDDEN -- 2.34.1