I started to clean up the plugin parameter handling:
authorBernd Petrovitsch <bernd@firmix.at>
Sun, 15 Jul 2007 19:29:38 +0000 (19:29 +0000)
committerBernd Petrovitsch <bernd@firmix.at>
Sun, 15 Jul 2007 19:29:38 +0000 (19:29 +0000)
* Up to now some used case-insensitive, some used case-sensitive (with
  differing cases BTW) parameter names.
* Most plugins silently ignored unknown parameters.
This makes it hard to find errors in the olsrd.conf file.
Instead of simply fixing all the various plugins (and the mostly - more
or less - copied code), I reduced the plugin special code to a minimum
and (more or less automatically) all plugins behave the same (with
respect to the parameter handling).

How does it look now?
Every plugins exports a table of { parameter-name, parse-function,
addr-of-storage } to allow to share more code, e.g. the parsing and
checking of a port number or IP addresses.
Every plugin will export a function
----  snip  ----
void olsrd_get_plugin_parameters(const struct olsrd_plugin_parameters **params, int *size);
----  snip  ----
which delivers the address of the table and it's size. So in theory the
plugin could generate the table at load time though ATM all current
ones export statically defined tables.

What else is different?
- I introduced SUPPORT_OLD_PLUGIN_VERSIONS to simplifiy the compile-time
  removal of legacy support. It is not that much but more of a start.
- Plugin interface version 4 is supported until all plugins are
  migrated.
- The plugin loader produces now much more output - on good and error
  cases. I had too often to look into the source to find that I mistyped
  some parameter .....

ToDo:
- Several plugins cannot handle IPv6 at all - only IPv4 is implemented.
  Some of these functions are locally now but fixed versions can (and
  should IMHO) be shared by all plugins.

15 files changed:
lib/dot_draw/src/olsrd_dot_draw.c
lib/dot_draw/src/olsrd_dot_draw.h
lib/dot_draw/src/olsrd_plugin.c
lib/dot_draw/version-script.txt
lib/httpinfo/src/olsrd_httpinfo.c
lib/httpinfo/src/olsrd_httpinfo.h
lib/httpinfo/src/olsrd_plugin.c
lib/httpinfo/src/olsrd_plugin.h
lib/httpinfo/version-script.txt
lib/txtinfo/src/olsrd_txtinfo.c
lib/txtinfo/src/olsrd_txtinfo.h
lib/txtinfo/version-script.txt
src/olsrd_plugin.h
src/plugin_loader.c
src/plugin_loader.h

index e1ccb6e..68bfc05 100644 (file)
@@ -37,7 +37,7 @@
  * to the project. For more information see the website or contact
  * the copyright holders.
  *
- * $Id: olsrd_dot_draw.c,v 1.24 2007/07/01 01:17:38 ipo23 Exp $
+ * $Id: olsrd_dot_draw.c,v 1.25 2007/07/15 19:29:37 bernd67 Exp $
  */
 
 /*
@@ -236,9 +236,8 @@ plugin_ipc_init(void)
          return 0;
        }
 
-
       /* Register with olsrd */
-      printf("Adding socket with olsrd\n");
+      //printf("Adding socket with olsrd\n");
       add_olsr_socket(ipc_socket, &ipc_action);
       ipc_socket_up = 1;
     }
index 4aa8869..ecbdd0c 100644 (file)
@@ -37,7 +37,7 @@
  * to the project. For more information see the website or contact
  * the copyright holders.
  *
- * $Id: olsrd_dot_draw.h,v 1.8 2007/04/20 14:20:11 bernd67 Exp $
+ * $Id: olsrd_dot_draw.h,v 1.9 2007/07/15 19:29:37 bernd67 Exp $
  */
 
 /*
 #ifndef _OLSRD_DOT_DRAW
 #define _OLSRD_DOT_DRAW
 
+#include "olsrd_plugin.h"
+#include "plugin_util.h"
 
 extern struct in_addr ipc_accept_ip;
 extern int ipc_port;
 
-int 
-olsrd_plugin_interface_version(void);
-
-int
-olsrd_plugin_init(void);
-
-int
-olsrd_plugin_register_param(char *key, char *value);
-
-void
-olsr_plugin_exit(void);
+int olsrd_plugin_interface_version(void);
+int olsrd_plugin_init(void);
+void olsr_plugin_exit(void);
+void olsrd_get_plugin_parameters(const struct olsrd_plugin_parameters **params, int *size);
 
 #endif
index 615b780..37b8be6 100644 (file)
  * to the project. For more information see the website or contact
  * the copyright holders.
  *
- * $Id: olsrd_plugin.c,v 1.15 2007/07/01 01:17:38 ipo23 Exp $
+ * $Id: olsrd_plugin.c,v 1.16 2007/07/15 19:29:37 bernd67 Exp $
  */
 
 /*
  * Dynamic linked library for the olsr.org olsr daemon
  */
-
-
 #include <stdio.h>
 #include <string.h>
 #include <stdlib.h>
 #define PLUGIN_VERSION "0.3"
 #define PLUGIN_AUTHOR   "Andreas T√łnnesen"
 #define MOD_DESC PLUGIN_NAME " " PLUGIN_VERSION " by " PLUGIN_AUTHOR
-#define PLUGIN_INTERFACE_VERSION 4
-
+#define PLUGIN_INTERFACE_VERSION 5
 
 struct in_addr ipc_accept_ip;
 int ipc_port;
 
-
-static void __attribute__ ((constructor)) 
-my_init(void);
-
-static void __attribute__ ((destructor)) 
-my_fini(void);
+static void my_init(void) __attribute__ ((constructor)) ;
+static void my_fini(void) __attribute__ ((destructor));
 
 
 /**
  *Constructor
  */
-static void
-my_init(void)
+static void my_init(void)
 {
-  /* Print plugin info to stdout */
-  printf("%s\n", MOD_DESC);
+    /* Print plugin info to stdout */
+    printf("%s\n", MOD_DESC);
 
-  /* defaults for parameters */
-  ipc_port = 2004;
-  ipc_accept_ip.s_addr = htonl(INADDR_LOOPBACK);
+    /* defaults for parameters */
+    ipc_port = 2004;
+    ipc_accept_ip.s_addr = htonl(INADDR_LOOPBACK);
 }
 
 
 /**
  *Destructor
  */
-static void
-my_fini(void)
+static void my_fini(void)
 {
-  /* Calls the destruction function
-   * olsr_plugin_exit()
-   * This function should be present in your
-   * sourcefile and all data destruction
-   * should happen there - NOT HERE!
-   */
-  olsr_plugin_exit();
+    /* Calls the destruction function
+     * olsr_plugin_exit()
+     * This function should be present in your
+     * sourcefile and all data destruction
+     * should happen there - NOT HERE!
+     */
+    olsr_plugin_exit();
 }
 
 
-int 
-olsrd_plugin_interface_version(void)
+int  olsrd_plugin_interface_version(void)
 {
-  return PLUGIN_INTERFACE_VERSION;
+    return PLUGIN_INTERFACE_VERSION;
 }
 
 
-int
-olsrd_plugin_register_param(char *key, char *value)
+static const struct olsrd_plugin_parameters plugin_parameters[] = {
+    { .name = "port",   .set_plugin_parameter = &set_plugin_port,      .data = &ipc_port },
+    { .name = "accept", .set_plugin_parameter = &set_plugin_ipaddress, .data = &ipc_accept_ip },
+};
+
+void olsrd_get_plugin_parameters(const struct olsrd_plugin_parameters **params, int *size)
 {
-  if(!strcmp(key, "Port"))
-    {
-      ipc_port = atoi(value);
-      olsr_printf(0, "(DOT DRAW) listening on port: %d\n", ipc_port);
-      return 1;
-    }
-
-  if(!strcmp(key, "Accept"))
-    {
-      inet_aton(value, &ipc_accept_ip);
-      olsr_printf(0, "(DOT DRAW) accept only: %s\n", inet_ntoa(ipc_accept_ip));
-      return 1;
-    }
-  olsr_printf(0, "(DOT DRAW) ignored: %s=\"%s\"\n", key, value);
-  return 1;
+    *params = plugin_parameters;
+    *size = sizeof(plugin_parameters)/sizeof(*plugin_parameters);
 }
