- added mini plugin as an example and for testing the new plugin interface
authorBruno Randolf <br1@einfach.org>
Thu, 26 May 2005 16:09:26 +0000 (16:09 +0000)
committerBruno Randolf <br1@einfach.org>
Thu, 26 May 2005 16:09:26 +0000 (16:09 +0000)
- changed plugin_loader to load plugins with old and new interface

lib/Makefile
lib/mini/Makefile [new file with mode: 0644]
lib/mini/README [new file with mode: 0644]
lib/mini/olsrd_mini.so.0.1 [new file with mode: 0755]
lib/mini/src/olsrd_plugin.c [new file with mode: 0644]
lib/mini/src/olsrd_plugin.d [new file with mode: 0644]
lib/mini/src/olsrd_plugin.h [new file with mode: 0644]
lib/mini/src/olsrd_plugin.o [new file with mode: 0644]
lib/mini/version-script.txt [new file with mode: 0644]
src/plugin_loader.c
src/plugin_loader.h

index 5f975de..92e40ac 100644 (file)
@@ -1,4 +1,4 @@
-SUBDIRS = dot_draw dyn_gw httpinfo nameservice powerinfo secure tas
+SUBDIRS = dot_draw dyn_gw httpinfo mini nameservice powerinfo secure tas
 
 .PHONY: $(SUBDIRS)
 
