Updated plugin interface, parameters from config file can now be sent to plugins
authorAndreas Tonnesen <andreto@olsr.org>
Tue, 2 Nov 2004 19:27:14 +0000 (19:27 +0000)
committerAndreas Tonnesen <andreto@olsr.org>
Tue, 2 Nov 2004 19:27:14 +0000 (19:27 +0000)
src/cfgparser/oparse.y
src/olsr_cfg.h
src/plugin_loader.c
src/plugin_loader.h

index af25c70..34c0404 100644 (file)
@@ -21,7 +21,7 @@
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  * 
  * 
- * $Id: oparse.y,v 1.8 2004/11/01 20:13:27 kattemat Exp $
+ * $Id: oparse.y,v 1.9 2004/11/02 19:27:14 kattemat Exp $
  *
  */
 
@@ -584,6 +584,8 @@ plblock: TOK_PLUGIN TOK_STRING
     }
 
   pe->name = $2->string;
+
+  pe->params = NULL;
   
   if(PARSER_DEBUG) printf("Plugin: %s\n", $2->string);
 
@@ -597,13 +599,25 @@ plblock: TOK_PLUGIN TOK_STRING
 
 plparam: TOK_PLPARAM TOK_STRING TOK_STRING
 {
+  struct plugin_param *pp = malloc(sizeof(struct plugin_param));
+  
+  if(pp == NULL)
+    {
+      fprintf(stderr, "Out of memory(ADD PP)\n");
+      YYABORT;
+    }
+  
+  if(PARSER_DEBUG) printf("Plugin param key:\"%s\" val: \"%s\"\n", $2->string, $3->string);
+  
+  pp->key = $2->string;
+  pp->value = $3->string;
 
-    if(PARSER_DEBUG) printf("Plugin param key:\"%s\" val: \"%s\"\n", $2->string, $3->string);
+  /* Queue */
+  pp->next = cnf->plugins->params;
+  cnf->plugins->params = pp;
 
-    free($2->string);
-    free($2);
-    free($3->string);
-    free($3);
+  free($2);
+  free($3);
 }
 ;
 
index bb8a03f..c8baa7e 100644 (file)
@@ -19,7 +19,7 @@
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  * 
  * 
- * $Id: olsr_cfg.h,v 1.2 2004/11/01 20:13:27 kattemat Exp $
+ * $Id: olsr_cfg.h,v 1.3 2004/11/02 19:27:13 kattemat Exp $
  *
  */
 
@@ -121,9 +121,17 @@ struct hyst_param
   float                    thr_low;
 };
 
+struct plugin_param
+{
+  char                     *key;
+  char                     *value;
+  struct plugin_param      *next;
+};
+
 struct plugin_entry
 {
   char                     *name;
+  struct plugin_param      *params;
   struct plugin_entry      *next;
 };
 
index e72ac9e..f7ac8c6 100644 (file)
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  * 
  * 
- * $Id: plugin_loader.c,v 1.7 2004/10/20 18:21:00 kattemat Exp $
+ * $Id: plugin_loader.c,v 1.8 2004/11/02 19:27:13 kattemat Exp $
  *
  */
 
 #include "plugin_loader.h"
 #include "defs.h"
-#include "olsr.h"
-#include "scheduler.h"
-#include "parser.h"
-#include "duplicate_set.h"
 #include "plugin.h"
-#include "link_set.h"
+
+/* Local functions */
+
+static void
+init_olsr_plugin(struct olsr_plugin *);
+
+static int
+olsr_load_dl(char *, struct plugin_param *);
+
+
 
 
 /**
@@ -51,10 +56,10 @@ olsr_load_plugins()
 
   while(entry)
     {  
-      if(olsr_load_dl(entry->name) < 0)
+      if(olsr_load_dl(entry->name, entry->params) < 0)
        olsr_printf(1, "-- PLUGIN LOADING FAILED! --\n\n");
       else
-       loaded ++; /* I'm loaded! */
+       loaded ++;
 
       entry = entry->next;
     }
@@ -71,16 +76,17 @@ olsr_load_plugins()
  *@return negative on error
  */
 int
