From 4013805a5c06d0c586bfc4dbc83c0d2287ed1cff Mon Sep 17 00:00:00 2001 From: =?utf8?q?Ji=C5=99=C3=AD=20Filipovi=C4=8D?= Date: Wed, 21 May 2008 11:21:15 +0000 Subject: [PATCH] Load plugins. --- org.glite.jp.index/src/bones_server.c | 5 ++-- org.glite.jp.index/src/type_plugin.c | 56 +++++++++++++++++++++++++++++++++++ 2 files changed, 58 insertions(+), 3 deletions(-) create mode 100644 org.glite.jp.index/src/type_plugin.c 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; +} + -- 1.8.2.3