diff --git a/lib/mini/Makefile b/lib/mini/Makefile
new file mode 100644 (file)
index 0000000..fc62778
--- /dev/null
@@ -0,0 +1,57 @@
+# The olsr.org Optimized Link-State Routing daemon(olsrd)
+# Copyright (c) 2004, Andreas Tønnesen(andreto@olsr.org)
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without 
+# modification, are permitted provided that the following conditions 
+# are met:
+#
+# * Redistributions of source code must retain the above copyright 
+#   notice, this list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the above copyright 
+#   notice, this list of conditions and the following disclaimer in 
+#   the documentation and/or other materials provided with the 
+#   distribution.
+# * Neither the name of olsr.org, olsrd nor the names of its 
+#   contributors may be used to endorse or promote products derived 
+#   from this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 
+# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 
+# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 
+# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 
+# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN 
+# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 
+# POSSIBILITY OF SUCH DAMAGE.
+#
+# Visit http://www.olsr.org for more information.
+#
+# If you find this software useful feel free to make a donation
+# to the project. For more information see the website or contact
+# the copyright holders.
+#
+# $Id: Makefile,v 1.1 2005/05/26 16:09:25 br1 Exp $
+
+OLSRD_PLUGIN = true
+PLUGIN_NAME =  olsrd_mini
+PLUGIN_VER =   0.1
+
+TOPDIR = ../..
+include $(TOPDIR)/Makefile.inc
+
+default_target: $(PLUGIN_FULLNAME)
+
+$(PLUGIN_FULLNAME): $(OBJS)
+               $(CC) $(LDFLAGS) -o $(PLUGIN_FULLNAME) $(OBJS) $(LIBS)
+
+install:       $(PLUGIN_FULLNAME)
+               $(STRIP) $(PLUGIN_FULLNAME)
+               $(INSTALL_LIB)
+
+clean:
+               rm -f $(OBJS) $(SRCS:%.c=%.d) $(PLUGIN_FULLNAME)
diff --git a/lib/mini/README b/lib/mini/README
new file mode 100644 (file)
index 0000000..625f994
--- /dev/null
@@ -0,0 +1,36 @@
+---------------------------------------------------------------------
+MINI PLUGIN FOR OLSRD
+by Bruno Randolf <bruno.randolf@4g-systems.biz>
+---------------------------------------------------------------------
+
+This is a minimal example plugin to demonstrate the functions a plugin
+must implement. It documents the minimal requirements for the new
+plugin interface and is a good start for creating new plugins and 
+testing the plugin loader.
+
+This plugin does nothing, except printing messages when it is loaded
+and unloaded.
+
+
+---------------------------------------------------------------------
+PLUGIN PARAMETERS (PlParam)
+---------------------------------------------------------------------
+
+PlParam "test" "anything"
+       just for a test: print the parameter.
+
+
+---------------------------------------------------------------------
+SAMPLE CONFIG
+---------------------------------------------------------------------
+
+add in /etc/olsrd.conf:
+
+LoadPlugin "olsrd_mini.so.0.1"
+{
+       PlParam "test" "hello"
+}
+
+
+---------------------------------------------------------------------
+EOF / 26.05.2005
diff --git a/lib/mini/olsrd_mini.so.0.1 b/lib/mini/olsrd_mini.so.0.1
new file mode 100755 (executable)
index 0000000..f2ab7e8
Binary files /dev/null and b/lib/mini/olsrd_mini.so.0.1 differ
diff --git a/lib/mini/src/olsrd_plugin.c b/lib/mini/src/olsrd_plugin.c
new file mode 100644 (file)
index 0000000..797c5df
--- /dev/null
@@ -0,0 +1,116 @@
+/*
+ * Copyright (c) 2005, Bruno Randolf <bruno.randolf@4g-systems.biz>
+ * Copyright (c) 2004, Andreas Tønnesen(andreto-at-olsr.org)
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without 
+ * modification, are permitted provided that the following conditions 
+ * are met:
+ *
+ * * Redistributions of source code must retain the above copyright notice, 
+ *   this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright notice, 
+ *   this list of conditions and the following disclaimer in the documentation 
+ *   and/or other materials provided with the distribution.
+ * * Neither the name of the UniK olsr daemon nor the names of its contributors 
+ *   may be used to endorse or promote products derived from this software 
+ *   without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND 
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 
+ * IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, 
+ * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE 
+ * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED 
+ * OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+
+/* $Id: olsrd_plugin.c,v 1.1 2005/05/26 16:09:25 br1 Exp $ */
+
+ /*
+ * Example plugin for olsrd.org OLSR daemon
+ * Only the bare minimum
+ */
+
+
+#include <stdio.h>
+#include <string.h>
+
+#include "olsrd_plugin.h"
+#include "olsr.h"
+
+
+/****************************************************************************
+ *                Functions that the plugin MUST provide                    *
+ ****************************************************************************/
+/**
+ * Plugin interface version
+ * Used by main olsrd to check plugin interface version
+ */
+int 
+get_plugin_interface_version()
+{
+       return PLUGIN_INTERFACE_VERSION;
+}
+
+
+/**
+ * Register parameters from config file
+ * Called for all plugin parameters
+ */
+int
+register_olsr_param(char *key, char *value)
+{
+       if(!strcmp(key, "test")) {
+               printf("\n*** MINI: parameter test: %s\n", value);
+               return 1;
+       }
+       return 0;
+}
+
+
+/**
+ * Initialize plugin
+ * Called after all parameters are passed
+ */
+int
+plugin_init()
+{
+       printf("*** MINI: plugin_init\n");
+       
+       /* call a function from main olsrd */
+       olsr_printf(2, "*** MINI: printed this with olsr_printf\n");
+       
+       return 1;
+}
+
+
+/****************************************************************************
+ *       Optional private constructor and destructor functions              *
+ ****************************************************************************/
+
+/* attention: make static to avoid name clashes */
+
+/**
+ * Optional Private Constructor
+ */
+static void
+my_init()
+{
+       printf("*** MINI: constructor\n");
+}
+
+
+/**
+ * Optional Private Destructor
+ */
+static void
+my_fini()
+{
+       printf("*** MINI: destructor\n");
+}
diff --git a/lib/mini/src/olsrd_plugin.d b/lib/mini/src/olsrd_plugin.d
new file mode 100644 (file)
index 0000000..90e9e03
--- /dev/null
@@ -0,0 +1,29 @@
+src/olsrd_plugin.o: src/olsrd_plugin.c /usr/include/stdio.h \
+  /usr/include/features.h /usr/include/sys/cdefs.h \
+  /usr/include/gnu/stubs.h \
+  /usr/lib/gcc-lib/i686-pc-linux-gnu/3.3.5-20050130/include/stddef.h \
+  /usr/include/bits/types.h /usr/include/bits/wordsize.h \
+  /usr/include/bits/typesizes.h /usr/include/libio.h \
+  /usr/include/_G_config.h /usr/include/wchar.h /usr/include/bits/wchar.h \
+  /usr/include/gconv.h \
+  /usr/lib/gcc-lib/i686-pc-linux-gnu/3.3.5-20050130/include/stdarg.h \
+  /usr/include/bits/stdio_lim.h /usr/include/bits/sys_errlist.h \
+  /usr/include/bits/stdio.h /usr/include/string.h \
+  /usr/include/bits/string.h /usr/include/bits/string2.h \
+  /usr/include/endian.h /usr/include/bits/endian.h /usr/include/stdlib.h \
+  src/olsrd_plugin.h ../../src/olsr.h ../../src/olsr_protocol.h \
+  ../../src/olsr_types.h /usr/include/sys/types.h /usr/include/time.h \
+  /usr/include/sys/select.h /usr/include/bits/select.h \
+  /usr/include/bits/sigset.h /usr/include/bits/time.h \
+  /usr/include/sys/sysmacros.h /usr/include/bits/pthreadtypes.h \
+  /usr/include/bits/sched.h /usr/include/netinet/in.h \
+  /usr/include/stdint.h /usr/include/sys/socket.h /usr/include/sys/uio.h \
+  /usr/include/bits/uio.h /usr/include/bits/socket.h \
+  /usr/lib/gcc-lib/i686-pc-linux-gnu/3.3.5-20050130/include/limits.h \
+  /usr/lib/gcc-lib/i686-pc-linux-gnu/3.3.5-20050130/include/syslimits.h \
+  /usr/include/limits.h /usr/include/bits/posix1_lim.h \
+  /usr/include/bits/local_lim.h /usr/include/linux/limits.h \
+  /usr/include/bits/posix2_lim.h /usr/include/bits/sockaddr.h \
+  /usr/include/asm/socket.h /usr/include/asm/sockios.h \
+  /usr/include/bits/in.h /usr/include/bits/byteswap.h \
+  ../../src/interfaces.h
diff --git a/lib/mini/src/olsrd_plugin.h b/lib/mini/src/olsrd_plugin.h
new file mode 100644 (file)
index 0000000..e097bc0
--- /dev/null
@@ -0,0 +1,88 @@
+/*
+ * Copyright (c) 2005, Bruno Randolf <bruno.randolf@4g-systems.biz>
+ * Copyright (c) 2004, Andreas Tønnesen(andreto-at-olsr.org)
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without 
+ * modification, are permitted provided that the following conditions 
+ * are met:
+ *
+ * * Redistributions of source code must retain the above copyright notice, 
+ *   this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright notice, 
+ *   this list of conditions and the following disclaimer in the documentation 
+ *   and/or other materials provided with the distribution.
+ * * Neither the name of the UniK olsr daemon nor the names of its contributors 
+ *   may be used to endorse or promote products derived from this software 
+ *   without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND 
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 
+ * IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, 
+ * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE 
+ * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED 
+ * OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+
+/* $Id: olsrd_plugin.h,v 1.1 2005/05/26 16:09:25 br1 Exp $ */
+
+/*
+ * Example plugin for olsrd.org OLSR daemon
+ * Only the bare minimum
+ */
+
+#ifndef _OLSRD_PLUGIN_MINI
+#define _OLSRD_PLUGIN_MINI
+
+
+/* Interface version 4 is new direct access to main functions */
+#define PLUGIN_INTERFACE_VERSION 4
+
+
+/****************************************************************************
+ *                Functions that the plugin MUST provide                    *
+ ****************************************************************************/
+
+/**
+ * Plugin interface version
+ * Used by main olsrd to check plugin interface version
+ */
+int 
+get_plugin_interface_version(void);
+
+
+/**
+ * Register parameters from config file
+ * Called for all plugin parameters
+ */
+int
+register_olsr_param(char *key, char *value);
+
+
+/**
+ * Initialize plugin
+ * Called after all parameters are passed
+ */
+int
+plugin_init(void);
+
+
+/****************************************************************************
+ *       Optional private constructor and destructor functions              *
+ ****************************************************************************/
+
+/* attention: make static to avoid name clashes */
+
+static void __attribute__ ((constructor))
+my_init(void);
+
+static void __attribute__ ((destructor)) 
+my_fini(void);
+
+
+#endif
diff --git a/lib/mini/src/olsrd_plugin.o b/lib/mini/src/olsrd_plugin.o
new file mode 100644 (file)
index 0000000..fe99afb
Binary files /dev/null and b/lib/mini/src/olsrd_plugin.o differ
diff --git a/lib/mini/version-script.txt b/lib/mini/version-script.txt
new file mode 100644 (file)
index 0000000..fe41c91
--- /dev/null
@@ -0,0 +1,5 @@
+VERS_1.0
+{
+  global:
+    *;
+};
index 8b47379..b5a10bc 100644 (file)
@@ -36,7 +36,7 @@
  * to the project. For more information see the website or contact
  * the copyright holders.
  *
