mirror of git://git.sysmocom.de/ofono
Add support for builtin plugins
This commit is contained in:
parent
64c4276473
commit
f2e2cd7787
|
@ -26,3 +26,4 @@ include/version.h
|
||||||
src/ofonod
|
src/ofonod
|
||||||
src/ofono.exp
|
src/ofono.exp
|
||||||
src/ofono.ver
|
src/ofono.ver
|
||||||
|
plugins/builtin.h
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
|
|
||||||
SUBDIRS = gdbus gatchat include src plugins doc
|
SUBDIRS = gdbus gatchat include plugins src doc
|
||||||
|
|
||||||
DISTCHECK_CONFIGURE_FLAGS = --disable-datafiles
|
DISTCHECK_CONFIGURE_FLAGS = --disable-datafiles
|
||||||
|
|
||||||
|
|
|
@ -62,12 +62,18 @@ struct ofono_plugin_desc {
|
||||||
*
|
*
|
||||||
* Macro for defining a plugin descriptor
|
* Macro for defining a plugin descriptor
|
||||||
*/
|
*/
|
||||||
|
#ifdef OFONO_PLUGIN_BUILTIN
|
||||||
|
struct ofono_plugin_desc __ofono_builtin_ ## name = { \
|
||||||
|
#name, description, version, priority, init, exit \
|
||||||
|
};
|
||||||
|
#else
|
||||||
#define OFONO_PLUGIN_DEFINE(name, description, version, priority, init, exit) \
|
#define OFONO_PLUGIN_DEFINE(name, description, version, priority, init, exit) \
|
||||||
extern struct ofono_plugin_desc ofono_plugin_desc \
|
extern struct ofono_plugin_desc ofono_plugin_desc \
|
||||||
__attribute__ ((visibility("default"))); \
|
__attribute__ ((visibility("default"))); \
|
||||||
struct ofono_plugin_desc ofono_plugin_desc = { \
|
struct ofono_plugin_desc ofono_plugin_desc = { \
|
||||||
#name, description, version, priority, init, exit \
|
#name, description, version, priority, init, exit \
|
||||||
};
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,2 +1,28 @@
|
||||||
|
|
||||||
|
builtin_modules =
|
||||||
|
builtin_sources =
|
||||||
|
builtin_cflags =
|
||||||
|
|
||||||
|
noinst_LTLIBRARIES = libbuiltin.la
|
||||||
|
|
||||||
|
libbuiltin_la_SOURCES = $(builtin_sources)
|
||||||
|
libbuiltin_la_LDFLAGS =
|
||||||
|
libbuiltin_la_CFLAGS = $(AM_CFLAGS) $(builtin_cflags) -DOFONO_PLUGIN_BUILTIN
|
||||||
|
|
||||||
|
BUILT_SOURCES = builtin.h
|
||||||
|
|
||||||
|
nodist_libbuiltin_la_SOURCES = $(BUILT_SOURCES)
|
||||||
|
|
||||||
|
CLEANFILES = $(BUILT_SOURCES)
|
||||||
|
|
||||||
MAINTAINERCLEANFILES = Makefile.in
|
MAINTAINERCLEANFILES = Makefile.in
|
||||||
|
|
||||||
|
builtin.h:
|
||||||
|
echo "" > $@
|
||||||
|
list='$(builtin_modules)'; for i in $$list; \
|
||||||
|
do echo "extern struct ofono_plugin_desc __ofono_builtin_$$i;" >> $@; done
|
||||||
|
echo "" >> $@
|
||||||
|
echo "static struct ofono_plugin_desc *__ofono_builtin[] = {" >> $@
|
||||||
|
list='$(builtin_modules)'; for i in $$list; \
|
||||||
|
do echo "&__ofono_builtin_$$i," >> $@; done
|
||||||
|
echo "NULL };" >> $@
|
||||||
|
|
|
@ -13,7 +13,8 @@ ofonod_SOURCES = main.c ofono.h log.c plugin.c \
|
||||||
network.c voicecall.c ussd.h ussd.c \
|
network.c voicecall.c ussd.h ussd.c \
|
||||||
call-settings.c call-waiting.c call-forwarding.c call-meter.c
|
call-settings.c call-waiting.c call-forwarding.c call-meter.c
|
||||||
|
|
||||||
ofonod_LDADD = @GDBUS_LIBS@ @GLIB_LIBS@ @GTHREAD_LIBS@ -ldl
|
ofonod_LDADD = $(top_builddir)/plugins/libbuiltin.la \
|
||||||
|
@GDBUS_LIBS@ @GLIB_LIBS@ @GTHREAD_LIBS@ -ldl
|
||||||
|
|
||||||
ofonod_LDFLAGS = -Wl,--export-dynamic -Wl,--version-script=ofono.ver
|
ofonod_LDFLAGS = -Wl,--export-dynamic -Wl,--version-script=ofono.ver
|
||||||
|
|
||||||
|
@ -30,7 +31,7 @@ endif
|
||||||
AM_CFLAGS = @GTHREAD_CFLAGS@ @GLIB_CFLAGS@ @GDBUS_CFLAGS@ \
|
AM_CFLAGS = @GTHREAD_CFLAGS@ @GLIB_CFLAGS@ @GDBUS_CFLAGS@ \
|
||||||
-DPLUGINDIR=\""$(plugindir)"\"
|
-DPLUGINDIR=\""$(plugindir)"\"
|
||||||
|
|
||||||
INCLUDES = -I$(top_builddir)/include
|
INCLUDES = -I$(top_builddir)/include -I$(top_builddir)
|
||||||
|
|
||||||
EXTRA_DIST = ofono.conf
|
EXTRA_DIST = ofono.conf
|
||||||
|
|
||||||
|
|
52
src/plugin.c
52
src/plugin.c
|
@ -53,7 +53,7 @@ static gboolean add_plugin(void *handle, struct ofono_plugin_desc *desc)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
if (g_str_equal(desc->version, OFONO_VERSION) == FALSE) {
|
if (g_str_equal(desc->version, OFONO_VERSION) == FALSE) {
|
||||||
DBG("version mismatch for %s", desc->description);
|
ofono_error("Version mismatch for %s", desc->description);
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -70,15 +70,44 @@ static gboolean add_plugin(void *handle, struct ofono_plugin_desc *desc)
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static gboolean check_plugin(struct ofono_plugin_desc *desc,
|
||||||
|
const char *pattern, const char *exclude)
|
||||||
|
{
|
||||||
|
if (exclude != NULL &&
|
||||||
|
g_pattern_match_simple(exclude, desc->name) == TRUE) {
|
||||||
|
ofono_info("Excluding %s", desc->description);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pattern != NULL &&
|
||||||
|
g_pattern_match_simple(pattern, desc->name) == FALSE) {
|
||||||
|
ofono_info("Ignoring %s", desc->description);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
#include "plugins/builtin.h"
|
||||||
|
|
||||||
int __ofono_plugin_init(const char *pattern, const char *exclude)
|
int __ofono_plugin_init(const char *pattern, const char *exclude)
|
||||||
{
|
{
|
||||||
GSList *list;
|
GSList *list;
|
||||||
GDir *dir;
|
GDir *dir;
|
||||||
const gchar *file;
|
const gchar *file;
|
||||||
gchar *filename;
|
gchar *filename;
|
||||||
|
unsigned int i;
|
||||||
|
|
||||||
DBG("");
|
DBG("");
|
||||||
|
|
||||||
|
for (i = 0; __ofono_builtin[i]; i++) {
|
||||||
|
if (check_plugin(__ofono_builtin[i],
|
||||||
|
pattern, exclude) == FALSE)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
add_plugin(NULL, __ofono_builtin[i]);
|
||||||
|
}
|
||||||
|
|
||||||
dir = g_dir_open(PLUGINDIR, 0, NULL);
|
dir = g_dir_open(PLUGINDIR, 0, NULL);
|
||||||
if (dir != NULL) {
|
if (dir != NULL) {
|
||||||
while ((file = g_dir_read_name(dir)) != NULL) {
|
while ((file = g_dir_read_name(dir)) != NULL) {
|
||||||
|
@ -93,8 +122,8 @@ int __ofono_plugin_init(const char *pattern, const char *exclude)
|
||||||
|
|
||||||
handle = dlopen(filename, RTLD_NOW);
|
handle = dlopen(filename, RTLD_NOW);
|
||||||
if (handle == NULL) {
|
if (handle == NULL) {
|
||||||
g_warning("Can't load %s: %s", filename,
|
ofono_error("Can't load %s: %s",
|
||||||
dlerror());
|
filename, dlerror());
|
||||||
g_free(filename);
|
g_free(filename);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
@ -103,21 +132,13 @@ int __ofono_plugin_init(const char *pattern, const char *exclude)
|
||||||
|
|
||||||
desc = dlsym(handle, "ofono_plugin_desc");
|
desc = dlsym(handle, "ofono_plugin_desc");
|
||||||
if (desc == NULL) {
|
if (desc == NULL) {
|
||||||
g_warning("Can't load symbol: %s", dlerror());
|
ofono_error("Can't load symbol: %s",
|
||||||
|
dlerror());
|
||||||
dlclose(handle);
|
dlclose(handle);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (exclude != NULL && g_pattern_match_simple(exclude,
|
if (check_plugin(desc, pattern, exclude) == FALSE) {
|
||||||
desc->name) == TRUE) {
|
|
||||||
DBG("excluding %s", desc->description);
|
|
||||||
dlclose(handle);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (pattern != NULL && g_pattern_match_simple(pattern,
|
|
||||||
desc->name) == FALSE) {
|
|
||||||
DBG("ignoring %s", desc->description);
|
|
||||||
dlclose(handle);
|
dlclose(handle);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
@ -153,7 +174,8 @@ void __ofono_plugin_cleanup(void)
|
||||||
if (plugin->active == TRUE && plugin->desc->exit)
|
if (plugin->active == TRUE && plugin->desc->exit)
|
||||||
plugin->desc->exit();
|
plugin->desc->exit();
|
||||||
|
|
||||||
dlclose(plugin->handle);
|
if (plugin->handle)
|
||||||
|
dlclose(plugin->handle);
|
||||||
|
|
||||||
g_free(plugin);
|
g_free(plugin);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue