From a8f986749e6ae18eadc1a681fc9d9b534200e559 Mon Sep 17 00:00:00 2001 From: Marcel Holtmann Date: Tue, 14 Oct 2008 17:39:39 +0200 Subject: [PATCH] Use dynamic linking loader directly --- configure.ac | 8 +++----- src/Makefile.am | 4 ++-- src/plugin.c | 57 +++++++++++++++++++++------------------------------------ 3 files changed, 26 insertions(+), 43 deletions(-) diff --git a/configure.ac b/configure.ac index 1d438b1..1107896 100644 --- a/configure.ac +++ b/configure.ac @@ -48,6 +48,9 @@ AC_ARG_ENABLE(pie, AC_HELP_STRING([--enable-pie], AC_PATH_PROG(DHCLIENT, [dhclient], ,$PATH:/sbin:/usr/sbin) AC_PATH_PROG(WPASUPPLICANT, [wpa_supplicant], ,$PATH:/sbin:/usr/sbin) +AC_CHECK_LIB(dl, dlopen, dummy=yes, + AC_MSG_ERROR(dynamic linking loader is required)) + PKG_CHECK_MODULES(GLIB, glib-2.0, dummy=yes, AC_MSG_ERROR(glib is required)) AC_SUBST(GLIB_CFLAGS) @@ -58,11 +61,6 @@ PKG_CHECK_MODULES(GTHREAD, gthread-2.0, dummy=yes, AC_SUBST(GTHREAD_CFLAGS) AC_SUBST(GTHREAD_LIBS) -PKG_CHECK_MODULES(GMODULE, gmodule-2.0, dummy=yes, - AC_MSG_ERROR(gmodule is required)) -AC_SUBST(GMODULE_CFLAGS) -AC_SUBST(GMODULE_LIBS) - PKG_CHECK_MODULES(DBUS, dbus-1 >= 1.0, dummy=yes, AC_MSG_ERROR(libdbus is required)) AC_SUBST(DBUS_CFLAGS) diff --git a/src/Makefile.am b/src/Makefile.am index 9c12a8b..e577256 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -14,7 +14,7 @@ sbin_PROGRAMS = connmand connmand_SOURCES = main.c connman.h log.c error.c plugin.c profile.c \ element.c security.c storage.c manager.c agent.c rtnl.c -connmand_LDADD = @GDBUS_LIBS@ @GLIB_LIBS@ @GMODULE_LIBS@ @GTHREAD_LIBS@ +connmand_LDADD = @GDBUS_LIBS@ @GLIB_LIBS@ @GTHREAD_LIBS@ -ldl connmand_LDFLAGS = -Wl,--version-script=connman.ver @@ -32,7 +32,7 @@ else plugindir = $(libdir)/connman/plugins endif -AM_CFLAGS = @GTHREAD_CFLAGS@ @GMODULE_CFLAGS@ @GLIB_CFLAGS@ @GDBUS_CFLAGS@ \ +AM_CFLAGS = @GTHREAD_CFLAGS@ @GLIB_CFLAGS@ @GDBUS_CFLAGS@ \ -DSTATEDIR=\""$(statedir)"\" \ -DSTORAGEDIR=\""$(storagedir)\"" \ -DPLUGINDIR=\""$(plugindir)"\" diff --git a/src/plugin.c b/src/plugin.c index 12ed917..7cbd72b 100644 --- a/src/plugin.c +++ b/src/plugin.c @@ -23,21 +23,20 @@ #include #endif -#include +#include #include -#include #include "connman.h" static GSList *plugins = NULL; struct connman_plugin { - GModule *module; + void *handle; struct connman_plugin_desc *desc; }; -static gboolean add_plugin(GModule *module, struct connman_plugin_desc *desc) +static gboolean add_plugin(void *handle, struct connman_plugin_desc *desc) { struct connman_plugin *plugin; @@ -45,7 +44,7 @@ static gboolean add_plugin(GModule *module, struct connman_plugin_desc *desc) if (plugin == NULL) return FALSE; - plugin->module = module; + plugin->handle = handle; plugin->desc = desc; plugins = g_slist_append(plugins, plugin); @@ -55,65 +54,53 @@ static gboolean add_plugin(GModule *module, struct connman_plugin_desc *desc) return TRUE; } -static void load_plugins(const gchar *path) +int __connman_plugin_init(void) { GDir *dir; const gchar *file; gchar *filename; - dir = g_dir_open(path, 0, NULL); + DBG(""); + + dir = g_dir_open(PLUGINDIR, 0, NULL); if (dir != NULL) { while ((file = g_dir_read_name(dir)) != NULL) { - GModule *module; + void *handle; struct connman_plugin_desc *desc; if (g_str_has_prefix(file, "lib") == TRUE || g_str_has_suffix(file, ".so") == FALSE) continue; - filename = g_build_filename(path, file, NULL); + filename = g_build_filename(PLUGINDIR, file, NULL); - module = g_module_open(filename, 0); - if (module == NULL) { + handle = dlopen(filename, RTLD_LAZY); + if (handle == NULL) { g_warning("Can't load %s: %s", filename, - g_module_error()); + dlerror()); continue; } g_free(filename); - DBG("%s", g_module_name(module)); - - if (g_module_symbol(module, "connman_plugin_desc", - (gpointer) &desc) == FALSE) { + desc = dlsym(handle, "connman_plugin_desc"); + if (desc == NULL) { g_warning("Can't load symbol"); - g_module_close(module); + dlclose(handle); continue; } - if (desc == NULL || desc->init == NULL) { - g_module_close(module); + if (desc->init == NULL) { + dlclose(handle); continue; } - if (add_plugin(module, desc) == FALSE) - g_module_close(module); + if (add_plugin(handle, desc) == FALSE) + dlclose(handle); } g_dir_close(dir); } -} - -int __connman_plugin_init(void) -{ - DBG(""); - - if (g_module_supported() == FALSE) { - g_warning("Modules not supported: %s", g_module_error()); - return FALSE; - } - - load_plugins(PLUGINDIR); return 0; } @@ -127,12 +114,10 @@ void __connman_plugin_cleanup(void) for (list = plugins; list; list = list->next) { struct connman_plugin *plugin = list->data; - DBG("%s", g_module_name(plugin->module)); - if (plugin->desc->exit) plugin->desc->exit(); - g_module_close(plugin->module); + dlclose(plugin->handle); g_free(plugin); } -- 2.7.4