- * $Id: plugin_loader.c,v 1.19 2005/04/10 11:41:50 kattemat Exp $
+ * $Id: plugin_loader.c,v 1.20 2005/05/26 16:09:25 br1 Exp $
  */
 
 #include "plugin_loader.h"
@@ -106,75 +106,78 @@ olsr_load_dl(char *libname, struct plugin_param *params)
     }
 
   /* Fetch the interface version function */
-  OLSR_PRINTF(1, "Checking plugin interface version....")
+  OLSR_PRINTF(1, "Checking plugin interface version... ")
   if((get_interface_version = dlsym(new_entry.dlhandle, "get_plugin_interface_version")) == NULL)
     {
-      OLSR_PRINTF(1, "trying v1 detection...")
+      OLSR_PRINTF(1, "trying v1 detection... ")
       if((interface_version = dlsym(new_entry.dlhandle, "plugin_interface_version")) == NULL)
-       {
-         OLSR_PRINTF(1, "FAILED: \"%s\"\n", dlerror())
-         dlclose(new_entry.dlhandle);
-         return -1;
-       }
+        {
+          OLSR_PRINTF(1, "FAILED: \"%s\"\n", dlerror())
+          dlclose(new_entry.dlhandle);
+          return -1;
+        }
       else
-       {
-         OLSR_PRINTF(1, " %d - ", *interface_version)
-         if(*interface_version != PLUGIN_INTERFACE_VERSION)
-           {
-             OLSR_PRINTF(1, "\n\nWARNING: VERSION MISSMATCH! DETECTED %d CURRENT VERSION %d\nTHIS CAN CAUSE UNEXPECTED BEHAVIOUR AND CRASHES!\nWILL CONTINUE IN 5 SECONDS...\n\n", get_interface_version(), PLUGIN_INTERFACE_VERSION)
-              sleep(5);
-           }
-         else
-           {
-             OLSR_PRINTF(1, "OK\n")
-           }
-       }
+        {
+          new_entry.plugin_interface_version = *interface_version;
+        }
     }
   else
     {
-      OLSR_PRINTF(1, " %d - ", get_interface_version())
-      if(get_interface_version() != PLUGIN_INTERFACE_VERSION)
-       {
-         OLSR_PRINTF(1, "\n\nWARNING: VERSION MISSMATCH! DETECTED %d CURRENT VERSION %d\nTHIS CAN CAUSE UNEXPECTED BEHAVIOUR AND CRASHES!\nWILL CONTINUE IN 5 SECONDS...\n\n", get_interface_version(), PLUGIN_INTERFACE_VERSION)
-          sleep(5);
-       }
-      else
-       {
-         OLSR_PRINTF(1, "OK\n")
-       }
+      new_entry.plugin_interface_version = get_interface_version();
     }