-olsr_load_dl(char *libname)
+olsr_load_dl(char *libname, struct plugin_param *params)
 {
   struct olsr_plugin new_entry, *entry;
   int *interface_version;
 
+
   olsr_printf(1, "---------- Plugin loader ----------\nLibrary: %s\n", libname);
 
   if((new_entry.dlhandle = dlopen(libname, RTLD_NOW)) == NULL)
     {
-      olsr_printf(1, "DL loading failed: %s!\n", dlerror());
+      olsr_printf(1, "DL loading failed: \"%s\"!\n", dlerror());
       return -1;
     }
 
@@ -90,7 +96,7 @@ olsr_load_dl(char *libname)
   /* Register mp function */
   if((interface_version = dlsym(new_entry.dlhandle, "plugin_interface_version")) == NULL)
     {
-      olsr_printf(1, "\nPlug-in interface version location failed!\n%s\n", dlerror());
+      olsr_printf(1, "FAILED: \"%s\"\n", dlerror());
       dlclose(new_entry.dlhandle);
       return -1;
     }
@@ -98,42 +104,44 @@ olsr_load_dl(char *libname)
     {
       olsr_printf(1, " %d - ", *interface_version);
       if(*interface_version != PLUGIN_INTERFACE_VERSION)
-       {
-         olsr_printf(1, "VERSION MISSMATCH!\n");
-         dlclose(new_entry.dlhandle);
-         return -1;
-       }
+       olsr_printf(1, "WARNING: VERSION MISSMATCH!\n");
       else
        olsr_printf(1, "OK\n");
     }
 
-
-  /* Fetch the multipurpose function */
-  olsr_printf(1, "Trying to fetch plugin IO function....");
-  /* Register mp function */
-  if((new_entry.plugin_io = dlsym(new_entry.dlhandle, "plugin_io")) == NULL)
+  olsr_printf(1, "Trying to fetch register function....");
+  
+  if((new_entry.register_olsr_data = dlsym(new_entry.dlhandle, "register_olsr_data")) == NULL)
     {
-      olsr_printf(1, "\nPlug-in IO function location %s failed!\n%s\n", libname, dlerror());
+      /* This function must be present */
+      olsr_printf(1, "\nCould not find function registration function in plugin!\n%s\nCRITICAL ERROR - aborting!\n", dlerror());
       dlclose(new_entry.dlhandle);
       return -1;
     }
   olsr_printf(1, "OK\n");
 
 
-  olsr_printf(1, "Trying to fetch register function....");
+  /* Fetch the multipurpose function */
+  olsr_printf(1, "Trying to fetch plugin IO function....");
+  if((new_entry.plugin_io = dlsym(new_entry.dlhandle, "plugin_io")) == NULL)
+    olsr_printf(1, "FAILED: \"%s\"\n", dlerror());
+  else
+    olsr_printf(1, "OK\n");
+
+  /* Fetch the parameter function */
+  olsr_printf(1, "Trying to fetch param function....");
+  if((new_entry.register_param = dlsym(new_entry.dlhandle, "register_olsr_param")) == NULL)
+    olsr_printf(1, "FAILED: \"%s\"\n", dlerror());
+  else
+    olsr_printf(1, "OK\n");
 
-  if((new_entry.register_olsr_data = dlsym(new_entry.dlhandle, "register_olsr_data")) == NULL)
-    {
-      olsr_printf(1, "\nCould not find function registration function in plugin!\n", dlerror());
-      dlclose(new_entry.dlhandle);
-      return -1;
-    }
-  olsr_printf(1, "OK\n");
 
   entry = olsr_malloc(sizeof(struct olsr_plugin), "Plugin entry");
 
   memcpy(entry, &new_entry, sizeof(struct olsr_plugin));
 
+  entry->params = params;
+
   /* Initialize the plugin */
   init_olsr_plugin(entry);
 
@@ -162,6 +170,18 @@ void
 init_olsr_plugin(struct olsr_plugin *entry)
 {
   struct olsr_plugin_data plugin_data;
+  struct plugin_param *params = entry->params;
+
+  if(entry->register_param)
+    {
+      olsr_printf(1, "Sending parameters...\n");
+      while(params)
+       {
+         printf("\tKey:\"%s\" value:\"%s\"\n", params->key, params->value);
+         entry->register_param(params->key, params->value);
+         params = params->next;
+       }
+    }
 
   olsr_printf(1, "Running registration function...\n");
   /* Fill struct */
index b927c84..f4ffde1 100644 (file)
@@ -19,7 +19,7 @@
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  * 
  * 
- * $Id: plugin_loader.h,v 1.7 2004/10/20 18:21:00 kattemat Exp $
+ * $Id: plugin_loader.h,v 1.8 2004/11/02 19:27:13 kattemat Exp $
  *
  */
 
 #include <dlfcn.h>
 #include <stdio.h>
 #include "olsr_protocol.h"
+#include "olsr_cfg.h"
 
 #define MAX_LIBS 10
 
-#define PLUGIN_INTERFACE_VERSION 1
+#define PLUGIN_INTERFACE_VERSION 2
 
 /* Data to sent to the plugin with the register_olsr_function call */
 struct olsr_plugin_data
@@ -48,6 +49,10 @@ struct olsr_plugin
   /* The handle */
   void *dlhandle;
 
+  /* Params */
+  struct plugin_param *params;
+
+  int (*register_param)(char *, char *);
   int (*register_olsr_data)(struct olsr_plugin_data *);
 
   /* Multi - purpose function */
@@ -62,12 +67,6 @@ struct olsr_plugin *olsr_plugins;
 int
 olsr_load_plugins(void);
 
-void
-init_olsr_plugin(struct olsr_plugin *);
-
-int
-olsr_load_dl(char *);
-
 void
 olsr_close_plugins(void);