+
+/*
+ * Local Variables:
+ * mode: c
+ * style: linux
+ * c-basic-offset: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
index 3d09da3..a145659 100644 (file)
@@ -2,8 +2,8 @@ VERS_1.0
 {
   global:
     olsrd_plugin_interface_version;
-    olsrd_plugin_register_param;
     olsrd_plugin_init;
+    olsrd_get_plugin_parameters;
 
   local:
     *;
index a89fee4..cd438fc 100644 (file)
@@ -36,7 +36,7 @@
  * to the project. For more information see the website or contact
  * the copyright holders.
  *
- * $Id: olsrd_httpinfo.c,v 1.68 2007/07/02 10:20:24 bernd67 Exp $
+ * $Id: olsrd_httpinfo.c,v 1.69 2007/07/15 19:29:38 bernd67 Exp $
  */
 
 /*
@@ -130,64 +130,43 @@ struct dynamic_file_entry
   int(*process_data_cb)(char *, olsr_u32_t, char *, olsr_u32_t);
 };
 
+static int get_http_socket(int);
 
-static int
-get_http_socket(int);
-
-static int
-build_tabs(char *, olsr_u32_t, int);
+static int build_tabs(char *, olsr_u32_t, int);
 
-static void
-parse_http_request(int);
+static void parse_http_request(int);
 
-int
-build_http_header(http_header_type, olsr_bool, olsr_u32_t, char *, olsr_u32_t);
-
-static int
-build_frame(char *, char *, int, char *, olsr_u32_t, int(*frame_body_cb)(char *, olsr_u32_t));
+static int build_http_header(http_header_type, olsr_bool, olsr_u32_t, char *, olsr_u32_t);
 
-int
-build_routes_body(char *, olsr_u32_t);
+static int build_frame(char *, char *, int, char *, olsr_u32_t, int(*frame_body_cb)(char *, olsr_u32_t));
 
-int
-build_config_body(char *, olsr_u32_t);
+static int build_routes_body(char *, olsr_u32_t);
 
-int
-build_neigh_body(char *, olsr_u32_t);
+static int build_config_body(char *, olsr_u32_t);
 
-int
-build_topo_body(char *, olsr_u32_t);
+static int build_neigh_body(char *, olsr_u32_t);
 
-int
-build_hna_body(char *, olsr_u32_t);
+static int build_topo_body(char *, olsr_u32_t);
 
-int
-build_mid_body(char *, olsr_u32_t);
+static int build_hna_body(char *, olsr_u32_t);
 
-int
-build_nodes_body(char *, olsr_u32_t);
+static int build_mid_body(char *, olsr_u32_t);
 
-int
-build_all_body(char *, olsr_u32_t);
+static int build_nodes_body(char *, olsr_u32_t);
 
-int
-build_about_body(char *, olsr_u32_t);
+static int build_all_body(char *, olsr_u32_t);
 
-int
-build_cfgfile_body(char *, olsr_u32_t);
+static int build_about_body(char *, olsr_u32_t);
 
+static int build_cfgfile_body(char *, olsr_u32_t);
 
-char *
-sockaddr_to_string(struct sockaddr *);
+static int check_allowed_ip(const struct allowed_net * const allowed_nets, const union olsr_ip_addr * const addr);
 
-olsr_bool
-check_allowed_ip(union olsr_ip_addr *);
+static int build_ip_txt(char *buf, const olsr_u32_t bufsize, const olsr_bool want_link, const char * const ipstr, const char  * const maskstr);
 
+static int build_ipaddr_link(char *buf, const olsr_u32_t bufsize, const olsr_bool want_link, union olsr_ip_addr * const ipaddr, const union hna_netmask * const mask);
 
-static int
-build_ip_txt(char *buf, const olsr_u32_t bufsize, const olsr_bool want_link, const char * const ipstr, const char  * const maskstr);
-static int
-build_ipaddr_link(char *buf, const olsr_u32_t bufsize, const olsr_bool want_link, union olsr_ip_addr * const ipaddr, const union hna_netmask * const mask);
+static char *olsr_netmask_to_string(union hna_netmask *);
 
 static ssize_t writen(int fd, const void *buf, size_t count);
 
@@ -336,20 +315,19 @@ parse_http_request(int fd)
   char http_version[11];
   int c = 0, r = 1, size = 0;
 
-  addrlen = sizeof(struct sockaddr_in);
-
   if(curr_clients >= MAX_CLIENTS)
     return;
 
   curr_clients++;
 
+  addrlen = sizeof(struct sockaddr_in);
   if ((client_sockets[curr_clients] = accept(fd, (struct sockaddr *)  &pin, &addrlen)) == -1)
     {
       olsr_printf(1, "(HTTPINFO) accept: %s\n", strerror(errno));
       goto close_connection;
     }
 
-  if(!check_allowed_ip((union olsr_ip_addr *)&pin.sin_addr.s_addr))
+  if(!check_allowed_ip(allowed_nets, (union olsr_ip_addr *)&pin.sin_addr.s_addr))
     {
       olsr_printf(1, "HTTP request from non-allowed host %s!\n", 
                  olsr_ip_to_string((union olsr_ip_addr *)&pin.sin_addr.s_addr));
@@ -624,8 +602,7 @@ build_http_header(http_header_type type,
 
 
 
-int 
-build_tabs(char *buf, const olsr_u32_t bufsize, int active)
+static int build_tabs(char *buf, const olsr_u32_t bufsize, int active)
 {
   int size = 0, i = 0, tabs = 0;
 
@@ -678,13 +655,12 @@ olsr_plugin_exit(void)
 }
 
 
-static int
-build_frame(char *title __attribute__((unused)), 
-           char *link __attribute__((unused)), 
-           int width __attribute__((unused)),
-           char *buf,
-           olsr_u32_t bufsize, 
-           int(*frame_body_cb)(char *, olsr_u32_t))
+static int build_frame(char *title __attribute__((unused)), 
+                       char *link __attribute__((unused)), 
+                       int width __attribute__((unused)),
+                       char *buf,
+                       olsr_u32_t bufsize, 
+                       int(*frame_body_cb)(char *, olsr_u32_t))
 {
   int i = 0, size = 0;
 
@@ -701,8 +677,7 @@ build_frame(char *title __attribute__((unused)),
   return size;
 }
 
-static int
-build_ip_txt(char *buf, const olsr_u32_t bufsize, const olsr_bool want_link, const char * const ipstr, const char  * const maskstr)
+static int build_ip_txt(char *buf, const olsr_u32_t bufsize, const olsr_bool want_link, const char * const ipstr, const char  * const maskstr)
 {
   int size = 0;
   if (want_link && maskstr == NULL) { /* Print the link only if there is not netmask */
@@ -722,8 +697,7 @@ build_ip_txt(char *buf, const olsr_u32_t bufsize, const olsr_bool want_link, con
   return size;
 }
 
