From e3fafb1cb55307f6c5f118872d72abdd03011cbd Mon Sep 17 00:00:00 2001 From: Marcel Holtmann Date: Mon, 27 Apr 2009 21:41:52 -0700 Subject: [PATCH] Add infrastructure for built-in plugins --- .gitignore | 1 + Makefile.am | 2 +- include/plugin.h | 4 +--- plugins/Makefile.am | 24 +++++++++++++++++++++++- src/Makefile.am | 5 +++-- src/plugin.c | 9 ++++++++- 6 files changed, 37 insertions(+), 8 deletions(-) diff --git a/.gitignore b/.gitignore index 6aa6a4e..2b32d74 100644 --- a/.gitignore +++ b/.gitignore @@ -33,6 +33,7 @@ src/connman.conf src/connman.service src/*-connman.rules plugins/connman.policy +plugins/builtin.h scripts/connman scripts/udhcpc-script scripts/dhclient-script diff --git a/Makefile.am b/Makefile.am index b4c0917..3166578 100644 --- a/Makefile.am +++ b/Makefile.am @@ -1,5 +1,5 @@ -SUBDIRS = gdbus include src plugins client tools scripts test doc +SUBDIRS = gdbus include plugins src client tools scripts test doc pkgconfigdir = $(libdir)/pkgconfig diff --git a/include/plugin.h b/include/plugin.h index 21ecd0e..db76ad9 100644 --- a/include/plugin.h +++ b/include/plugin.h @@ -80,9 +80,7 @@ struct connman_plugin_desc { */ #ifdef CONNMAN_PLUGIN_BUILTIN #define CONNMAN_PLUGIN_DEFINE(name, description, version, priority, init, exit) \ - extern struct connman_plugin_desc connman_builtin_ ## name \ - __attribute__ ((visibility("default"))); \ - struct connman_plugin_desc connman_builtin_ ## name = { \ + struct connman_plugin_desc __connman_builtin_ ## name = { \ #name, description, version, priority, init, exit \ }; #else diff --git a/plugins/Makefile.am b/plugins/Makefile.am index db3977f..7c9d054 100644 --- a/plugins/Makefile.am +++ b/plugins/Makefile.am @@ -3,6 +3,9 @@ plugindir = $(libdir)/connman/plugins plugin_LTLIBRARIES = +builtin_modules = +builtin_sources = + if LOOPBACK plugin_LTLIBRARIES += loopback.la endif @@ -112,6 +115,16 @@ if FAKE plugin_LTLIBRARIES += fake.la endif +noinst_LTLIBRARIES = libbuiltin.la + +libbuiltin_la_SOURCES = $(builtin_sources) +libbuiltin_la_LDFLAGS = +libbuiltin_la_CFLAGS = $(AM_CFLAGS) -DCONNMAN_PLUGIN_BUILTIN + +BUILT_SOURCES = builtin.h + +nodist_libbuiltin_la_SOURCES = $(BUILT_SOURCES) + AM_LDFLAGS = -no-undefined -module -avoid-version statedir = $(localstatedir)/run/connman @@ -126,11 +139,20 @@ AM_CFLAGS = -fvisibility=hidden @GLIB_CFLAGS@ @GDBUS_CFLAGS@ INCLUDES = -I$(top_builddir)/include -CLEANFILES = connman.policy +CLEANFILES = $(BUILT_SOURCES) connman.policy EXTRA_DIST = polkit.policy MAINTAINERCLEANFILES = Makefile.in +builtin.h: + echo "" > $@ + list='$(builtin_modules)'; for i in $$list; \ + do echo "extern struct connman_plugin_desc __connman_builtin_$$i;" > $@; done + echo "static struct connman_plugin_desc *__connman_builtin[] = {" >> $@ + list='$(builtin_modules)'; for i in $$list; \ + do echo "&__connman_builtin_$$i," >> $@; done + echo "NULL };" >> $@ + connman.policy: polkit.policy cp $< $@ diff --git a/src/Makefile.am b/src/Makefile.am index 9051c7f..9a1738c 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -23,7 +23,8 @@ rules_DATA = 92-connman.rules endif endif -connmand_LDADD = @GDBUS_LIBS@ @GLIB_LIBS@ @GTHREAD_LIBS@ @UDEV_LIBS@ -ldl +connmand_LDADD = $(top_builddir)/plugins/libbuiltin.la \ + @GDBUS_LIBS@ @GLIB_LIBS@ @GTHREAD_LIBS@ @UDEV_LIBS@ -ldl connmand_LDFLAGS = -Wl,--export-dynamic -Wl,--version-script=connman.ver @@ -46,7 +47,7 @@ AM_CFLAGS = @UDEV_CFLAGS@ @GTHREAD_CFLAGS@ @GLIB_CFLAGS@ @GDBUS_CFLAGS@ \ -DPLUGINDIR=\""$(plugindir)"\" \ -DSTORAGEDIR=\""$(storagedir)\"" -INCLUDES = -I$(top_builddir)/include +INCLUDES = -I$(top_builddir)/include -I$(top_builddir)/plugins EXTRA_DIST = connman-dbus.conf connman-polkit.conf connman.rules diff --git a/src/plugin.c b/src/plugin.c index 36e816b..23caa0a 100644 --- a/src/plugin.c +++ b/src/plugin.c @@ -74,15 +74,21 @@ static gboolean add_plugin(void *handle, struct connman_plugin_desc *desc) return TRUE; } +#include "builtin.h" + int __connman_plugin_init(const char *pattern, const char *exclude) { GSList *list; GDir *dir; const gchar *file; gchar *filename; + unsigned int i; DBG(""); + for (i = 0; __connman_builtin[i]; i++) + add_plugin(NULL, __connman_builtin[i]); + dir = g_dir_open(PLUGINDIR, 0, NULL); if (dir != NULL) { while ((file = g_dir_read_name(dir)) != NULL) { @@ -157,7 +163,8 @@ void __connman_plugin_cleanup(void) if (plugin->active == TRUE && plugin->desc->exit) plugin->desc->exit(); - dlclose(plugin->handle); + if (plugin->handle != NULL) + dlclose(plugin->handle); g_free(plugin); } -- 2.7.4