-
-  OLSR_PRINTF(1, "Trying to fetch register function....")
+  OLSR_PRINTF(1, " %d - OK\n", new_entry.plugin_interface_version)
   
-  if((new_entry.register_olsr_data = dlsym(new_entry.dlhandle, "register_olsr_data")) == NULL)
+  if ( new_entry.plugin_interface_version < 4 ) 
     {
-      /* 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;
+      /* old plugin interface */
+      
+      OLSR_PRINTF(1, "\nWARNING: YOU ARE USING THE OLD PLUGIN INTERFACE! DETECTED %d CURRENT VERSION %d\nPLEASE CONSIDER CHANGING YOUR PLUGIN TO THE NEW VERSION!\nWILL CONTINUE IN 5 SECONDS...\n\n", get_interface_version(), PLUGIN_INTERFACE_VERSION)
+      sleep(5);
+
+      OLSR_PRINTF(1, "Trying to fetch register function... ")
+      if((new_entry.register_olsr_data = dlsym(new_entry.dlhandle, "register_olsr_data")) == NULL)
+        {
+          /* 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")
+
+      /* 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")
     }
-  OLSR_PRINTF(1, "OK\n")
-
-
-  /* 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")
+    {
+      /* new plugin interface */
+      
+      if ( new_entry.plugin_interface_version != PLUGIN_INTERFACE_VERSION ) 
+        {
+          OLSR_PRINTF(1, "\n\nWARNING: VERSION MISSMATCH! DETECTED %d CURRENT VERSION %d\nTHIS CAN CAUSE UNEXPECTED BEHAVIOUR AND CRASHES!\nWILL CONTINUE IN 5 SECONDS...\n\n", get_interface_version(), PLUGIN_INTERFACE_VERSION)
+          sleep(5);
+        }
+   
+      /* Fetch the init function */
+      OLSR_PRINTF(1, "Trying to fetch plugin init function... ")
+      if((new_entry.plugin_init = dlsym(new_entry.dlhandle, "plugin_init")) == 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....")
+  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")
 
-
   entry = olsr_malloc(sizeof(struct olsr_plugin), "Plugin entry");
-
   memcpy(entry, &new_entry, sizeof(struct olsr_plugin));
-
   entry->params = params;
 
   /* Initialize the plugin */
@@ -190,7 +193,6 @@ olsr_load_dl(char *libname, struct plugin_param *params)
 }
 
 
-
 /**
  *Initialize a loaded plugin
  *This includes sending information
@@ -212,33 +214,41 @@ init_olsr_plugin(struct olsr_plugin *entry)
     {
       OLSR_PRINTF(1, "Sending parameters...\n")
       while(params)
-       {
-         OLSR_PRINTF(1, "\"%s\"/\"%s\".... ", params->key, params->value)
-         if((retval = entry->register_param(params->key, params->value)) < 0)
-           {
-             fprintf(stderr, "\nFatal error in plugin parameter \"%s\"/\"%s\"\n", params->key, params->value);
-             exit(EXIT_FAILURE);
-           }
-         OLSR_PRINTF(1, "%s\n", retval == 0 ? "FAILED" : "OK")
-
-         params = params->next;
-       }
+        {
+          OLSR_PRINTF(1, "\"%s\"/\"%s\"... ", params->key, params->value)
+          if((retval = entry->register_param(params->key, params->value)) < 0)
+            {
+              fprintf(stderr, "\nFatal error in plugin parameter \"%s\"/\"%s\"\n", params->key, params->value);
+              exit(EXIT_FAILURE);
+            }
+          OLSR_PRINTF(1, "%s\n", retval == 0 ? "FAILED" : "OK")
+
+          params = params->next;
+        }
     }
 
-  OLSR_PRINTF(1, "Running registration function...\n")
-  /* Fill struct */
-  plugin_data.ipversion = olsr_cnf->ip_version;
-  plugin_data.main_addr = &main_addr;
-
-  plugin_data.olsr_plugin_io = &olsr_plugin_io;
-
-  /* Register data with plugin */
-  entry->register_olsr_data(&plugin_data);
-
+  if ( entry->plugin_interface_version < 4 ) 
+    {
+      /* old plugin interface */
+      
+      OLSR_PRINTF(1, "Running registration function...\n")
+      /* Fill struct */
+      plugin_data.ipversion = olsr_cnf->ip_version;
+      plugin_data.main_addr = &main_addr;
+      plugin_data.olsr_plugin_io = &olsr_plugin_io;
+
+      /* Register data with plugin */
+      entry->register_olsr_data(&plugin_data);
+    }
+  else
+    {
+      /* new plugin interface */
+      OLSR_PRINTF(1, "Running plugin_init function...\n")
+      entry->plugin_init();
+    }
 }
 
 
-
 /**
  *Close all loaded plugins
  */
@@ -254,5 +264,4 @@ olsr_close_plugins()
     {
       dlclose(&entry->dlhandle);
     }
-
 }
