Cleanup of plugin loader (v6) interface
authorHenning Rogge <hrogge@googlemail.com>
Sun, 13 Feb 2011 09:30:57 +0000 (10:30 +0100)
committerHenning Rogge <hrogge@googlemail.com>
Sun, 13 Feb 2011 09:30:57 +0000 (10:30 +0100)
use int as return parameter as usual in unix functions instead of bool

lib/arproaming/src/olsrd_arproaming.c
lib/debuginfo/src/olsrd_debuginfo.c
lib/dot_draw/src/olsrd_dot_draw.c
lib/lq_etx_ff/src/lq_plugin_etx_ff.c
lib/lq_etx_float/src/lq_plugin_etx_float.c
lib/lq_etx_fpm/src/lq_plugin_etx_fpm.c
lib/lq_rfc/src/lq_plugin_rfc.c
lib/obamp/src/olsrd_plugin.c
lib/txtinfo/src/olsrd_txtinfo.c
src/plugin_loader.c
src/plugin_loader.h

index da1582f..fad0ac4 100644 (file)
@@ -60,8 +60,8 @@
 #define PLUGIN_DESCR   "Arproaming olsrd plugin v0.1"
 #define PLUGIN_AUTHOR "amadeus"
 
-static bool arproaming_init(void);
-static bool arproaming_exit(void);
+static int arproaming_init(void);
+static int arproaming_exit(void);
 
 static void arproaming_schedule_event(void *);
 static void arproaming_list_add(unsigned int timeout, const union olsr_ip_addr *ip, const struct olsr_mac48_addr *mac);
@@ -366,7 +366,7 @@ arproaming_schedule_event(void *foo __attribute__ ((unused)))
        arproaming_client_update();
 }
 
-static bool
+static int
 arproaming_init(void)
 {
        int arproaming_socketfd_system = -1;
@@ -381,7 +381,7 @@ arproaming_init(void)
        if (arproaming_socketfd_netlink < 0) {
          OLSR_WARN(LOG_PLUGINS, "Cannot open netlink socket for arproaming plugin: %s (%d)",
              strerror(errno), errno);
-         return true;
+         return 1;
        }
 
        arproaming_socketfd_arp = socket(PF_PACKET, SOCK_PACKET, htons(ETH_P_ARP));
@@ -389,7 +389,7 @@ arproaming_init(void)
     OLSR_WARN(LOG_PLUGINS, "Cannot open raw socket for arproaming plugin: %s (%d)",
         strerror(errno), errno);
          close (arproaming_socketfd_netlink);
-         return true;
+         return 1;
        }
 
        arproaming_socketfd_system = socket(AF_INET, SOCK_DGRAM, 0);
@@ -398,7 +398,7 @@ arproaming_init(void)
         strerror(errno), errno);
     close (arproaming_socketfd_netlink);
     close (arproaming_socketfd_arp);
-    return true;
+    return 1;
   }
 
        arproaming_systemconf(arproaming_socketfd_system);
@@ -407,10 +407,10 @@ arproaming_init(void)
   event_timer = olsr_start_timer(MSEC_PER_SEC/3, 0, NULL, timer_info);
 
        close(arproaming_socketfd_system);
-       return false;
+       return 0;
 }
 
-static bool
+static int
 arproaming_exit(void)
 {
   olsr_stop_timer(event_timer);
@@ -427,5 +427,5 @@ arproaming_exit(void)
 
        OLSR_DEBUG(LOG_PLUGINS, "[ARPROAMING] Exiting.\n");
 
-       return false;
+       return 0;
 }
index 0179b02..7e4fe90 100644 (file)
@@ -71,9 +71,9 @@ struct debuginfo_cmd {
   struct olsr_txtcommand *cmd;
 };
 
