Update to new avl/list iteration macros
[olsrd.git] / src / plugin_loader.h
index 506c039..5460e5b 100644 (file)
 #include "common/avl.h"
 #include "common/list.h"
 
-#define DEFINE_PLUGIN6(descr, author, pre_init, post_init, pre_cleanup, post_cleanup, deactivate, parameter) \
-static struct olsr_plugin olsr_internal_plugin_definition = { \
-  .p_name = (char*) PLUGIN_FULLNAME , .p_descr = (char*)descr, .p_author = (char*)author, \
-  .p_pre_init = pre_init, .p_post_init = post_init, .p_pre_cleanup = pre_cleanup, .p_post_cleanup = post_cleanup, \
-  .p_legacy_init = NULL, .p_deactivate = deactivate, .p_version = 6, .p_param = parameter, .p_param_cnt = ARRAYSIZE(parameter) \
-}; \
+#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) { \
+  static const char *plname = PLUGIN_FULLNAME; \
+  olsr_internal_plugin_definition.name = plname; \
   olsr_hookup_plugin(&olsr_internal_plugin_definition); \
-}
-
-#define DEFINE_PLUGIN6_NP(descr, author, pre_init, post_init, pre_cleanup, post_cleanup, deactivate) \
-static struct olsr_plugin olsr_internal_plugin_definition = { \
-  .p_name = (char*) PLUGIN_FULLNAME , .p_descr = (char*)descr, .p_author = (char*)author, \
-  .p_pre_init = pre_init, .p_post_init = post_init, .p_pre_cleanup = pre_cleanup, .p_post_cleanup = post_cleanup, \
-  .p_deactivate = deactivate, .p_version = 6, .p_param = NULL, .p_param_cnt = 0 \
-}; \
+} \
+static struct olsr_plugin olsr_internal_plugin_definition =
+
+#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) { \
+  static const char *plname = PLUGIN_FULLNAME; \
+  olsr_internal_plugin_definition.name = plname; \
+  olsr_internal_plugin_definition.internal_param = param; \
+  olsr_internal_plugin_definition.internal_param_cnt = ARRAYSIZE(param); \
   olsr_hookup_plugin(&olsr_internal_plugin_definition); \
-}
+} \
+static struct olsr_plugin olsr_internal_plugin_definition =
+
+enum plugin_type {
+  PLUGIN_TYPE_ALL = -1,
+  PLUGIN_TYPE_DEFAULT = 0,
+  PLUGIN_TYPE_LQ = 1
+};
 
 /* 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 ** params, unsigned int *size);
+typedef void (*get_plugin_parameters_func) (const struct olsrd_plugin_parameters ** internal_params, unsigned int *size);
 
 struct olsr_plugin {
   struct avl_node p_node;
 
   /* plugin information */
-  char *p_name;
-  char *p_descr;
-  char *p_author;
-  bool p_deactivate;    /* plugin can be deactivated */
+  const char *name;
+  const char *descr;
+  const char *author;
+  bool deactivate;    /* plugin can be deactivated */
+  enum plugin_type type;
 
   /* function pointers */
-  bool (*p_pre_init) (void);
-  bool (*p_post_init) (void);
-  bool (*p_pre_cleanup) (void);
-  bool (*p_post_cleanup) (void);
-  int  (*p_legacy_init) (void);
+  bool (*init) (void);
+  bool (*enable) (void);
+  bool (*disable) (void);
+  bool (*exit) (void);
+  int  (*internal_legacy_init) (void);
 
   /* plugin interface version */
-  int p_version;
+  int internal_version;
 
   /* plugin list of possible arguments */
-  const struct olsrd_plugin_parameters *p_param;
+  const struct olsrd_plugin_parameters *internal_param;
 
   /* number of arguments */
-  unsigned int p_param_cnt;
+  unsigned int internal_param_cnt;
 
   /* internal olsr data */
-  void *dlhandle;
-  struct plugin_param *params;
-  bool active;
+  void *internal_dlhandle;
+  struct plugin_param *internal_params;
+  bool internal_active;
 };
 
-AVLNODE2STRUCT(plugin_node2tree, struct olsr_plugin, p_node)
-
-#define OLSR_FOR_ALL_PLUGIN_ENTRIES(plugin) \
-{ \
-  struct avl_node *plugin_node, *next_plugin_node; \
-  for (plugin_node = avl_walk_first(&plugin_tree); \
-    plugin_node; plugin_node = next_plugin_node) { \
-    next_plugin_node = avl_walk_next(plugin_node); \
-    plugin = plugin_node2tree(plugin_node);
-#define OLSR_FOR_ALL_PLUGIN_ENTRIES_END(plugin) }}
+#define OLSR_FOR_ALL_PLUGIN_ENTRIES(plugin, iterator) avl_for_each_element_safe(&plugin_tree, plugin, p_node, iterator)
 
-struct olsr_plugin *EXPORT(olsr_get_plugin)(char *libname);
+struct olsr_plugin *EXPORT(olsr_get_plugin)(const char *libname);
 
 void EXPORT(olsr_hookup_plugin) (struct olsr_plugin *plugin);
 void EXPORT(olsr_unhookup_plugin) (struct olsr_plugin *plugin);
 
-void EXPORT(olsr_init_pluginsystem)(bool);
-void EXPORT(olsr_destroy_pluginsystem)(void);
+void olsr_init_pluginsystem(void);
+void olsr_plugins_init(bool);
+void olsr_plugins_enable(enum plugin_type type, bool fail_fast);
+void olsr_destroy_pluginsystem(void);
 
-struct olsr_plugin *EXPORT(olsr_load_plugin)(char *);
-bool EXPORT(olsr_unload_plugin)(struct olsr_plugin *);
+struct olsr_plugin *EXPORT(olsr_init_plugin)(const char *);
+bool EXPORT(olsr_exit_plugin)(struct olsr_plugin *);
 
-bool EXPORT(olsr_activate_plugin)(struct olsr_plugin *);
-bool EXPORT(olsr_deactivate_plugin)(struct olsr_plugin *);
+bool EXPORT(olsr_enable_plugin)(struct olsr_plugin *);
+bool EXPORT(olsr_disable_plugin)(struct olsr_plugin *);
 
 extern struct avl_tree EXPORT(plugin_tree);