From 1c1d1d68d245ee7ac99d7a553a692c6c3983766e Mon Sep 17 00:00:00 2001 From: laforge Date: Sat, 2 Jun 2007 11:00:07 +0000 Subject: add machine / vendor plugin infrastructure (Philip Zabel) git-svn-id: http://svn.openmoko.org/trunk/src/target/gsm@2123 99fdad57-331a-0410-800a-d7fa5415bdb3 --- src/gsmd/vendor.c | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) (limited to 'src/gsmd/vendor.c') diff --git a/src/gsmd/vendor.c b/src/gsmd/vendor.c index daa348a..826a7ef 100644 --- a/src/gsmd/vendor.c +++ b/src/gsmd/vendor.c @@ -20,7 +20,11 @@ * */ +#include #include +#include +#include +#include #include @@ -52,6 +56,7 @@ int gsmd_vendor_plugin_find(struct gsmd *g) llist_for_each_entry(pl, &vendorpl_list, list) { if (pl->detect(g) == 1) { + DEBUGP("selecting vendor plugin \"%s\"\n", pl->name); g->vendorpl = pl; return 1; } @@ -59,3 +64,30 @@ int gsmd_vendor_plugin_find(struct gsmd *g) return 0; } + +int gsmd_vendor_plugin_load(char *name) +{ + int rc = -1; + void *lib; + struct gsmd_vendor_plugin *pl; + char buf[PATH_MAX+1]; + + DEBUGP("loading vendor plugin \"%s\"\n", name); + + buf[PATH_MAX] = '\0'; + snprintf(buf, sizeof(buf), PLUGINDIR "/libgsmd-vendor_%s.so", name); + + lib = dlopen(buf, RTLD_LAZY); + if (!lib) { + fprintf(stderr, "gsmd_vendor_plugin_load: %s\n", dlerror()); + return -1; + } + + pl = dlsym(lib, "gsmd_vendor_plugin"); + if (pl) + rc = gsmd_vendor_plugin_register(pl); + else + dlclose(lib); + + return rc; +} -- cgit v1.2.3