From: Jiří Filipovič Date: Wed, 21 May 2008 11:21:15 +0000 (+0000) Subject: Load plugins. X-Git-Tag: glite-yaim-lb_R_4_0_2_1~33 X-Git-Url: http://scientific.zcu.cz/git/?a=commitdiff_plain;h=4013805a5c06d0c586bfc4dbc83c0d2287ed1cff;p=jra1mw.git Load plugins. --- diff --git a/org.glite.jp.index/src/bones_server.c b/org.glite.jp.index/src/bones_server.c index 8cbc2c8..368388d 100644 --- a/org.glite.jp.index/src/bones_server.c +++ b/org.glite.jp.index/src/bones_server.c @@ -76,6 +76,7 @@ int main(int argc, char *argv[]) glite_jpis_context_t isctx; int retval = 0; char *err; + int i; glite_jp_init_context(&ctx); @@ -97,11 +98,9 @@ int main(int argc, char *argv[]) /* daemonize */ if (!conf->debug) glite_srvbones_daemonize("glite-jp-indexd", conf->pidfile, conf->logfile); - /* XXX preliminary support for plugins + /* load plugins */ for (i=0; conf->plugins[i]; i++) glite_jp_typeplugin_load(ctx,conf->plugins[i]); - */ - if (conf->delete_db) { if (glite_jpis_dropDatabase(isctx) != 0) { diff --git a/org.glite.jp.index/src/type_plugin.c b/org.glite.jp.index/src/type_plugin.c new file mode 100644 index 0000000..5cc806c --- /dev/null +++ b/org.glite.jp.index/src/type_plugin.c @@ -0,0 +1,56 @@ +#include +#include +#include +#include +#include + +#include +#include "glite/jp/type_plugin.h" + +int glite_jp_typeplugin_load(glite_jp_context_t ctx,const char *so){ +/* XXX: not stored but we never dlclose() yet */ + void *dl_handle = dlopen(so,RTLD_NOW); + + glite_jp_error_t err; + const char *e; + glite_jp_tplug_data_t *data; + int i; + + glite_jp_tplug_init_t init; + memset(&err,0,sizeof err); + + if (!dl_handle) { + err.source = "dlopen()"; + err.code = EINVAL; + err.desc = dlerror(); + return glite_jp_stack_error(ctx,&err); + } + + dlerror(); + init = dlsym(dl_handle,"init"); + e = dlerror(); + if (e) { + char buf[300]; + snprintf(buf,sizeof buf,"dlsym(\"%s\",\"init\")",so); + buf[299] = 0; + err.source = buf; + err.code = ENOENT; + err.desc = e; + return glite_jp_stack_error(ctx,&err); + } + + data = calloc(1,sizeof *data); + + if (init(ctx, NULL, data)) return -1; + + i = 0; + if (ctx->plugins) for (i=0; ctx->plugins[i]; i++); + ctx->plugins = realloc(ctx->plugins, (i+2) * sizeof *ctx->plugins); + ctx->plugins[i] = data; + ctx->plugins[i+1] = NULL; + + /* TODO: check consistency of uri+class pairs wrt. previous plugins */ + + return 0; +} +