index c5faf62..66586a4 100644 (file)
@@ -36,7 +36,7 @@
  * to the project. For more information see the website or contact
  * the copyright holders.
  *
- * $Id: plugin_loader.h,v 1.13 2005/04/10 11:41:50 kattemat Exp $
+ * $Id: plugin_loader.h,v 1.14 2005/05/26 16:09:26 br1 Exp $
  */
 
 #ifndef _OLSR_PLUGIN_LOADER
@@ -58,23 +58,25 @@ struct olsr_plugin_data
 #ifndef OLSR_PLUGIN
 
 #define MAX_LIBS 10
-#define PLUGIN_INTERFACE_VERSION 3
+#define PLUGIN_INTERFACE_VERSION 4
 
 
 struct olsr_plugin
 {
   /* The handle */
   void *dlhandle;
-
-  /* Params */
+  
   struct plugin_param *params;
-
-  int (*register_param)(char *, char *);
+  int plugin_interface_version;
+  
+  /* old interface (PLUGIN_INTERFACE_VERSION <= 3) */
   int (*register_olsr_data)(struct olsr_plugin_data *);
+  int (*plugin_io)(int, void *, size_t); /* Multi - purpose function */
 
-  /* Multi - purpose function */
-  int (*plugin_io)(int, void *, size_t);
-
+  /* new interface (PLUGIN_INTERFACE_VERSION >= 4)*/
+  int (*register_param)(char *, char *);
+  int (*plugin_init)(void);
+  
   struct olsr_plugin *next;
 };