-static bool debuginfo_init(void);
-static bool debuginfo_enable(void);
-static bool debuginfo_exit(void);
+static int debuginfo_init(void);
+static int debuginfo_enable(void);
+static int debuginfo_exit(void);
 
 
 static enum olsr_txtcommand_result debuginfo_msgstat(struct comport_connection *con,
@@ -138,7 +138,7 @@ static union olsr_ip_addr total_ip_addr;
 /**
  *Constructor
  */
-static bool
+static int
 debuginfo_init(void)
 {
   ip_acl_init(&allowed_nets);
@@ -148,13 +148,13 @@ debuginfo_init(void)
   current_slot = 0;
 
   memset(&total_ip_addr, 255, sizeof(total_ip_addr));
-  return false;
+  return 0;
 }
 
 /**
  *Destructor
  */
-static bool
+static int
 debuginfo_exit(void)
 {
   size_t i;
@@ -165,10 +165,10 @@ debuginfo_exit(void)
   olsr_parser_remove_function(&olsr_msg_statistics);
   olsr_preprocessor_remove_function(&olsr_packet_statistics);
   ip_acl_flush(&allowed_nets);
-  return false;
+  return 0;
 }
 
-static bool
+static int
 debuginfo_enable(void)
 {
   size_t i;
@@ -205,7 +205,7 @@ debuginfo_enable(void)
 
   olsr_parser_add_function(&olsr_msg_statistics, PROMISCUOUS);
   olsr_preprocessor_add_function(&olsr_packet_statistics);
-  return false;
+  return 0;
 }
 
 static struct debug_msgtraffic *get_msgtraffic_entry(union olsr_ip_addr *ip) {
index 90e9bf6..f37cf6b 100644 (file)
@@ -73,9 +73,9 @@ static int ipc_socket_up;
 #define DOT_DRAW_PORT 2004
 #endif
 
-static bool dotdraw_init(void);
-static bool dotdraw_enable(void);
-static bool dotdraw_exit(void);
+static int dotdraw_init(void);
+static int dotdraw_enable(void);
+static int dotdraw_exit(void);
 
 static int ipc_socket;
 
@@ -122,7 +122,7 @@ static void
 #define ipc_send_str(fd, data) ipc_send((fd), (data), strlen(data))
 
 
-static bool
+static int
 dotdraw_init(void)
 {
   /* defaults for parameters */
@@ -130,20 +130,20 @@ dotdraw_init(void)
   ipc_accept_ip.v4.s_addr = htonl(INADDR_LOOPBACK);
 
   ipc_socket = -1;
-  return false;
+  return 0;
 }
 
 /**
  * destructor - called at unload
  */
-static bool
+static int
 dotdraw_exit(void)
 {
   if (ipc_socket != -1) {
     os_close(ipc_socket);
     ipc_socket = -1;
   }
-  return false;
+  return 0;
 }
 
 
@@ -176,7 +176,7 @@ ipc_print_neigh_link(int ipc_connection, const struct nbr_entry *neighbor)
   }
 }
 