-static int
-build_ipaddr_link(char *buf, const olsr_u32_t bufsize, const olsr_bool want_link, union olsr_ip_addr * const ipaddr, const union hna_netmask * const mask)
+static int build_ipaddr_link(char *buf, const olsr_u32_t bufsize, const olsr_bool want_link, union olsr_ip_addr * const ipaddr, const union hna_netmask * const mask)
 {
   int size = 0;
   char maskbuf[32];
@@ -763,8 +737,7 @@ build_ipaddr_link(char *buf, const olsr_u32_t bufsize, const olsr_bool want_link
 #define build_ipaddr_with_link(buf, bufsize, ipaddr, mask) build_ipaddr_link((buf), (bufsize), OLSR_TRUE, (ipaddr), (mask))
 #define build_ipaddr_no_link(buf, bufsize, ipaddr, mask)   build_ipaddr_link((buf), (bufsize), OLSR_FALSE, (ipaddr), (mask))
 
-int
-build_routes_body(char *buf, olsr_u32_t bufsize)
+static int build_routes_body(char *buf, olsr_u32_t bufsize)
 {
   int size = 0, index;
   struct rt_entry *routes;
@@ -825,8 +798,7 @@ build_routes_body(char *buf, olsr_u32_t bufsize)
   return size;
 }
 
-int
-build_config_body(char *buf, olsr_u32_t bufsize)
+static int build_config_body(char *buf, olsr_u32_t bufsize)
 {
     char systime[100];
     time_t currtime;
@@ -1021,8 +993,7 @@ build_config_body(char *buf, olsr_u32_t bufsize)
 
 
 
-int
-build_neigh_body(char *buf, olsr_u32_t bufsize)
+static int build_neigh_body(char *buf, olsr_u32_t bufsize)
 {
   struct neighbor_entry *neigh;
   struct neighbor_2_list_entry *list_2;
@@ -1109,10 +1080,7 @@ build_neigh_body(char *buf, olsr_u32_t bufsize)
   return size;
 }
 
-
-
-int
-build_topo_body(char *buf, olsr_u32_t bufsize)
+static int build_topo_body(char *buf, olsr_u32_t bufsize)
 {
   int size = 0;
   olsr_u8_t index;
@@ -1164,10 +1132,7 @@ build_topo_body(char *buf, olsr_u32_t bufsize)
   return size;
 }
 
-
-
-int
-build_hna_body(char *buf, olsr_u32_t bufsize)
+static int build_hna_body(char *buf, olsr_u32_t bufsize)
 {
   int size;
   olsr_u8_t index;
@@ -1208,8 +1173,7 @@ build_hna_body(char *buf, olsr_u32_t bufsize)
 }
 
 
-int
-build_mid_body(char *buf, olsr_u32_t bufsize)
+static int build_mid_body(char *buf, olsr_u32_t bufsize)
 {
   int size = 0;
   olsr_u8_t index;
@@ -1246,8 +1210,7 @@ build_mid_body(char *buf, olsr_u32_t bufsize)
 }
 
 
-int
-build_nodes_body(char *buf, olsr_u32_t bufsize)
+static int build_nodes_body(char *buf, olsr_u32_t bufsize)
 {
   int size = 0;
 
@@ -1259,8 +1222,7 @@ build_nodes_body(char *buf, olsr_u32_t bufsize)
   return size;
 }
 
-int
-build_all_body(char *buf, olsr_u32_t bufsize)
+static int build_all_body(char *buf, olsr_u32_t bufsize)
 {
   int size = 0;
 
@@ -1275,8 +1237,7 @@ build_all_body(char *buf, olsr_u32_t bufsize)
 }
 
 
-int
-build_about_body(char *buf, olsr_u32_t bufsize)
+static int build_about_body(char *buf, olsr_u32_t bufsize)
 {
   int size = 0, i = 0;
 
@@ -1287,8 +1248,7 @@ build_about_body(char *buf, olsr_u32_t bufsize)
   return size;
 }
 
-int
-build_cfgfile_body(char *buf, olsr_u32_t bufsize)
+static int build_cfgfile_body(char *buf, olsr_u32_t bufsize)
 {
   int size = 0, i = 0;
 
@@ -1323,41 +1283,23 @@ build_cfgfile_body(char *buf, olsr_u32_t bufsize)
   return size;
 }
 
-
-olsr_bool
-check_allowed_ip(union olsr_ip_addr *addr)
+static int check_allowed_ip(const struct allowed_net * const allowed_nets, const union olsr_ip_addr * const addr)
 {
-  struct allowed_host *allh = allowed_hosts;
-  struct allowed_net *alln = allowed_nets;
-
-  if(addr->v4 == ntohl(INADDR_LOOPBACK))
-    return OLSR_TRUE;
-
-  /* check hosts */
-  while(allh)
-    {
-      if(addr->v4 == allh->host.v4)
-       return OLSR_TRUE;
-      allh = allh->next;
-    }
-
-  /* check nets */
-  while(alln)
-    {
-      if((addr->v4 & alln->mask.v4) == (alln->net.v4 & alln->mask.v4))
-       return OLSR_TRUE;
-      alln = alln->next;
+    const struct allowed_net *alln;
+    for (alln = allowed_nets; alln != NULL; alln = alln->next) {
+        if((addr->v4 & alln->mask.v4) == (alln->net.v4 & alln->mask.v4)) {
+            return 1;
+        }
     }
-
-  return OLSR_FALSE;
+    return 0;
 }
 
 
+
 /**
  *This function is just as bad as the previous one :-(
  */
-char *
-olsr_netmask_to_string(union hna_netmask *mask)
+static char *olsr_netmask_to_string(union hna_netmask *mask)
 {
   char *ret;
   if(olsr_cnf->ip_version == AF_INET) {
index 537211c..74e90ce 100644 (file)
@@ -36,7 +36,7 @@
  * to the project. For more information see the website or contact
  * the copyright holders.
  *
- * $Id: olsrd_httpinfo.h,v 1.29 2007/04/20 14:06:18 bernd67 Exp $
+ * $Id: olsrd_httpinfo.h,v 1.30 2007/07/15 19:29:38 bernd67 Exp $
  */
 
 /*
@@ -47,6 +47,7 @@
 #define _OLSRD_HTTP_INFO
 
 #include "olsrd_plugin.h"
+#include "plugin_util.h"
 
 
 #define HTTP_VERSION "HTTP/1.1"
 #define HTTP_404_MSG "<html><h1>404 - ERROR, no such file</h1><hr>This server does not support file requests!<br><br><i>" PLUGIN_NAME " version " PLUGIN_VERSION  "</i></html>"
 
 
-typedef enum
-  {
+typedef enum {
     HTTP_BAD_REQ,
     HTTP_BAD_FILE,
     HTTP_OK
-  }http_header_type;
+http_header_type;
 
 
-struct http_stats
-{
-  olsr_u32_t ok_hits;
-  olsr_u32_t dyn_hits;
-  olsr_u32_t err_hits;
-  olsr_u32_t ill_hits;
+struct http_stats {
+    olsr_u32_t ok_hits;
+    olsr_u32_t dyn_hits;
+    olsr_u32_t err_hits;
+    olsr_u32_t ill_hits;
 };
 
-
 extern struct olsrd_config *olsr_cfg;
 
-
-char *
-olsr_netmask_to_string(union hna_netmask *);
-
 /* Destructor function */
-void
-olsr_plugin_exit(void);
+void olsr_plugin_exit(void);
+void olsr_plugin_exit(void);
+void olsrd_get_plugin_parameters(const struct olsrd_plugin_parameters **params, int *size);
+
 
 #endif
+
+/*
+ * Local Variables:
+ * mode: c
+ * style: linux
+ * c-basic-offset: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
index 0dddae9..c34f58b 100644 (file)
@@ -36,7 +36,7 @@
  * to the project. For more information see the website or contact
  * the copyright holders.
  *
- * $Id: olsrd_plugin.c,v 1.16 2007/05/09 00:22:47 bernd67 Exp $
+ * $Id: olsrd_plugin.c,v 1.17 2007/07/15 19:29:38 bernd67 Exp $
  */
 
 /*
 
 int http_port = 0;
 int resolve_ip_addresses = 0;
+struct allowed_net *allowed_nets = NULL;
 
-static void __attribute__ ((constructor)) 
-my_init(void);
+static void my_init(void) __attribute__ ((constructor));
+static void my_fini(void) __attribute__ ((destructor));
 
-static void __attribute__ ((destructor)) 
-my_fini(void);
+static int add_plugin_ipnet(const char *value, void *data);
+static int add_plugin_ipaddr(const char *value, void *data);
+
+static int insert_plugin_ipnet(const char *sz_net, const char *sz_mask, struct allowed_net **allowed_nets);
 
 /*
  * Defines the version of the plugin interface that is used
  * THIS IS NOT THE VERSION OF YOUR PLUGIN!
  * Do not alter unless you know what you are doing!
  */
-int 
-olsrd_plugin_interface_version(void)
+int olsrd_plugin_interface_version(void)
 {
-  return PLUGIN_INTERFACE_VERSION;
+    return PLUGIN_INTERFACE_VERSION;
 }
 
-
-
 /**
  *Constructor
  */
-static void
-my_init(void)
+static void my_init(void)
 {
-  /* Print plugin info to stdout */
-  printf("%s\n", MOD_DESC);
-
-  return;
+    /* Print plugin info to stdout */
+    printf("%s\n", MOD_DESC);
 }
 
 /**
  *Destructor
  */
-static void
-my_fini(void)
+static void my_fini(void)
 {
+    /* Calls the destruction function
+     * olsr_plugin_exit()
+     * This function should be present in your
+     * sourcefile and all data destruction
+     * should happen there - NOT HERE!
+     */
+    olsr_plugin_exit();
+}
 
-  /* Calls the destruction function
-   * olsr_plugin_exit()
-   * This function should be present in your
-   * sourcefile and all data destruction
-   * should happen there - NOT HERE!
-   */
-  olsr_plugin_exit();
+static const struct olsrd_plugin_parameters plugin_parameters[] = {
+    { .name = "port",   .set_plugin_parameter = &set_plugin_port,      .data = &http_port },
+    { .name = "host",   .set_plugin_parameter = &add_plugin_ipaddr,    .data = &allowed_nets },
+    { .name = "net",    .set_plugin_parameter = &add_plugin_ipnet,     .data = &allowed_nets },
+    { .name = "resolve",.set_plugin_parameter = &set_boolean,          .data = &resolve_ip_addresses },
+};
 
-  return;
+void olsrd_get_plugin_parameters(const struct olsrd_plugin_parameters **params, int *size)
+{
+    *params = plugin_parameters;
+    *size = sizeof(plugin_parameters)/sizeof(*plugin_parameters);
 }
 
-
-int
-olsrd_plugin_register_param(char *key, char *value)
+static int insert_plugin_ipnet(const char *sz_net, const char *sz_mask, struct allowed_net **allowed_nets)
 {
-  if(!strcmp(key, "port") || !strcmp(key, "Port"))
-    {
-     http_port = atoi(value);
-     printf("(HTTPINFO) listening on port: %d\n", http_port);
-    }
+    struct in_addr net, mask;
+    struct allowed_net *an;
 
-  if(!strcmp(key, "host") || !strcmp(key, "Host"))
-    {
-      struct in_addr in;
-      struct allowed_host *ah;
-      
-      if(inet_aton(value, &in) == 0)
-       return 0;
-
-      ah = malloc(sizeof(struct allowed_host));
-      if(!ah)
-       {
-         fprintf(stderr, "(HTTPINFO) register param host out of memory!\n");
-         exit(0);
-       }
-      ah->host.v4 = in.s_addr;
-      ah->next = allowed_hosts;
-      allowed_hosts = ah;
-      return 1;
+    if(inet_aton(sz_net, &net) == 0) {
+       return 1;
+    }
+    if(inet_aton(sz_mask, &mask) == 0) {
+       return 1;
     }
 
-  if(!strcmp(key, "net") || !strcmp(key, "Net"))
-    {
-      struct in_addr net, mask;
-      struct allowed_net *an;
-      char sz_net[100], sz_mask[100]; /* IPv6 in the future */
-
-      if(sscanf(value, "%99s %99s", sz_net, sz_mask) != 2)
-       {
-         olsr_printf(1, "(HTTPINFO) Error parsing net param \"%s\"!\n", value);
-         return 0;
-       }
-
-      if(inet_aton(sz_net, &net) == 0)
-       return 0;
-
-      if(inet_aton(sz_mask, &mask) == 0)
-       return 0;
-
-      an = malloc(sizeof(struct allowed_net));
-      if(!an)
-       {
-         fprintf(stderr, "(HTTPINFO) register param net out of memory!\n");
-         exit(0);
-       }
-
-      an->net.v4 = net.s_addr;
-      an->mask.v4 = mask.s_addr;
-
-      an->next = allowed_nets;
-      allowed_nets = an;
-      return 1;
-      
+    an = olsr_malloc(sizeof(*an), __func__);
+    if (an == NULL) {
+        fprintf(stderr, "(HTTPINFO) register param net out of memory!\n");
+        exit(0);
     }
-  if(!strcasecmp(key, "resolve"))
-    {
-        if (!strcasecmp (value, "yes")) {
-            resolve_ip_addresses = 1;
-        } else if (!strcasecmp (value, "no")) {
-            resolve_ip_addresses = 0;
-        } else {
-            return 0;
-        }
+
+    an->net.v4  = net.s_addr;
+    an->mask.v4 = mask.s_addr;
+    an->next = *allowed_nets;
+    *allowed_nets = an;
+    return 0;
+}
+
+static int add_plugin_ipnet(const char *value, void *data)
+{
+    char sz_net[100], sz_mask[100]; /* IPv6 in the future */
+
+    if(sscanf(value, "%99s %99s", sz_net, sz_mask) != 2) {
+        olsr_printf(1, "(HTTPINFO) Error parsing net param \"%s\"!\n", value);
+        return 0;
     }
-  return 1;
+    return insert_plugin_ipnet(sz_net, sz_mask, data);
+}
+
+static int add_plugin_ipaddr(const char *value, void *data)
+{
+    return insert_plugin_ipnet(value, "255.255.255.255", data);
 }
+
+/*
+ * Local Variables:
+ * mode: c
+ * style: linux
+ * c-basic-offset: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
index 5a701d3..7918a0c 100644 (file)
@@ -36,7 +36,7 @@
  * to the project. For more information see the website or contact
  * the copyright holders.
  *
- * $Id: olsrd_plugin.h,v 1.22 2007/04/02 22:22:26 bernd67 Exp $
+ * $Id: olsrd_plugin.h,v 1.23 2007/07/15 19:29:38 bernd67 Exp $
  */
 
 /*
@@ -57,6 +57,7 @@
 #include <math.h>
 
 #include "olsr_types.h"
+#include "../../../src/olsrd_plugin.h"
 #include "neighbor_table.h"
 #include "two_hop_neighbor_table.h"
 #include "tc_set.h"
 #define PLUGIN_VERSION "0.1"
 #define PLUGIN_AUTHOR   "Andreas T√łnnesen"
 #define MOD_DESC PLUGIN_NAME " " PLUGIN_VERSION " by " PLUGIN_AUTHOR
-#define PLUGIN_INTERFACE_VERSION 4
+#define PLUGIN_INTERFACE_VERSION 5
 
 extern int http_port;
 extern int resolve_ip_addresses;
 
 /* Allowed hosts stuff */
 
-struct allowed_host
-{
-  union olsr_ip_addr       host;
-  struct allowed_host     *next;
+struct allowed_net {
+    union olsr_ip_addr       net;
+    union olsr_ip_addr       mask;
+    struct allowed_net      *next;
 };
 
-struct allowed_net
-{
-  union olsr_ip_addr       net;
-  union olsr_ip_addr       mask;
-  struct allowed_net      *next;
-};
-
-struct allowed_host   *allowed_hosts;
-struct allowed_net    *allowed_nets;
+extern struct allowed_net    *allowed_nets;
 
 
 /****************************************************************************
  *                Functions that the plugin MUST provide                    *
  ****************************************************************************/
 
-
 /* Initialization function */
-int
-olsrd_plugin_init(void);
+int olsrd_plugin_init(void);
 
-int
-olsrd_plugin_register_param(char *, char *);
+void olsrd_get_plugin_parameters(const struct olsrd_plugin_parameters **params, int *size);
 
-int 
-olsrd_plugin_interface_version(void);
+int olsrd_plugin_interface_version(void);
 
 #endif
+
+/*
+ * Local Variables:
+ * mode: c
+ * style: linux
+ * c-basic-offset: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
index 3d09da3..a145659 100644 (file)
@@ -2,8 +2,8 @@ VERS_1.0
 {
   global:
     olsrd_plugin_interface_version;
-    olsrd_plugin_register_param;
     olsrd_plugin_init;
+    olsrd_get_plugin_parameters;
 
   local:
     *;
index 46bb0bb..a8582eb 100644 (file)
@@ -40,7 +40,7 @@
  * to the project. For more information see the website or contact
  * the copyright holders.
  *
- * $Id: olsrd_txtinfo.c,v 1.6 2007/05/09 17:29:53 bernd67 Exp $
+ * $Id: olsrd_txtinfo.c,v 1.7 2007/07/15 19:29:37 bernd67 Exp $
  */
 
 /*
@@ -92,33 +92,24 @@ static int ipc_socket_up;
 
 
 /* IPC initialization function */
-static int
-plugin_ipc_init(void);
+static int plugin_ipc_init(void);
 
-static void 
-send_info(int neighonly);
+static void  send_info(int neighonly);
 
-static void
-ipc_action(int);
+static void ipc_action(int);
 
-static void
-ipc_print_neigh_link(void);
+static void ipc_print_neigh_link(void);
 
-static void
-ipc_print_routes(void);
+static void ipc_print_routes(void);
 
-static void
-ipc_print_topology(void);
+static void ipc_print_topology(void);
 
-static void
-ipc_print_hna(void);
+static void ipc_print_hna(void);
 
-static void
-ipc_print_mid(void);
+static void ipc_print_mid(void);
 
 #define TXT_IPC_BUFSIZE 256
-static int 
-ipc_sendf(const char* format, ...) __attribute__((format(printf, 1, 2)));
+static int ipc_sendf(const char* format, ...) __attribute__((format(printf, 1, 2)));
 
 /**
  *Do initialization here
@@ -129,23 +120,22 @@ ipc_sendf(const char* format, ...) __attribute__((format(printf, 1, 2)));
 int
 olsrd_plugin_init(void)
 {
-  /* Initial IPC value */
-  ipc_open = 0;
-  ipc_socket_up = 0;
+    /* Initial IPC value */
+    ipc_open = 0;
+    ipc_socket_up = 0;
 
-  plugin_ipc_init();
-  return 1;
+    plugin_ipc_init();
+    return 1;
 }
 
 
 /**
  * destructor - called at unload
  */
-void
-olsr_plugin_exit(void)
+void olsr_plugin_exit(void)
 {
-  if(ipc_open)
-    close(ipc_socket);
+    if(ipc_open)
+        close(ipc_socket);
 }
 
 
@@ -153,346 +143,299 @@ olsr_plugin_exit(void)
 static int
 plugin_ipc_init(void)
 {
-  struct sockaddr_in sin;
-  olsr_u32_t yes = 1;
+    struct sockaddr_in sin;
+    olsr_u32_t yes = 1;
 
-  /* Init ipc socket */
-  if ((ipc_socket = socket(AF_INET, SOCK_STREAM, 0)) == -1) 
-    {
+    /* Init ipc socket */
+    if ((ipc_socket = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
 #ifndef NODEBUG
-      olsr_printf(1, "(TXTINFO) socket()=%s\n", strerror(errno));
+        olsr_printf(1, "(TXTINFO) socket()=%s\n", strerror(errno));
 #endif
-      return 0;
-    }
-  else
-    {
-      if (setsockopt(ipc_socket, SOL_SOCKET, SO_REUSEADDR, (char *)&yes, sizeof(yes)) < 0) 
-      {
+        return 0;
+    } else {
+        if (setsockopt(ipc_socket, SOL_SOCKET, SO_REUSEADDR, (char *)&yes, sizeof(yes)) < 0) {
 #ifndef NODEBUG
-       olsr_printf(1, "(TXTINFO) setsockopt()=%s\n", strerror(errno));
+            olsr_printf(1, "(TXTINFO) setsockopt()=%s\n", strerror(errno));
 #endif
-       return 0;
-      }
+            return 0;
+        }
 
 #if defined __FreeBSD__ && defined SO_NOSIGPIPE
-      if (setsockopt(ipc_socket, SOL_SOCKET, SO_NOSIGPIPE, (char *)&yes, sizeof(yes)) < 0) 
-      {
-       perror("SO_REUSEADDR failed");
-       return 0;
-      }
+        if (setsockopt(ipc_socket, SOL_SOCKET, SO_NOSIGPIPE, (char *)&yes, sizeof(yes)) < 0) {
+            perror("SO_REUSEADDR failed");
+            return 0;
+        }
 #endif
+        /* Bind the socket */
 
-      /* Bind the socket */
-      
-      /* complete the socket structure */
-      memset(&sin, 0, sizeof(sin));
-      sin.sin_family = AF_INET;
-      sin.sin_addr.s_addr = INADDR_ANY;
-      sin.sin_port = htons(ipc_port);
+        /* complete the socket structure */
+        memset(&sin, 0, sizeof(sin));
+        sin.sin_family = AF_INET;
+        sin.sin_addr.s_addr = INADDR_ANY;
+        sin.sin_port = htons(ipc_port);
       
-      /* bind the socket to the port number */
-      if (bind(ipc_socket, (struct sockaddr *) &sin, sizeof(sin)) == -1) 
-       {
+        /* bind the socket to the port number */
+        if (bind(ipc_socket, (struct sockaddr *) &sin, sizeof(sin)) == -1) {
 #ifndef NODEBUG
-         olsr_printf(1, "(TXTINFO) bind()=%s\n", strerror(errno));
+            olsr_printf(1, "(TXTINFO) bind()=%s\n", strerror(errno));
 #endif
-         return 0;
-       }
-      
-      /* show that we are willing to listen */
-      if (listen(ipc_socket, 1) == -1) 
-       {
+            return 0;
+        }
+
+        /* show that we are willing to listen */
+        if (listen(ipc_socket, 1) == -1) {
 #ifndef NODEBUG
-         olsr_printf(1, "(TXTINFO) listen()=%s\n", strerror(errno));
+            olsr_printf(1, "(TXTINFO) listen()=%s\n", strerror(errno));
 #endif
-         return 0;
-       }
-       
-      /* Register with olsrd */
-      add_olsr_socket(ipc_socket, &ipc_action);
+            return 0;
+        }
 
+        /* Register with olsrd */
+        add_olsr_socket(ipc_socket, &ipc_action);
+        
 #ifndef NODEBUG
-      olsr_printf(2, "(TXTINFO) listening on port %d\n",ipc_port);
+        olsr_printf(2, "(TXTINFO) listening on port %d\n",ipc_port);
 #endif
-      ipc_socket_up = 1;
+        ipc_socket_up = 1;
     }
-
-  return 1;
+    return 1;
 }
 
 
-static void
-ipc_action(int fd)
+static void ipc_action(int fd)
 {
-  struct sockaddr_in pin;
-  socklen_t addrlen;
-  char *addr;  
+    struct sockaddr_in pin;
+    char *addr;  
+    fd_set rfds;
+    struct timeval tv;
+    int neighonly = 0;
 
-  addrlen = sizeof(struct sockaddr_in);
+    socklen_t addrlen = sizeof(struct sockaddr_in);
 
-  if(ipc_open)
-    return;
+    if(ipc_open)
+        return;
 
-  if ((ipc_connection = accept(fd, (struct sockaddr *)  &pin, &addrlen)) == -1)
-    {
+    if ((ipc_connection = accept(fd, (struct sockaddr *)  &pin, &addrlen)) == -1) {
 #ifndef NODEBUG
-      olsr_printf(1, "(TXTINFO) accept()=%s\n", strerror(errno));
+        olsr_printf(1, "(TXTINFO) accept()=%s\n", strerror(errno));
 #endif
-      exit(1);
+        return;
     }
-  else
-    {
-      fd_set rfds;
-      struct timeval tv = {0,0};
-      int neighonly = 0;
-
-      addr = inet_ntoa(pin.sin_addr);
-      if(ntohl(pin.sin_addr.s_addr) != ntohl(ipc_accept_ip.s_addr))
-       {
-         olsr_printf(1, "(TXTINFO) From host(%s) not allowed!\n", addr);
-         close(ipc_connection);
-         return;
-       }
-      else
-       {
-      ipc_open = 1;
+
+    tv.tv_sec = tv.tv_usec = 0;
+    addr = inet_ntoa(pin.sin_addr);
+    if (ntohl(pin.sin_addr.s_addr) != ntohl(ipc_accept_ip.v4)) {
+        olsr_printf(1, "(TXTINFO) From host(%s) not allowed!\n", addr);
+        close(ipc_connection);
+        return;
+    }
+    ipc_open = 1;
 #ifndef NODEBUG
-      olsr_printf(2, "(TXTINFO) Connect from %s\n",addr);
+    olsr_printf(2, "(TXTINFO) Connect from %s\n",addr);
 #endif
       
-      /* purge read buffer to prevent blocking on linux*/
-      FD_ZERO(&rfds);
-      FD_SET((unsigned int)ipc_connection, &rfds); /* Win32 needs the cast here */
-      if(select(ipc_connection+1, &rfds, NULL, NULL, &tv)) {
+    /* purge read buffer to prevent blocking on linux*/
+    FD_ZERO(&rfds);
+    FD_SET((unsigned int)ipc_connection, &rfds); /* Win32 needs the cast here */
+    if(select(ipc_connection+1, &rfds, NULL, NULL, &tv)) {
         char requ[128];
         ssize_t s = recv(ipc_connection, (void*)&requ, sizeof(requ), 0); /* Win32 needs the cast here */
         if (0 < s) {
-          requ[s] = 0;
-          /* To print out neighbours only on the Freifunk Status
-           * page the normal output is somewhat lengthy. The
-           * header parsing is sufficient for standard wget.
-           */
-          neighonly = (0 != strstr(requ, "/neighbours"));
+            requ[s] = 0;
+            /* To print out neighbours only on the Freifunk Status
+             * page the normal output is somewhat lengthy. The
+             * header parsing is sufficient for standard wget.
+             */
+            neighonly = (0 != strstr(requ, "/neighbours"));
         }
-      }
+    }
 
-      send_info(neighonly);
+    send_info(neighonly);
          
-      close(ipc_connection);
-      ipc_open = 0;
-    }
-  }
+    close(ipc_connection);
+    ipc_open = 0;
 }
 
-static void
-ipc_print_neigh_link(void)
+static void ipc_print_neigh_link(void)
 {
-  struct neighbor_entry *neigh;
-  struct neighbor_2_list_entry *list_2;
-  struct link_entry *link = NULL;
-  int index, thop_cnt;
+    struct neighbor_entry *neigh;
+    struct neighbor_2_list_entry *list_2;
+    struct link_entry *link = NULL;
+    int index, thop_cnt;
 
-       ipc_sendf("Table: Links\nLocal IP\tremote IP\tHysteresis\tLinkQuality\tlost\ttotal\tNLQ\tETX\n");
+    ipc_sendf("Table: Links\nLocal IP\tremote IP\tHysteresis\tLinkQuality\tlost\ttotal\tNLQ\tETX\n");
 
-  /* Link set */
-  link = link_set;
-       while(link)
-       {
+    /* Link set */
+    link = link_set;
+    while(link)        {
        ipc_sendf( "%s\t%s\t%0.2f\t%0.2f\t%d\t%d\t%0.2f\t%0.2f\t\n",
-                       olsr_ip_to_string(&link->local_iface_addr),
-                       olsr_ip_to_string(&link->neighbor_iface_addr),
-                       link->L_link_quality, 
-                       link->loss_link_quality,
-                       link->lost_packets, 
-                       link->total_packets,
-                       link->neigh_link_quality, 
-                       (link->loss_link_quality * link->neigh_link_quality) ? 1.0 / (link->loss_link_quality * link->neigh_link_quality) : 0.0);
-               link = link->next;
-      }
-       ipc_sendf("\nTable: Neighbors\nIP address\tSYM\tMPR\tMPRS\tWillingness\t2 Hop Neighbors\n");
-
-  /* Neighbors */
-  for(index=0;index<HASHSIZE;index++)
-    {
-      for(neigh = neighbortable[index].next;
-         neigh != &neighbortable[index];
-         neigh = neigh->next)
-       {
-               ipc_sendf( 
-                         "%s\t%s\t%s\t%s\t%d\t", 
-                         olsr_ip_to_string(&neigh->neighbor_main_addr),
-                         (neigh->status == SYM) ? "YES" : "NO",
-                         neigh->is_mpr ? "YES" : "NO",
-                         olsr_lookup_mprs_set(&neigh->neighbor_main_addr) ? "YES" : "NO",
-                         neigh->willingness);
-
-         thop_cnt = 0;
-
-         for(list_2 = neigh->neighbor_2_list.next;
-             list_2 != &neigh->neighbor_2_list;
-             list_2 = list_2->next)
-           {
-             //size += sprintf(&buf[size], "<option>%s</option>\n", olsr_ip_to_string(&list_2->neighbor_2->neighbor_2_addr));
-             thop_cnt ++;
-           }
-               ipc_sendf("%d\n", thop_cnt);
+                   olsr_ip_to_string(&link->local_iface_addr),
+                   olsr_ip_to_string(&link->neighbor_iface_addr),
+                   link->L_link_quality, 
+                   link->loss_link_quality,
+                   link->lost_packets, 
+                   link->total_packets,
+                   link->neigh_link_quality, 
+                   (link->loss_link_quality * link->neigh_link_quality) ? 1.0 / (link->loss_link_quality * link->neigh_link_quality) : 0.0);
+        link = link->next;
+    }
+    ipc_sendf("\nTable: Neighbors\nIP address\tSYM\tMPR\tMPRS\tWillingness\t2 Hop Neighbors\n");
+
+    /* Neighbors */
+    for(index = 0; index < HASHSIZE; index++) {
+        for(neigh = neighbortable[index].next;
+            neigh != &neighbortable[index];
+            neigh = neigh->next) {
+            ipc_sendf("%s\t%s\t%s\t%s\t%d\t", 
+                      olsr_ip_to_string(&neigh->neighbor_main_addr),
+                      (neigh->status == SYM) ? "YES" : "NO",
+                      neigh->is_mpr ? "YES" : "NO",
+                      olsr_lookup_mprs_set(&neigh->neighbor_main_addr) ? "YES" : "NO",
+                      neigh->willingness);
+            thop_cnt = 0;
+
+            for(list_2 = neigh->neighbor_2_list.next;
+                list_2 != &neigh->neighbor_2_list;
+                list_2 = list_2->next)
+                {
+                    //size += sprintf(&buf[size], "<option>%s</option>\n", olsr_ip_to_string(&list_2->neighbor_2->neighbor_2_addr));
+                    thop_cnt ++;
+                }
+            ipc_sendf("%d\n", thop_cnt);
        }
     }
-
-       ipc_sendf("\n");
+    ipc_sendf("\n");
 }
 
-
-static void
-ipc_print_routes(void)
+static void ipc_print_routes(void)
 {
-  int size = 0, index;
-  struct rt_entry *routes;
-
-       ipc_sendf("Table: Routes\nDestination\tGateway\tMetric\tETX\tInterface\tType\n");
-
-  /* Neighbors */
-  for(index = 0;index < HASHSIZE;index++)
-    {
-      for(routes = routingtable[index].next;
-         routes != &routingtable[index];
-         routes = routes->next)
-       {
-               size = 0;
-               ipc_sendf( "%s\t%s\t%d\t%.2f\t%s\tHOST\n",
-                         olsr_ip_to_string(&routes->rt_dst),
-                         olsr_ip_to_string(&routes->rt_router),
-                         routes->rt_metric,
-                         routes->rt_etx,
-                         routes->rt_if->int_name);
+    int size = 0, index;
+    struct rt_entry *routes;
+
+    ipc_sendf("Table: Routes\nDestination\tGateway\tMetric\tETX\tInterface\tType\n");
+
+    /* Neighbors */
+    for(index = 0;index < HASHSIZE; index++) {
+        for(routes = routingtable[index].next;
+            routes != &routingtable[index];
+            routes = routes->next) {
+            size = 0;
+            ipc_sendf( "%s\t%s\t%d\t%.2f\t%s\tHOST\n",
+                       olsr_ip_to_string(&routes->rt_dst),
+                       olsr_ip_to_string(&routes->rt_router),
+                       routes->rt_metric,
+                       routes->rt_etx,
+                       routes->rt_if->int_name);
        }
     }
 
-  /* HNA */
-  for(index = 0;index < HASHSIZE;index++)
-    {
-      for(routes = hna_routes[index].next;
-         routes != &hna_routes[index];
-         routes = routes->next)
-       {
-               ipc_sendf("%s\t%s\t%d\t%s\t\tHNA\n",
-                         olsr_ip_to_string(&routes->rt_dst),
-                         olsr_ip_to_string(&routes->rt_router),
-                         routes->rt_metric,
-                         routes->rt_if->int_name);
+    /* HNA */
+    for(index = 0;index < HASHSIZE;index++) {
+        for(routes = hna_routes[index].next;
+            routes != &hna_routes[index];
+            routes = routes->next) {
+            ipc_sendf("%s\t%s\t%d\t%s\t\tHNA\n",
+                      olsr_ip_to_string(&routes->rt_dst),
+                      olsr_ip_to_string(&routes->rt_router),
+                      routes->rt_metric,
+                      routes->rt_if->int_name);
        }
     }
-
-       ipc_sendf("\n");
+    ipc_sendf("\n");
 
 }
 
-static void
-ipc_print_topology(void)
+static void ipc_print_topology(void)
 {
-  olsr_u8_t index;
-  struct tc_entry *entry;
-  struct topo_dst *dst_entry;
-
-
-  ipc_sendf("Table: Topology\nDestination IP\tLast hop IP\tLQ\tILQ\tETX\n");
-
-  /* Topology */  
-  for(index=0;index<HASHSIZE;index++)
-    {
-      /* For all TC entries */
-      entry = tc_table[index].next;
-      while(entry != &tc_table[index])
-       {
-         /* For all destination entries of that TC entry */
-         dst_entry = entry->destinations.next;
-         while(dst_entry != &entry->destinations)
-           {
-                       ipc_sendf( "%s\t%s\t%0.2f\t%0.2f\t%0.2f\n", 
-                             olsr_ip_to_string(&dst_entry->T_dest_addr),
-                             olsr_ip_to_string(&entry->T_last_addr), 
-                             dst_entry->link_quality,
-                             dst_entry->inverse_link_quality,
-                             (dst_entry->link_quality * dst_entry->inverse_link_quality) ? 1.0 / (dst_entry->link_quality * dst_entry->inverse_link_quality) : 0.0);
+    int index;
+    struct tc_entry *entry;
+    struct topo_dst *dst_entry;
+
+    ipc_sendf("Table: Topology\nDestination IP\tLast hop IP\tLQ\tILQ\tETX\n");
+
+    /* Topology */  
+    for(index = 0; index < HASHSIZE; index++) {
+        /* For all TC entries */
+        entry = tc_table[index].next;
+        while(entry != &tc_table[index]) {
+            /* For all destination entries of that TC entry */
+            dst_entry = entry->destinations.next;
+            while(dst_entry != &entry->destinations) {
+                ipc_sendf( "%s\t%s\t%0.2f\t%0.2f\t%0.2f\n", 
+                           olsr_ip_to_string(&dst_entry->T_dest_addr),
+                           olsr_ip_to_string(&entry->T_last_addr), 
+                           dst_entry->link_quality,
+                           dst_entry->inverse_link_quality,
+                           (dst_entry->link_quality * dst_entry->inverse_link_quality) ? 1.0 / (dst_entry->link_quality * dst_entry->inverse_link_quality) : 0.0);
                
-             dst_entry = dst_entry->next;
+                dst_entry = dst_entry->next;
            }
-         entry = entry->next;
+            entry = entry->next;
        }
     }
-
-  ipc_sendf("\n");
+    ipc_sendf("\n");
 }
 
-static void
-ipc_print_hna(void)
+static void ipc_print_hna(void)
 {
-  int size;
-  olsr_u8_t index;
-  struct hna_entry *tmp_hna;
-  struct hna_net *tmp_net;
-  struct hna4_entry *hna4;
-  struct hna6_entry *hna6;
-
-  size = 0;
-
-  ipc_sendf("Table: HNA\nNetwork\tNetmask\tGateway\n");
-
-  /* Announced HNA entries */
-       for(hna4 = olsr_cnf->hna4_entries; hna4; hna4 = hna4->next)
-         {
-                       ipc_sendf("%s\t%s\t%s\n",
-                         olsr_ip_to_string(&hna4->net),
-                         olsr_ip_to_string(&hna4->netmask),
-                               olsr_ip_to_string(&olsr_cnf->main_addr));
-         }
-       for(hna6 = olsr_cnf->hna6_entries; hna6; hna6 = hna6->next)
-         {
-                       ipc_sendf("%s\t%d\t%s\n",
-                         olsr_ip_to_string(&hna6->net),
-                               hna6->prefix_len,
-                       olsr_ip_to_string(&olsr_cnf->main_addr));
-               }
+    int size;
+    olsr_u8_t index;
+    struct hna_entry *tmp_hna;
+    struct hna_net *tmp_net;
+    struct hna4_entry *hna4;
+    struct hna6_entry *hna6;
+
+    size = 0;
+
+    ipc_sendf("Table: HNA\nNetwork\tNetmask\tGateway\n");
 
-  /* HNA entries */
-  for(index=0;index<HASHSIZE;index++)
-    {
-      tmp_hna = hna_set[index].next;
-      /* Check all entrys */
-      while(tmp_hna != &hna_set[index])
-       {
-         /* Check all networks */
-         tmp_net = tmp_hna->networks.next;
+    /* Announced HNA entries */
+    for(hna4 = olsr_cnf->hna4_entries; hna4; hna4 = hna4->next) {
+        ipc_sendf("%s\t%s\t%s\n",
+                  olsr_ip_to_string(&hna4->net),
+                  olsr_ip_to_string(&hna4->netmask),
+                  olsr_ip_to_string(&olsr_cnf->main_addr));
+    }
+    for(hna6 = olsr_cnf->hna6_entries; hna6; hna6 = hna6->next) {
+        ipc_sendf("%s\t%d\t%s\n",
+                  olsr_ip_to_string(&hna6->net),
+                  hna6->prefix_len,
+                  olsr_ip_to_string(&olsr_cnf->main_addr));
+    }
+
+    /* HNA entries */
+    for(index = 0; index < HASHSIZE; index++) {
+        tmp_hna = hna_set[index].next;
+        /* Check all entrys */
+        while(tmp_hna != &hna_set[index]) {
+            /* Check all networks */
+            tmp_net = tmp_hna->networks.next;
              
-         while(tmp_net != &tmp_hna->networks)
-           {
+            while(tmp_net != &tmp_hna->networks) {
                if (AF_INET == olsr_cnf->ip_version) {
-                       ipc_sendf("%s\t%s\t%s\n",
-                               olsr_ip_to_string(&tmp_net->A_network_addr),
-                               olsr_ip_to_string((union olsr_ip_addr *)&tmp_net->A_netmask.v4),
-                               olsr_ip_to_string(&tmp_hna->A_gateway_addr));
+                    ipc_sendf("%s\t%s\t%s\n",
+                              olsr_ip_to_string(&tmp_net->A_network_addr),
+                              olsr_ip_to_string((union olsr_ip_addr *)&tmp_net->A_netmask.v4),
+                              olsr_ip_to_string(&tmp_hna->A_gateway_addr));
+               } else {
+                    ipc_sendf("%s\t%d\t%s\n",
+                              olsr_ip_to_string(&tmp_net->A_network_addr),
+                              tmp_net->A_netmask.v6,
+                              olsr_ip_to_string(&tmp_hna->A_gateway_addr));
                }
-               else {
-                       ipc_sendf("%s\t%d\t%s\n",
-                               olsr_ip_to_string(&tmp_net->A_network_addr),
-                               tmp_net->A_netmask.v6,
-                               olsr_ip_to_string(&tmp_hna->A_gateway_addr));
-               }
-             tmp_net = tmp_net->next;
+                tmp_net = tmp_net->next;
            }
              
-         tmp_hna = tmp_hna->next;
+            tmp_hna = tmp_hna->next;
        }
     }
-
-       ipc_sendf("\n");
+    ipc_sendf("\n");
 
 }
 
-static void
-ipc_print_mid(void)
+static void ipc_print_mid(void)
 {
-    olsr_u8_t index;
+    int index;
     unsigned short is_first;
     struct mid_entry *entry;
     struct mid_address *alias;
@@ -500,60 +443,53 @@ ipc_print_mid(void)
     ipc_sendf("Table: MID\nIP\tAliases\n");
 
     /* MID */
-    for( index = 0; index < HASHSIZE; index++ )
-    {
+    for(index = 0; index < HASHSIZE; index++) {
         entry = mid_set[index].next;
-
-        while( entry != &mid_set[index] )
-        {
+        
+        while( entry != &mid_set[index] ) {
             ipc_sendf( olsr_ip_to_string( &entry->main_addr ) );
             alias = entry->aliases;
             is_first = 1;
 
-            while( alias )
-            {
+            while( alias ) {
                 ipc_sendf( "%s%s",
-                    ( is_first ? "\t" : ";" ),
-                    olsr_ip_to_string( &alias->alias )
-                );
+                           ( is_first ? "\t" : ";" ),
+                           olsr_ip_to_string( &alias->alias )
+                           );
 
                 alias = alias->next_alias;
                 is_first = 0;
             }
-
             entry = entry->next;
             ipc_sendf("\n");
         }
     }
-
-       ipc_sendf("\n");
+    ipc_sendf("\n");
 }
 
 
-static void 
-send_info(int neighonly)
+static void  send_info(int neighonly)
 {
-       
-       /* Print minimal http header */
-       ipc_sendf("HTTP/1.0 200 OK\n");
-       ipc_sendf("Content-type: text/plain\n\n");
+    /* Print minimal http header */
+    ipc_sendf("HTTP/1.0 200 OK\n");
+    ipc_sendf("Content-type: text/plain\n\n");
 
-       /* Print tables to IPC socket */
+    /* Print tables to IPC socket */
        
-       /* links + Neighbors */
-       ipc_print_neigh_link();
+    /* links + Neighbors */
+    ipc_print_neigh_link();
        
-       /* topology */
-       if (!neighonly) ipc_print_topology();
+    /* topology */
+    if (!neighonly) ipc_print_topology();
        
-       /* hna */
-       if (!neighonly) ipc_print_hna();
+    /* hna */
+    if (!neighonly) ipc_print_hna();
 
-       /* mid */
-       if (!neighonly) ipc_print_mid();
+    /* mid */
+    if (!neighonly) ipc_print_mid();
 
-       /* routes */
-       if (!neighonly) ipc_print_routes();
+    /* routes */
+    if (!neighonly) ipc_print_routes();
 }
 
 /*
@@ -563,29 +499,37 @@ send_info(int neighonly)
  * scalable solution here.
  */
  
-static int 
-ipc_sendf(const char* format, ...)
+static int  ipc_sendf(const char* format, ...)
 {
-       char txtnetbuf[TXT_IPC_BUFSIZE];
+    char txtnetbuf[TXT_IPC_BUFSIZE];
 
-       va_list arg;
-       int rv;
+    va_list arg;
+    int rv;
 #if defined __FreeBSD__ || defined __NetBSD__ || defined __OpenBSD__ || defined __MacOSX__
-       int flags = 0;
+    int flags = 0;
 #else
-       int flags = MSG_NOSIGNAL;
+    int flags = MSG_NOSIGNAL;
 #endif
-       va_start(arg, format);
-       rv = vsnprintf(txtnetbuf, sizeof(txtnetbuf), format, arg);
-       va_end(arg);
-       if(ipc_socket_up) {
-               if (0 > send(ipc_connection, txtnetbuf, rv, flags)) {
+    va_start(arg, format);
+    rv = vsnprintf(txtnetbuf, sizeof(txtnetbuf), format, arg);
+    va_end(arg);
+    if(ipc_socket_up) {
+        if (0 > send(ipc_connection, txtnetbuf, rv, flags)) {
 #ifndef NODEBUG
-                       olsr_printf(1, "(TXTINFO) Failed sending data to client!\n");
+            olsr_printf(1, "(TXTINFO) Failed sending data to client!\n");
 #endif
-                       close(ipc_connection);
-                       return - 1;
-               }
-       }
-       return rv;
+            close(ipc_connection);
+            return - 1;
+        }
+    }
+    return rv;
 }
+
+/*
+ * Local Variables:
+ * mode: c
+ * style: linux
+ * c-basic-offset: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
index 4f262bf..3e79349 100644 (file)
  * to the project. For more information see the website or contact
  * the copyright holders.
  *
- * $Id: olsrd_txtinfo.h,v 1.1 2007/01/31 12:38:26 bernd67 Exp $
+ * $Id: olsrd_txtinfo.h,v 1.2 2007/07/15 19:29:37 bernd67 Exp $
  */
 
 /*
  * Dynamic linked library for the olsr.org olsr daemon
  */
 
-#ifndef _OLSRD_DOT_DRAW
-#define _OLSRD_DOT_DRAW
+#ifndef _OLSRD_TXTINFO
+#define _OLSRD_TXTINFO
 
+#include "olsr_types.h"
+#include "olsrd_plugin.h"
+#include "plugin_util.h"
 
-extern struct in_addr ipc_accept_ip;
+extern union olsr_ip_addr ipc_accept_ip;
 extern int ipc_port;
 extern int nompr;
 
-
-int
-olsrd_plugin_init(void);
-
-void
-olsr_plugin_exit(void);
+int olsrd_plugin_interface_version(void);
+int olsrd_plugin_init(void);
+void olsr_plugin_exit(void);
+void olsrd_get_plugin_parameters(const struct olsrd_plugin_parameters **params, int *size);
 
 #endif
index 3d09da3..a145659 100644 (file)
@@ -2,8 +2,8 @@ VERS_1.0
 {
   global:
     olsrd_plugin_interface_version;
-    olsrd_plugin_register_param;
     olsrd_plugin_init;
+    olsrd_get_plugin_parameters;
 
   local:
     *;
index 37e1e74..31066cc 100644 (file)
@@ -29,7 +29,7 @@
  *
  */
 
-/* $Id: olsrd_plugin.h,v 1.2 2007/04/20 13:46:04 bernd67 Exp $ */
+/* $Id: olsrd_plugin.h,v 1.3 2007/07/15 19:29:37 bernd67 Exp $ */
 
 /*
  * Example plugin for olsrd.org OLSR daemon
 #define _OLSRD_PLUGIN
 
 
-/* Interface version 4 is new direct access to main functions */
-#define OLSRD_PLUGIN_INTERFACE_VERSION 4
+/* Define the most recent version */
+#define MOST_RECENT_PLUGIN_INTERFACE_VERSION           5
+#define LAST_SUPPORTED_PLUGIN_INTERFACE_VERSION                4
 
 
 /****************************************************************************
  *                Functions that the plugin MUST provide                    *
  ****************************************************************************/
-
 #if 1
 /* We hide them from the compiler here to allow the plugins itself to declare them
  * as they also implement them if we activate -Wredundant-decls.
  * Plugin interface version
  * Used by main olsrd to check plugin interface version
  */
-int 
-olsrd_plugin_interface_version(void);
+int olsrd_plugin_interface_version(void);
+
+
+/**
+ * Initialize plugin
+ * Called after all parameters are passed
+ */
+int olsrd_plugin_init(void);
 
 
+/* Interface version 4 */
 /**
  * Register parameters from config file
  * Called for all plugin parameters
  */
-int
-olsrd_plugin_register_param(char *key, char *value);
+int olsrd_plugin_register_param(char *key, char *value);
+
+/* Interface version 5 */
 
+typedef int (*set_plugin_parameter)(const char *value, void *data);
+
+struct olsrd_plugin_parameters {
+    const char *name;
+    set_plugin_parameter set_plugin_parameter;
+    void *data;
+};
 
 /**
- * Initialize plugin
- * Called after all parameters are passed
+ * Delivers the (address of the) table and the size of the parameter description
  */
-int
-olsrd_plugin_init(void);
+void olsrd_get_plugin_parameters(const struct olsrd_plugin_parameters **params, int *size);
+
 #endif
 
 #endif
+
+/*
+ * Local Variables:
+ * mode: c
+ * style: linux
+ * c-basic-offset: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
index b64a14f..35df360 100644 (file)
  * to the project. For more information see the website or contact
  * the copyright holders.
  *
- * $Id: plugin_loader.c,v 1.26 2007/07/04 01:50:45 ipo23 Exp $
+ * $Id: plugin_loader.c,v 1.27 2007/07/15 19:29:37 bernd67 Exp $
  */
 
 #include "plugin_loader.h"
 #include "olsrd_plugin.h"
+#include "plugin_util.h"
 #include "defs.h"
 #include "olsr.h"
-/* Local functions */
 
-static void
-init_olsr_plugin(struct olsr_plugin *);
+#include <dlfcn.h>
 
-static int
-olsr_load_dl(char *, struct plugin_param *);
+/* Local functions */
+static int init_olsr_plugin(struct olsr_plugin *);
+static int olsr_load_dl(char *, struct plugin_param *);
+static int olsr_add_dl(struct olsr_plugin *);
 
-static struct olsr_plugin *olsr_plugins;
+static struct olsr_plugin *olsr_plugins = NULL;
 
 
 /**
@@ -59,26 +60,22 @@ static struct olsr_plugin *olsr_plugins;
  *
  *@return the number of plugins loaded
  */
-int
-olsr_load_plugins(void)
+void olsr_load_plugins(void)
 {
-  struct plugin_entry *entry = olsr_cnf->plugins;
-  int loaded = 0;
-  OLSR_PRINTF(0, "Loading plugins...\n\n");
-  while(entry)
-    {  
-      if(olsr_load_dl(entry->name, entry->params) < 0)
-       OLSR_PRINTF(0, "PLUGIN %s LOADING FAILED! --\n\n", entry->name);
-      else {
-       loaded++;
-      }
-
-      entry = entry->next;
+    struct plugin_entry *entry = olsr_cnf->plugins;
+    int rv = 0;
+    for (entry = olsr_cnf->plugins; entry != NULL; entry = entry->next) {
+        if(olsr_load_dl(entry->name, entry->params) < 0) {
+            rv = 1;
+        }
     }
-  return loaded;
+    if (rv != 0) {
+        OLSR_PRINTF(0, "-- PLUGIN LOADING FAILED! --\n");
+        exit(1);
+    }
+    OLSR_PRINTF(0, "-- ALL PLUGINS LOADED! --\n\n");
 }
 
-
 /**
  *Try to load a shared library and extract
  *the required information
@@ -87,106 +84,146 @@ olsr_load_plugins(void)
  *
  *@return negative on error
  */
-int
-olsr_load_dl(char *libname, struct plugin_param *params)
+int olsr_load_dl(char *libname, struct plugin_param *params)
 {
-  struct olsr_plugin new_entry, *entry;
-  int (*get_interface_version)(void);
-  int *interface_version;
+    struct olsr_plugin *plugin = olsr_malloc(sizeof(struct olsr_plugin), "Plugin entry");
+    int rv;
 
-  OLSR_PRINTF(0, "---------- Plugin loader ----------\nLibrary: %s\n", libname);
+    OLSR_PRINTF(0, "---------- LOADING LIBRARY %s ----------\n", libname);
 
-  if(NULL == (new_entry.dlhandle = dlopen(libname, RTLD_NOW)))
-    {
-      OLSR_PRINTF(0, "DL loading failed: \"%s\"!\n", dlerror());
-      return -1;
+    plugin->dlhandle = dlopen(libname, RTLD_NOW);
+    if(plugin->dlhandle == NULL) {
+        const int save_errno = errno;
+        OLSR_PRINTF(1, "DL loading failed: \"%s\"!\n", dlerror());
+        free(plugin);
+        errno = save_errno;
+        return -1;
     }
 
-  /* Fetch the interface version function, 3 different ways */
-  OLSR_PRINTF(1, "Checking plugin interface version... ");
-  if((get_interface_version = dlsym(new_entry.dlhandle, "olsrd_plugin_interface_version")) == NULL)
-    {
-      OLSR_PRINTF(1, "trying v2 detection... ");
-      if((get_interface_version = dlsym(new_entry.dlhandle, "get_plugin_interface_version")) == NULL)
-        {
-          OLSR_PRINTF(1, "trying v1 detection... ");
-          if((interface_version = dlsym(new_entry.dlhandle, "plugin_interface_version")) == NULL)
-            {
-              OLSR_PRINTF(0, "FAILED: \"%s\"\n", dlerror());
-              dlclose(new_entry.dlhandle);
-              return -1;
-            }
-          else
-            {
-              new_entry.plugin_interface_version = *interface_version;
-            }
-        }
-      else
-        {
-          new_entry.plugin_interface_version = get_interface_version();
+    rv = olsr_add_dl(plugin);
+    if (rv == -1) {
+        const int save_errno = errno;
+        dlclose(plugin->dlhandle);
+        free(plugin);
+        errno = save_errno;
+    } else {
+        plugin->params = params;
+
+        /* Initialize the plugin */
+        if (init_olsr_plugin(plugin) != 0) {
+            rv = -1;
         }
+
+        /* queue */
+        plugin->next = olsr_plugins;
+        olsr_plugins = plugin;
+    }
+    OLSR_PRINTF(0, "---------- LIBRARY %s %s ----------\n\n", libname, rv == 0 ? "LOADED" : "FAILED");
+    return rv;
+}
+
+#if SUPPORT_OLD_PLUGIN_VERSIONS
+static int try_old_versions(const struct olsr_plugin *plugin)
+{
+    get_interface_version_func get_interface_version;
+    int *interface_version;
+
+    OLSR_PRINTF(1, "trying v2 detection... ");
+    get_interface_version = dlsym(plugin->dlhandle, "get_plugin_interface_version");
+    if (get_interface_version != NULL) {
+        return get_interface_version();
+    }
+
+    OLSR_PRINTF(1, "trying v1 detection... ");
+    interface_version = dlsym(plugin->dlhandle, "plugin_interface_version");
+    if (interface_version != NULL) {
+        return *interface_version;
+    }
+    OLSR_PRINTF(0, "FAILED: \"%s\"\n", dlerror());
+    return -1;
+}
+#else 
+#define try_old_versions(plugin) -1
+#endif
+
+static int olsr_add_dl(struct olsr_plugin *plugin)
+{
+    get_interface_version_func get_interface_version;
+    get_plugin_parameters_func get_plugin_parameters;
+    int plugin_interface_version;
+
+    /* Fetch the interface version function, 3 different ways */
+    OLSR_PRINTF(0, "Checking plugin interface version: ");
+    get_interface_version = dlsym(plugin->dlhandle, "olsrd_plugin_interface_version");
+    if (get_interface_version == NULL) {
+        plugin_interface_version = try_old_versions(plugin);
+    } else {
+        plugin_interface_version = get_interface_version();
     }
-  else
-    {
-      new_entry.plugin_interface_version = get_interface_version();
+    if (plugin_interface_version == -1) {
+        OLSR_PRINTF(0, "FAILED: \"%s\"\n", dlerror());
+        return -1;
     }
-  OLSR_PRINTF(0, " %d - OK\n", new_entry.plugin_interface_version);
+    OLSR_PRINTF(0, " %d - OK\n", plugin_interface_version);
   
-  if ( new_entry.plugin_interface_version < 4 ) 
-    {
-      /* old plugin interface */
-   
-      OLSR_PRINTF(0, "\nWARNING: YOU ARE USING AN OLD DEPRECATED PLUGIN INTERFACE! DETECTED VERSION %d CURRENT VERSION %d\nPLEASE UPGRADE YOUR PLUGIN!\nWILL CONTINUE IN 5 SECONDS...\n\n", new_entry.plugin_interface_version, OLSRD_PLUGIN_INTERFACE_VERSION);
-      
-      sleep(5);
-      dlclose(new_entry.dlhandle);
-      return -1;
+    if (plugin_interface_version < 5){
+        /* old plugin interface */   
+        OLSR_PRINTF(0, "\nWARNING: YOU ARE USING AN OLD DEPRECATED PLUGIN INTERFACE!\n"
+                    "DETECTED VERSION %d AND THE CURRENT VERSION IS %d\n"
+                    "PLEASE UPGRADE YOUR PLUGIN!\n", plugin_interface_version, MOST_RECENT_PLUGIN_INTERFACE_VERSION);
+#if SUPPORT_OLD_PLUGIN_VERSIONS
+        OLSR_PRINTF(0, "WILL CONTINUE IN 5 SECONDS...\n\n");      
+        sleep(5);
+#else
+        return -1;
+#endif
     }
-  else
-    {
-      /* new plugin interface */
-      
-      if ( new_entry.plugin_interface_version != OLSRD_PLUGIN_INTERFACE_VERSION ) 
-        {
-          OLSR_PRINTF(0, "\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(), OLSRD_PLUGIN_INTERFACE_VERSION);
-          sleep(5);
-        }
+
+#if SUPPORT_OLD_PLUGIN_VERSIONS
+    /* new plugin interface */      
+    if (plugin_interface_version < LAST_SUPPORTED_PLUGIN_INTERFACE_VERSION) {
+        OLSR_PRINTF(0, "\n\nWARNING: VERSION MISMATCH!\n"
+                    "DETECTED %d AND LAST SUPPORTED VERSION IS %d\n"
+                    "THIS CAN CAUSE UNEXPECTED BEHAVIOUR AND CRASHES!\n"
+                    "WILL CONTINUE IN 5 SECONDS...\n\n", get_interface_version(), LAST_SUPPORTED_PLUGIN_INTERFACE_VERSION);
+        sleep(5);
+    }
+#endif
    
-      /* Fetch the init function */
-      OLSR_PRINTF(1, "Trying to fetch plugin init function... ");
-      if((new_entry.plugin_init = dlsym(new_entry.dlhandle, "olsrd_plugin_init")) == NULL)
-        {
-          OLSR_PRINTF(1, "FAILED: \"%s\"\n", dlerror());
-          dlclose(new_entry.dlhandle);
-          return -1;
-        }
-      else
-       {
-         OLSR_PRINTF(1, "OK\n");
-       }
+    /* Fetch the init function */
+    OLSR_PRINTF(1, "Trying to fetch plugin init function: ");
+    plugin->plugin_init = dlsym(plugin->dlhandle, "olsrd_plugin_init");
+    if (plugin->plugin_init == NULL) {
+        OLSR_PRINTF(0, "FAILED: \"%s\"\n", dlerror());
+        return -1;
     }
-
-  /* Fetch the parameter function */
-  OLSR_PRINTF(1, "Trying to fetch param function... ");
-  if((new_entry.register_param = dlsym(new_entry.dlhandle, "olsrd_plugin_register_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 */
-  init_olsr_plugin(entry);
+    OLSR_PRINTF(1, "Trying to fetch parameter table and it's size... \n");
 
-  /* queue */
-  entry->next = olsr_plugins;
-  olsr_plugins = entry;
+    get_plugin_parameters = dlsym(plugin->dlhandle, "olsrd_get_plugin_parameters");
+    if (get_plugin_parameters != NULL) {
+        (*get_plugin_parameters)(&plugin->plugin_parameters, &plugin->plugin_parameters_size);
+    } else {
+#if SUPPORT_OLD_PLUGIN_VERSIONS
+        /* Fetch the parameter function */
+        OLSR_PRINTF(1, "Trying to fetch param function: ");
 
-  OLSR_PRINTF(0, "---------- LIBRARY LOADED ----------\n\n");
+        plugin->register_param = dlsym(plugin->dlhandle, "olsrd_plugin_register_param");
+        if(plugin->register_param == NULL) {
+            OLSR_PRINTF(1, "FAILED: \"%s\"\n", dlerror());
+        } else {
+            OLSR_PRINTF(1, "OK\n");
+        }
 
-  return 0;
+        plugin->plugin_parameters      = NULL;
+        plugin->plugin_parameters_size = 0;
+#else
+        OLSR_PRINTF(0, "Old plugin interfaces are not supported\n");
+        return -1;
+#endif
+    }
+    return 0;
 }
 
 
@@ -198,42 +235,79 @@ olsr_load_dl(char *libname, struct plugin_param *params)
  *
  *@param entry the plugin to initialize
  *
- *@return nada
+ *@return -1 if there was an error
  */
-void
-init_olsr_plugin(struct olsr_plugin *entry)
+int init_olsr_plugin(struct olsr_plugin *entry)
 {
-  if(entry->register_param)
-    {
-      struct plugin_param *params;
-      OLSR_PRINTF(1, "Sending parameters...\n");
-        for(params = entry->params; params; params = params->next)
-        {
-          int retval = entry->register_param(params->key, params->value);
-          OLSR_PRINTF(1, "\"%s\"/\"%s\"... ", params->key, params->value);
-          if(retval < 0)
-            {
-              fprintf(stderr, "\nFatal error in plugin parameter \"%s\"/\"%s\"\n", params->key, params->value);
-              exit(EXIT_FAILURE);
+    int rv = 0;
+    struct plugin_param *params;
+    OLSR_PRINTF(1, "Sending parameters...\n");
+    for(params = entry->params; params != NULL; params = params->next) {
+        OLSR_PRINTF(1, "\"%s\"/\"%s\"... ", params->key, params->value);
+        if (entry->plugin_parameters_size != 0) {
+            unsigned int i;
+            int rc = 0;
+            for (i = 0; i < entry->plugin_parameters_size; i++) {
+                if (strcasecmp(entry->plugin_parameters[i].name, params->key) == 0) {
+                    /* we have found it! */
+                    rc = entry->plugin_parameters[i].set_plugin_parameter(params->value, entry->plugin_parameters[i].data);
+                    if (rc != 0) {
+                        fprintf(stderr, "\nFatal error in plugin parameter \"%s\"/\"%s\"\n", params->key, params->value);
+                        rv = -1;
+                    }
+                    break;
+                }
+            }
+            if (i >= entry->plugin_parameters_size) {
+                OLSR_PRINTF(0, "Ignored parameter \"%s\"\n", params->key);
+            } else {
+                OLSR_PRINTF(1, "%s: %s\n", params->key, rc == 0 ? "OK" : "FAILED");
+                if (rc != 0) {
+                    rv = -1;
+                }
             }
-          OLSR_PRINTF(1, "%s\n", retval == 0 ? "FAILED" : "OK");
+#if SUPPORT_OLD_PLUGIN_VERSIONS
+        } else if(entry->register_param != NULL) {
+            int rc;
+            OLSR_PRINTF(0, "Registering parameter \"%s\": ", params->key);
+            rc = entry->register_param(params->key, params->value);
+            if(rc < 0) {
+                fprintf(stderr, "\nFatal error in plugin parameter \"%s\"/\"%s\"\n", params->key, params->value);
+                exit(EXIT_FAILURE);
+            }
+            OLSR_PRINTF(0, "%s\n", rc == 0 ? "FAILED" : "OK");
+#endif
+        } else {
+            OLSR_PRINTF(0, "I don't know what to do with \"%s\"!\n", params->key);
+            rv = -1;
         }
     }
-    
-  OLSR_PRINTF(1, "Running plugin_init function...\n");
+
+    OLSR_PRINTF(1, "Running plugin_init function...\n");
     entry->plugin_init();
+    return rv;
 }
 
 
 /**
  *Close all loaded plugins
  */
-void
-olsr_close_plugins(void)
+void olsr_close_plugins(void)
 {
-  struct olsr_plugin *entry;
+    struct olsr_plugin *entry;
 
-  OLSR_PRINTF(1, "Closing plugins...\n");
-  for(entry = olsr_plugins; entry != NULL; entry = entry->next)
-      dlclose(entry->dlhandle);
+    OLSR_PRINTF(0, "Closing plugins...\n");
+    for(entry = olsr_plugins; entry != NULL; entry = entry->next) {
+        dlclose(entry->dlhandle);
+        entry->dlhandle = NULL;
+    }
 }
+
+/*
+ * Local Variables:
+ * mode: c
+ * style: linux
+ * c-basic-offset: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
index c7a9a49..212777f 100644 (file)
  * to the project. For more information see the website or contact
  * the copyright holders.
  *
- * $Id: plugin_loader.h,v 1.16 2007/07/04 01:52:35 ipo23 Exp $
+ * $Id: plugin_loader.h,v 1.17 2007/07/15 19:29:37 bernd67 Exp $
  */
 
 #ifndef _OLSR_PLUGIN_LOADER
 #define _OLSR_PLUGIN_LOADER
 
-#include <dlfcn.h>
-#include <stdio.h>
+#include "olsrd_plugin.h"
 #include "olsr_types.h"
 #include "olsr_cfg.h"
 
 #ifndef OLSR_PLUGIN
 
+/* all */
+typedef int (*plugin_init_func)(void);
+typedef int (*get_interface_version_func)(void);
 
-struct olsr_plugin
-{
-  /* The handle */
-  void *dlhandle;
+#if SUPPORT_OLD_PLUGIN_VERSIONS
+/* version 4 */
+typedef int (*register_param_func)(char *, char *);
+#endif
+
+/* version 5 */
+typedef void (*get_plugin_parameters_func)(const struct olsrd_plugin_parameters **params, unsigned int *size);
+
+
+struct olsr_plugin {
+    /* The handle */
+    void *dlhandle;
   
-  struct plugin_param *params;
-  int plugin_interface_version;
+    struct plugin_param *params;
+    int plugin_interface_version;
   
-  int (*register_param)(char *, char *);
-  int (*plugin_init)(void);
+#if SUPPORT_OLD_PLUGIN_VERSIONS
+    /* version 4 */
+    register_param_func register_param;
+#endif
+    plugin_init_func plugin_init;
+
+    /* version 5 */
+    const struct olsrd_plugin_parameters *plugin_parameters;
+    unsigned int plugin_parameters_size;
   
-  struct olsr_plugin *next;
+    struct olsr_plugin *next;
 };
 
-int
-olsr_load_plugins(void);
+void olsr_load_plugins(void);
 
-void
-olsr_close_plugins(void);
+void olsr_close_plugins(void);
 
-int
-olsr_plugin_io(int, void *, size_t);
+int olsr_plugin_io(int, void *, size_t);
 
 #endif
 #endif
+
+/*
+ * Local Variables:
+ * mode: c
+ * style: linux
+ * c-basic-offset: 4
+ * indent-tabs-mode: nil
+ * End:
+ */