Load plugins.
authorJiří Filipovič <fila@ics.muni.cz>
Wed, 21 May 2008 11:21:15 +0000 (11:21 +0000)
committerJiří Filipovič <fila@ics.muni.cz>
Wed, 21 May 2008 11:21:15 +0000 (11:21 +0000)
org.glite.jp.index/src/bones_server.c
org.glite.jp.index/src/type_plugin.c [new file with mode: 0644]

index 8cbc2c8..368388d 100644 (file)
@@ -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 (file)
index 0000000..5cc806c
--- /dev/null
@@ -0,0 +1,56 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <dlfcn.h>
+#include <errno.h>
+
+#include <glite/jp/types.h>
+#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;
+}
+