-static bool
+static int
 dotdraw_enable(void) {
   struct sockaddr_in addr;
   uint32_t yes = 1;
@@ -189,19 +189,19 @@ dotdraw_enable(void) {
   ipc_socket = socket(AF_INET, SOCK_STREAM, 0);
   if (ipc_socket == -1) {
     OLSR_WARN(LOG_PLUGINS, "(DOT DRAW)IPC socket %s\n", strerror(errno));
-    return true;
+    return 1;
   }
 
   if (setsockopt(ipc_socket, SOL_SOCKET, SO_REUSEADDR, (char *)&yes, sizeof(yes)) < 0) {
     OLSR_WARN(LOG_PLUGINS, "SO_REUSEADDR failed %s\n", strerror(errno));
     os_close(ipc_socket);
-    return true;
+    return 1;
   }
 #if defined __FreeBSD__ && defined SO_NOSIGPIPE
   if (setsockopt(ipc_socket, SOL_SOCKET, SO_NOSIGPIPE, (char *)&yes, sizeof(yes)) < 0) {
     OLSR_WARN(LOG_PLUGINS, "SO_REUSEADDR failed %s\n", strerror(errno));
     CLOSESOCKET(ipc_socket);
-    return true;
+    return 1;
   }
 #endif
 
@@ -217,20 +217,20 @@ dotdraw_enable(void) {
   if (bind(ipc_socket, (struct sockaddr *)&addr, sizeof(addr)) == -1) {
     OLSR_WARN(LOG_PLUGINS, "(DOT DRAW)IPC bind %s\n", strerror(errno));
     os_close(ipc_socket);
-    return true;
+    return 1;
   }
 
   /* show that we are willing to listen */
   if (listen(ipc_socket, 1) == -1) {
     OLSR_WARN(LOG_PLUGINS, "(DOT DRAW)IPC listen %s\n", strerror(errno));
     os_close(ipc_socket);
-    return true;
+    return 1;
   }
 
-  /* Register with olsrd */
+  /* Register socket with olsrd */
   add_olsr_socket(ipc_socket, &ipc_action, NULL, NULL, SP_PR_READ);
 
-  return false;
+  return 0;
 }
 
 
index 72efa18..e2dce90 100644 (file)
@@ -62,7 +62,7 @@
 
 #define LQ_PLUGIN_RELEVANT_COSTCHANGE_FF 16
 
-static bool lq_etxff_enable(void);
+static int lq_etxff_enable(void);
 
 static void lq_etxff_initialize(void);
 static void lq_etxff_deinitialize(void);
@@ -145,7 +145,8 @@ struct lq_handler lq_etxff_handler = {
   4,4
 };
 
-static bool lq_etxff_enable(void) {
+static int
+lq_etxff_enable(void) {
   active_lq_handler = &lq_etxff_handler;
   return false;
 }
index 275d273..bdcbe8e 100644 (file)
@@ -57,7 +57,7 @@
 #define LQ_QUICKSTART_STEPS        12
 
 static int set_plugin_float(const char *, void *, set_plugin_parameter_addon);
-static bool lq_etxfloat_enable(void);
+static int lq_etxfloat_enable(void);
 
 static olsr_linkcost lq_etxfloat_calc_link_entry_cost(struct link_entry *);
 static olsr_linkcost lq_etxfloat_calc_lq_hello_neighbor_cost(struct lq_hello_neighbor *);
@@ -150,7 +150,8 @@ set_plugin_float(const char *value, void *data, set_plugin_parameter_addon addon
   return 0;
 }
 
-static bool lq_etxfloat_enable(void) {
+static int
+lq_etxfloat_enable(void) {
   active_lq_handler = &lq_etxfloat_handler;
   return false;
 }
index c20d84e..b5da585 100644 (file)
@@ -58,7 +58,7 @@
 #define LQ_FPM_QUICKSTART_AGING    16384       /* 65536 * 0.25 */
 #define LQ_QUICKSTART_STEPS        12
 
-static bool lq_etxfpm_enable(void);
+static int lq_etxfpm_enable(void);
 static int set_plugin_aging(const char *, void *, set_plugin_parameter_addon);
 
 static olsr_linkcost lq_etxfpm_calc_link_entry_cost(struct link_entry *);
@@ -144,7 +144,8 @@ OLSR_PLUGIN6(plugin_parameters) {
 };
 
 
-static bool lq_etxfpm_enable(void) {
+static int
+lq_etxfpm_enable(void) {
   active_lq_handler = &lq_etxfpm_handler;
   return false;
 }
index 0ca9c01..350376b 100644 (file)
@@ -58,7 +58,7 @@
 
 #define LQ_PLUGIN_LC_MULTIPLIER 1024
 
-static bool lq_rfc_enable(void);
+static int lq_rfc_enable(void);
 static int set_plugin_float(const char *, void *, set_plugin_parameter_addon);
 
 static olsr_linkcost lq_rfc_calc_link_entry_cost(struct link_entry *);
@@ -143,7 +143,8 @@ OLSR_PLUGIN6(plugin_parameters) {
   .type = PLUGIN_TYPE_LQ
 };
 
-static bool lq_rfc_enable(void) {
+static int
+lq_rfc_enable(void) {
   active_lq_handler = &lq_rfc_handler;
   return false;
 }
index b5d4984..5c90303 100644 (file)
@@ -61,9 +61,9 @@
 static void __attribute__ ((constructor)) my_init(void);
 static void __attribute__ ((destructor)) my_fini(void);
 
-static bool obamp_init(void);
-static bool obamp_enable(void);
-static bool obamp_disable(void);
+static int obamp_init(void);
+static int obamp_enable(void);
+static int obamp_disable(void);
 
 static const struct olsrd_plugin_parameters plugin_parameters[] = {
   {.name = "NonOlsrIf",.set_plugin_parameter = &AddObampSniffingIf,.data = NULL},
@@ -81,21 +81,19 @@ OLSR_PLUGIN6(plugin_parameters)
 /**
  * Constructor of plugin, called before parameters are initialized
  */
-static bool
+static int
 obamp_init(void)
 {
   PreInitOBAMP();
 
-  //return 0;
-  return false;
+  return 0;
 }
 
-static bool
+static int
 obamp_enable(void)
 {
   olsrd_plugin_init();
 
-  //return 0;
   return false;
 }
 
@@ -104,11 +102,10 @@ obamp_enable(void)
 /**
  * Destructor of plugin
  */
-static bool
+static int
 obamp_disable(void)
 {
-  //return 0;
-  return false;
+  return 0;
 }
 
 
index 46ef3fa..cbae295 100644 (file)
@@ -68,10 +68,10 @@ struct txtinfo_cmd {
   struct olsr_txtcommand *cmd;
 };
 
-static bool txtinfo_init(void);
-static bool txtinfo_enable(void);
-static bool txtinfo_disable(void);
-static bool txtinfo_exit(void);
+static int txtinfo_init(void);
+static int txtinfo_enable(void);
+static int txtinfo_disable(void);
+static int txtinfo_exit(void);
 
 static enum olsr_txtcommand_result txtinfo_neigh(struct comport_connection *con,
     const char *cmd, const char *param);
@@ -232,7 +232,7 @@ static char *values_interface[] = {
 /**
  * Constructor of plugin, called before parameters are initialized
  */
-static bool
+static int
 txtinfo_init(void)
 {
   ip_acl_init(&allowed_nets);
@@ -247,13 +247,13 @@ txtinfo_init(void)
     ip_acl_add(&allowed_nets, (const union olsr_ip_addr *)&in6addr_loopback, 128, false);
     ip_acl_add(&allowed_nets, (const union olsr_ip_addr *)&in6addr_v4mapped_loopback, 128, false);
   }
-  return false;
+  return 0;
 }
 
 /**
  * Destructor of plugin
  */
-static bool
+static int
 txtinfo_disable(void)
 {
   size_t i;
@@ -264,13 +264,13 @@ txtinfo_disable(void)
   for (i=link_keys_static; i<link_keys_count; i++) {
     free(values_link[i]);
   }
-  return false;
+  return 0;
 }
 
 /*
  * Initialization of plugin AFTER parameters have been read
  */
-static bool
+static int
 txtinfo_enable(void)
 {
   size_t i;
@@ -311,13 +311,13 @@ txtinfo_enable(void)
     commands[i].cmd = olsr_com_add_normal_txtcommand(commands[i].name, commands[i].handler);
     commands[i].cmd->acl = &allowed_nets;
   }
-  return false;
+  return 0;
 }
 
-static bool
+static int
 txtinfo_exit(void) {
   ip_acl_flush(&allowed_nets);
-  return false;
+  return 0;
 }
 
 /**
index 29e41ec..4e1b349 100644 (file)
@@ -62,7 +62,7 @@ static bool plugin_tree_initialized = false;
 
 static struct olsr_cookie_info *plugin_mem_cookie = NULL;
 
-static bool olsr_internal_unload_plugin(struct olsr_plugin *plugin, bool cleanup);
+static int olsr_internal_unload_plugin(struct olsr_plugin *plugin, bool cleanup);
 
 /**
  * This function is called by the constructor of a plugin.
@@ -83,15 +83,9 @@ olsr_hookup_plugin(struct olsr_plugin *pl_def) {
   avl_insert(&plugin_tree, &pl_def->p_node);
 }
 
-struct olsr_plugin *olsr_get_plugin(const char *libname) {
-  struct olsr_plugin *plugin;
-  /* SOT: Hacked away the funny plugin check which fails if pathname is included */
-  if (strrchr(libname, '/')) libname = strrchr(libname, '/') + 1;
-
-  plugin = avl_find_element(&plugin_tree, libname, plugin, p_node);
-  return plugin;
-}
-
+/**
+ * Initialize the plugin loader system
+ */
 void
 olsr_init_pluginsystem(void) {
   plugin_mem_cookie = olsr_create_memcookie("Plugin handle", sizeof(struct olsr_plugin));
@@ -103,7 +97,28 @@ olsr_init_pluginsystem(void) {
   }
 }
 
-void olsr_plugins_init(bool fail_fast) {
+/**
+ * Query for a certain plugin name
+ * @param libname name of plugin
+ * @return pointer to plugin db entry, NULL if not found
+ */
+struct olsr_plugin *
+olsr_get_plugin(const char *libname) {
+  struct olsr_plugin *plugin;
+  /* SOT: Hacked away the funny plugin check which fails if pathname is included */
+  if (strrchr(libname, '/')) libname = strrchr(libname, '/') + 1;
+
+  plugin = avl_find_element(&plugin_tree, libname, plugin, p_node);
+  return plugin;
+}
+
+/**
+ * Load plugins and call the init callback
+ * @param fail_fast if true OLSRd will exit if a plugin throws an error
+ *   during initialization
+ */
+void
+olsr_plugins_init(bool fail_fast) {
   struct plugin_entry *entry;
   struct olsr_plugin *plugin;
 
@@ -134,7 +149,14 @@ void olsr_plugins_init(bool fail_fast) {
   }
 }
 
-void olsr_plugins_enable(enum plugin_type type, bool fail_fast) {
+/**
+ * Enables all plugins of a certain type
+ * @param type PLUGIN_TYPE_ALL, PLUGIN_TYPE_LQ or PLUGIN_TYPE_DEFAULT
+ * @param fail_fast if true OLSRd will exit if a plugin throws an error
+ *   by the enable callback
+ */
+void
+olsr_plugins_enable(enum plugin_type type, bool fail_fast) {
   struct olsr_plugin *plugin, *iterator;
 
   /* activate all plugins (configured and static linked ones) */
@@ -154,6 +176,9 @@ void olsr_plugins_enable(enum plugin_type type, bool fail_fast) {
   OLSR_INFO(LOG_PLUGINS, "All plugins loaded.\n");
 }
 
+/**
+ * Disable and unload all plugins
+ */
 void
 olsr_destroy_pluginsystem(void) {
   struct olsr_plugin *plugin, *iterator;
@@ -163,6 +188,12 @@ olsr_destroy_pluginsystem(void) {
   }
 }
 
+/**
+ * Legacy helper function to load plugins using the old API
+ * @param libname name of plugin
+ * @param dlhandle pointer to dynamic library handler
+ * @return plugin db object, NULL if an error happened
+ */
 static struct olsr_plugin *
 olsr_load_legacy_plugin(const char *libname, void *dlhandle) {
   get_interface_version_func get_interface_version;
@@ -222,11 +253,10 @@ olsr_load_legacy_plugin(const char *libname, void *dlhandle) {
 }
 
 /**
- *Try to load a shared library
+ * Load a plugin and call its initialize callback
  *
  *@param libname the name of the library(file)
- *
- *@return dlhandle
+ *@return plugin db object
  */
 struct olsr_plugin *
 olsr_init_plugin(const char *libname)
@@ -266,7 +296,14 @@ olsr_init_plugin(const char *libname)
   return olsr_load_legacy_plugin(libname, dlhandle);
 }
 
-static bool
+/**
+ * Internal helper function to unload a plugin using the old API
+ * @param plugin pointer to plugin db object
+ * @param cleanup true if this is the final cleanup
+ *   before OLSR shuts down, false otherwise
+ * @return 0 if the plugin was removed, 1 otherwise
+ */
+static int
 olsr_internal_unload_plugin(struct olsr_plugin *plugin, bool cleanup) {
   bool legacy = false;
 
@@ -306,24 +343,37 @@ olsr_internal_unload_plugin(struct olsr_plugin *plugin, bool cleanup) {
   return false;
 }
 
-bool
+/**
+ * Unloads an active plugin. Static plugins cannot be removed until
+ * final cleanup.
+ * @param plugin pointer to plugin db object
+ * @return 0 if plugin was removed, 1 otherwise
+ */
+int
 olsr_exit_plugin(struct olsr_plugin *plugin) {
   return olsr_internal_unload_plugin(plugin, false);
 }
 
-bool olsr_enable_plugin(struct olsr_plugin *plugin) {
+
+/**
+ * Enable a loaded plugin.
+ * @param plugin pointer to plugin db object
+ * @return 0 if plugin was enabled, 1 otherwise
+ */
+int
+olsr_enable_plugin(struct olsr_plugin *plugin) {
   struct plugin_param *params;
   unsigned int i;
 
   if (plugin->internal_active) {
     OLSR_DEBUG(LOG_PLUGINS, "Plugin %s is already active.\n", plugin->name);
-    return false;
+    return 0;
   }
 
   if (plugin->init != NULL) {
     if (plugin->init()) {
       OLSR_WARN(LOG_PLUGINS, "Error, pre init failed for plugin %s\n", plugin->name);
-      return true;
+      return 1;
     }
     OLSR_DEBUG(LOG_PLUGINS, "Pre initialization of plugin %s successful\n", plugin->name);
   }
@@ -339,7 +389,7 @@ bool olsr_enable_plugin(struct olsr_plugin *plugin) {
         if (plugin->internal_param[i].set_plugin_parameter(params->value, plugin->internal_param[i].data,
             0 == plugin->internal_param[i].name[0] ? (set_plugin_parameter_addon) params->key : plugin->internal_param[i].addon)) {
           OLSR_DEBUG(LOG_PLUGINS, "Bad plugin parameter \"%s\" = \"%s\"... ", params->key, params->value);
-          return true;
+          return 1;
         }
         break;
       }
@@ -353,14 +403,14 @@ bool olsr_enable_plugin(struct olsr_plugin *plugin) {
   if (plugin->enable != NULL) {
     if (plugin->enable()) {
       OLSR_WARN(LOG_PLUGINS, "Error, post init failed for plugin %s\n", plugin->name);
-      return true;
+      return 1;
     }
     OLSR_DEBUG(LOG_PLUGINS, "Post initialization of plugin %s successful\n", plugin->name);
   }
   if (plugin->internal_legacy_init != NULL) {
     if (plugin->internal_legacy_init() != 1) {
       OLSR_WARN(LOG_PLUGINS, "Error, legacy init failed for plugin %s\n", plugin->name);
-      return true;
+      return 1;
     }
     OLSR_DEBUG(LOG_PLUGINS, "Post initialization of plugin %s successful\n", plugin->name);
   }
@@ -375,26 +425,38 @@ bool olsr_enable_plugin(struct olsr_plugin *plugin) {
         plugin->internal_version != 6 ? "Legacy " : "", plugin->name);
   }
 
-  return false;
+  return 0;
 }
 
-bool olsr_disable_plugin(struct olsr_plugin *plugin) {
+/**
+ * Disable (but not unload) an active plugin
+ * @param plugin pointer to plugin db object
+ * @return 0 if plugin was disabled, 1 otherwise
+ */
+int
+olsr_disable_plugin(struct olsr_plugin *plugin) {
   if (!plugin->internal_active) {
     OLSR_DEBUG(LOG_PLUGINS, "Plugin %s is not active.\n", plugin->name);
-    return false;
+    return 0;
+  }
+
+  if (!plugin->deactivate) {
+    OLSR_DEBUG(LOG_PLUGINS, "Plugin %s does not support disabling\n", plugin->name);
+    return 1;
   }
 
   OLSR_INFO(LOG_PLUGINS, "Deactivating plugin %s\n", plugin->name);
+
   if (plugin->disable != NULL) {
     if (plugin->disable()) {
       OLSR_DEBUG(LOG_PLUGINS, "Plugin %s cannot be deactivated, error in pre cleanup\n", plugin->name);
-      return true;
+      return 1;
     }
     OLSR_DEBUG(LOG_PLUGINS, "Pre cleanup of plugin %s successful\n", plugin->name);
   }
 
   plugin->internal_active = false;
-  return false;
+  return 0;
 }
 
 /*
index 5460e5b..8c2bde4 100644 (file)
 #include "common/avl.h"
 #include "common/list.h"
 
+/*
+ * declare a plugin without parameters (NoParameter)
+ *
+ * OLSR_PLUGIN6_NP() {
+ *   .descr = "<description of the plugin",
+ *   .author = "<author of the plugin",
+ *   .init = <pointer_to_plugin_initialization_callback>,
+ *   .....
+ * };
+ */
 #define OLSR_PLUGIN6_NP()   static struct olsr_plugin olsr_internal_plugin_definition; \
 static void hookup_plugin_definition (void) __attribute__ ((constructor)); \
 static void hookup_plugin_definition (void) { \
@@ -57,6 +67,20 @@ static void hookup_plugin_definition (void) { \
 } \
 static struct olsr_plugin olsr_internal_plugin_definition =
 
+/*
+ * declare a plugin with parameters
+ *
+ * static const struct olsrd_plugin_parameters plugin_parameters[] = {
+ *   { ...},
+ * };
+ *
+ * OLSR_PLUGIN6(plugin_parameters) {
+ *   .descr = "<description of the plugin",
+ *   .author = "<author of the plugin",
+ *   .init = <pointer_to_plugin_initialization_callback>,
+ *   .....
+ * };
+ */
 #define OLSR_PLUGIN6(param) static struct olsr_plugin olsr_internal_plugin_definition; \
 static void hookup_plugin_definition (void) __attribute__ ((constructor)); \
 static void hookup_plugin_definition (void) { \
@@ -68,13 +92,14 @@ static void hookup_plugin_definition (void) { \
 } \
 static struct olsr_plugin olsr_internal_plugin_definition =
 
+/* different types of plugins must be initialized at different times during startup */
 enum plugin_type {
   PLUGIN_TYPE_ALL = -1,
   PLUGIN_TYPE_DEFAULT = 0,
   PLUGIN_TYPE_LQ = 1
 };
 
-/* version 5 */
+/* plugin definition functions (version 5) */
 typedef int (*plugin_init_func) (void);
 typedef int (*get_interface_version_func) (void);
 typedef void (*get_plugin_parameters_func) (const struct olsrd_plugin_parameters ** internal_params, unsigned int *size);
@@ -86,15 +111,24 @@ struct olsr_plugin {
   const char *name;
   const char *descr;
   const char *author;
-  bool deactivate;    /* plugin can be deactivated */
+
+  /* true if the plugin can be (de)activated during runtime */
+  bool deactivate;
+
+  /* type of the plugin, normally 0 */
   enum plugin_type type;
 
-  /* function pointers */
-  bool (*init) (void);
-  bool (*enable) (void);
-  bool (*disable) (void);
-  bool (*exit) (void);
-  int  (*internal_legacy_init) (void);
+  /* plugin callbacks for (de)initialization */
+  int (*init) (void);
+  int (*enable) (void);
+  int (*disable) (void);
+  int (*exit) (void);
+
+  /*
+   * internal callback pointer for legacy plugins, will be initialized
+   * by the plugin loader
+   */
+  int (*internal_legacy_init) (void);
 
   /* plugin interface version */
   int internal_version;
@@ -124,10 +158,10 @@ void olsr_plugins_enable(enum plugin_type type, bool fail_fast);
 void olsr_destroy_pluginsystem(void);
 
 struct olsr_plugin *EXPORT(olsr_init_plugin)(const char *);
-bool EXPORT(olsr_exit_plugin)(struct olsr_plugin *);
+int EXPORT(olsr_exit_plugin)(struct olsr_plugin *);
 
-bool EXPORT(olsr_enable_plugin)(struct olsr_plugin *);
-bool EXPORT(olsr_disable_plugin)(struct olsr_plugin *);
+int EXPORT(olsr_enable_plugin)(struct olsr_plugin *);
+int EXPORT(olsr_disable_plugin)(struct olsr_plugin *);
 
 extern struct avl_tree EXPORT(plugin_tree);