diff options
author | laforge <laforge@99fdad57-331a-0410-800a-d7fa5415bdb3> | 2007-06-02 11:00:07 +0000 |
---|---|---|
committer | laforge <laforge@99fdad57-331a-0410-800a-d7fa5415bdb3> | 2007-06-02 11:00:07 +0000 |
commit | 1c1d1d68d245ee7ac99d7a553a692c6c3983766e (patch) | |
tree | c3e7694da4bd90df2f2209d9dfea27feb766454d /src/gsmd/vendor.c | |
parent | 25d5ef89ffc6dfa3eae3af33c335aa6bfec795a4 (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.c | 32 |
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; +} |