summaryrefslogtreecommitdiff
path: root/src/gsmd/vendor.c
diff options
context:
space:
mode:
authorlaforge <laforge@99fdad57-331a-0410-800a-d7fa5415bdb3>2007-06-02 11:00:07 +0000
committerlaforge <laforge@99fdad57-331a-0410-800a-d7fa5415bdb3>2007-06-02 11:00:07 +0000
commit1c1d1d68d245ee7ac99d7a553a692c6c3983766e (patch)
treec3e7694da4bd90df2f2209d9dfea27feb766454d /src/gsmd/vendor.c
parent25d5ef89ffc6dfa3eae3af33c335aa6bfec795a4 (diff)
add machine / vendor plugin infrastructure (Philip Zabel)
git-svn-id: http://svn.openmoko.org/trunk/src/target/gsm@2123 99fdad57-331a-0410-800a-d7fa5415bdb3
Diffstat (limited to 'src/gsmd/vendor.c')
-rw-r--r--src/gsmd/vendor.c32
1 files changed, 32 insertions, 0 deletions
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 <dlfcn.h>
#include <errno.h>
+#include <stdio.h>
+#include <string.h>
+#include <limits.h>
#include <common/linux_list.h>
@@ -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;
+}
personal git repositories of Harald Welte. Your mileage may vary