Add infrastructure for built-in plugins
authorMarcel Holtmann <marcel@holtmann.org>
Tue, 28 Apr 2009 04:41:52 +0000 (21:41 -0700)
committerMarcel Holtmann <marcel@holtmann.org>
Tue, 28 Apr 2009 04:41:52 +0000 (21:41 -0700)
.gitignore
Makefile.am
include/plugin.h
plugins/Makefile.am
src/Makefile.am
src/plugin.c

index 6aa6a4e..2b32d74 100644 (file)
@@ -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
index b4c0917..3166578 100644 (file)
@@ -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
 
index 21ecd0e..db76ad9 100644 (file)
@@ -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
index db3977f..7c9d054 100644 (file)
@@ -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 $< $@
index 9051c7f..9a1738c 100644 (file)
@@ -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
 
index 36e816b..23caa0a 100644 (file)
@@ -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);
        }