Port all olsrd 0.6.0 OS specific files and adapt them to the new interface.
[olsrd.git] / src / olsr_comport_txt.c
index ac98d30..f20adbd 100644 (file)
  * the copyright holders.
  *
  */
+#include <assert.h>
 #include <string.h>
+#include <stdlib.h>
 
 #include "olsr_cfg.h"
 #include "olsr_logging.h"
 #include "olsr_cookie.h"
 #include "olsr_ip_acl.h"
 #include "olsr.h"
+#include "ipcalc.h"
 #include "scheduler.h"
 #include "olsr_comport.h"
 #include "olsr_comport_txt.h"
 #include "plugin_loader.h"
 
+#define OLSR_FOR_EACH_TXTCMD_ENTRY(cmd, iterator) avl_for_each_element_safe(&txt_normal_tree, cmd, node, iterator.loop, iterator.safe)
+
 struct txt_repeat_data {
   struct timer_entry *timer;
   struct autobuf *buf;
@@ -59,7 +64,10 @@ struct txt_repeat_data {
 };
 
 static struct avl_tree txt_normal_tree, txt_help_tree;
-static struct olsr_cookie_info *txtcommand_cookie, *txt_repeattimer_cookie;
+static struct olsr_cookie_info *txtcommand_cookie;
+static struct olsr_timer_info *txt_repeat_timerinfo;
+
+static void olsr_txt_repeat_timer(void *data);
 
 static enum olsr_txtcommand_result olsr_txtcmd_quit(
     struct comport_connection *con, const char *cmd, const char *param);
@@ -96,10 +104,10 @@ static const char *txt_internal_help[] = {
   "display the online help text\n",
   "switchs the prompt on/off\n",
   "repeat <interval> <command>: repeats a command every <interval> seconds\n",
-  "timeout <interval>: set the timeout interval to <interval> seconds, 0 means no timeout\n"
-  "displays the version of the olsrd\n"
+  "timeout <interval>: set the timeout interval to <interval> seconds, 0 means no timeout\n",
+  "displays the version of the olsrd\n",
   "control olsr plugins dynamically, parameters are 'list', 'activate <plugin>', 'deactivate <plugin>', "
-    "'load <plugin>' and 'unload <plugin>'"
+    "'load <plugin>' and 'unload <plugin>'\n"
 };
 
 static olsr_txthandler txt_internal_handlers[] = {
@@ -120,13 +128,15 @@ void
 olsr_com_init_txt(void) {
   size_t i;
 
-  avl_init(&txt_normal_tree, &avl_comp_strcasecmp);
-  avl_init(&txt_help_tree, &avl_comp_strcasecmp);
+  /* sanity check */
+  assert (ARRAYSIZE(txt_internal_names) == ARRAYSIZE(txt_internal_help));
+
+  avl_init(&txt_normal_tree, &avl_comp_strcasecmp, false, NULL);
+  avl_init(&txt_help_tree, &avl_comp_strcasecmp, false, NULL);
 
-  txtcommand_cookie = olsr_alloc_cookie("comport txt commands", OLSR_COOKIE_TYPE_MEMORY);
-  olsr_cookie_set_memory_size(txtcommand_cookie, sizeof(struct olsr_txtcommand));
+  txtcommand_cookie = olsr_create_memcookie("comport txt commands", sizeof(struct olsr_txtcommand));
 
-  txt_repeattimer_cookie = olsr_alloc_cookie("txt repeat timer", OLSR_COOKIE_TYPE_TIMER);
+  txt_repeat_timerinfo = olsr_alloc_timerinfo("txt repeat timer", olsr_txt_repeat_timer, true);
 
   for (i=0; i < ARRAYSIZE(txt_internal_names); i++) {
     txt_internal_normalcmd[i] = olsr_com_add_normal_txtcommand(txt_internal_names[i], txt_internal_handlers[i]);
@@ -150,7 +160,7 @@ olsr_com_add_normal_txtcommand (const char *command, olsr_txthandler handler) {
   txt->node.key = strdup(command);
   txt->handler = handler;
 
-  avl_insert(&txt_normal_tree, &txt->node, false);
+  avl_insert(&txt_normal_tree, &txt->node);
   return txt;
 }
 
@@ -162,7 +172,7 @@ olsr_com_add_help_txtcommand (const char *command, olsr_txthandler handler) {
   txt->node.key = strdup(command);
   txt->handler = handler;
 
-  avl_insert(&txt_help_tree, &txt->node, false);
+  avl_insert(&txt_help_tree, &txt->node);
   return txt;
 }
 
@@ -185,13 +195,18 @@ olsr_com_handle_txtcommand(struct comport_connection *con, char *cmd, char *para
   ptr = (struct olsr_txtcommand *) avl_find(&txt_normal_tree, cmd);
 
   OLSR_DEBUG(LOG_COMPORT, "Looking for command '%s': %s\n",
-    cmd, ptr ? "unknown" : "available");
+    cmd, ptr == NULL ? "unknown" : "available");
   if (ptr == NULL) {
     return UNKNOWN;
   }
 
   if (ptr->acl) {
     if (!ip_acl_acceptable(ptr->acl, &con->addr, olsr_cnf->ip_version)) {
+#if !defined REMOVE_LOG_DEBUG
+      struct ipaddr_str buf;
+#endif
+      OLSR_DEBUG(LOG_COMPORT, "ACL for command '%s' does not allow access from %s\n",
+        cmd, olsr_ip_to_string(&buf, &con->addr));
       return UNKNOWN;
     }
   }
@@ -303,7 +318,7 @@ void olsr_com_parse_txt(struct comport_connection *con,
   }
 
   /* reset timeout */
-  olsr_change_timer(con->timeout, con->timeout_value, 0, false);
+  olsr_change_timer(con->timeout, con->timeout_value, 0);
 
   /* print prompt */
   if (processedCommand && con->state == INTERACTIVE && con->show_echo) {
@@ -335,25 +350,25 @@ static enum olsr_txtcommand_result
 olsr_txtcmd_help(struct comport_connection *con,
     const char *cmd __attribute__ ((unused)), const char *param) {
   struct olsr_txtcommand *ptr;
+  struct list_iterator iterator;
 
   if (param != NULL) {
-    ptr = (struct olsr_txtcommand *)avl_find(&txt_help_tree, cmd);
+    ptr = avl_find_element(&txt_help_tree, param, ptr, node);
     if (ptr != NULL) {
       return ptr->handler(con, param, NULL);
     }
-    return UNKNOWN;
+    abuf_appendf(&con->out, "No help text found for command: %s\n", param);
+    return CONTINUE;
   }
 
   if (abuf_puts(&con->out, "Known commands:\n") < 0) {
     return ABUF_ERROR;
   }
 
-  ptr = (struct olsr_txtcommand *)avl_walk_first(&txt_normal_tree);
-  while (ptr) {
+  OLSR_FOR_EACH_TXTCMD_ENTRY(ptr, iterator) {
     if (abuf_appendf(&con->out, "  %s\n", (char *)ptr->node.key) < 0) {
       return ABUF_ERROR;
     }
-    ptr = (struct olsr_txtcommand *)avl_walk_next(&ptr->node);
   }
 
   if (abuf_puts(&con->out, "Use 'help <command> to see a help text for a certain command\n") < 0) {
@@ -433,7 +448,7 @@ olsr_txtcmd_repeat(struct comport_connection *con,
 
   interval = atoi(param);
 
-  timer = olsr_start_timer(interval * 1000, 0, true, &olsr_txt_repeat_timer, con, txt_repeattimer_cookie);
+  timer = olsr_start_timer(interval * 1000, 0, con, txt_repeat_timerinfo);
   con->stop_handler = olsr_txt_repeat_stophandler;
   con->stop_data[0] = timer;
   con->stop_data[1] = strdup(ptr);
@@ -465,17 +480,18 @@ olsr_txtcmd_version(struct comport_connection *con,
 static enum olsr_txtcommand_result
 olsr_txtcmd_plugin(struct comport_connection *con, const char *cmd, const char *param) {
   struct olsr_plugin *plugin;
+  struct list_iterator iterator;
   char *para2 = NULL;
   if (param == NULL || strcasecmp(param, "list") == 0) {
     if (abuf_puts(&con->out, "Table:\n") < 0) {
       return ABUF_ERROR;
     }
-    OLSR_FOR_ALL_PLUGIN_ENTRIES(plugin) {
+    OLSR_FOR_ALL_PLUGIN_ENTRIES(plugin, iterator) {
       if (abuf_appendf(&con->out, " %-30s\t%s\t%s\n",
           plugin->name, plugin->internal_active ? "active" : "", plugin->internal_dlhandle == NULL ? "static" : "") < 0) {
         return ABUF_ERROR;
       }
-    } OLSR_FOR_ALL_PLUGIN_ENTRIES_END()
+    }
     return CONTINUE;
   }
 
@@ -494,7 +510,7 @@ olsr_txtcmd_plugin(struct comport_connection *con, const char *cmd, const char *
       abuf_appendf(&con->out, "Plugin %s already loaded\n", para2);
       return CONTINUE;
     }
-    plugin = olsr_load_plugin(para2);
+    plugin = olsr_init_plugin(para2);
     if (plugin != NULL) {
       abuf_appendf(&con->out, "Plugin %s successfully loaded\n", para2);
     }
@@ -514,7 +530,7 @@ olsr_txtcmd_plugin(struct comport_connection *con, const char *cmd, const char *
     if (plugin->internal_active) {
       abuf_appendf(&con->out, "Plugin %s already active\n", para2);
     }
-    else if (olsr_activate_plugin(plugin)) {
+    else if (olsr_enable_plugin(plugin)) {
       abuf_appendf(&con->out, "Could not activate plugin %s\n", para2);
     }
     else {
@@ -525,7 +541,7 @@ olsr_txtcmd_plugin(struct comport_connection *con, const char *cmd, const char *
     if (!plugin->internal_active) {
       abuf_appendf(&con->out, "Plugin %s is not active\n", para2);
     }
-    else if (olsr_deactivate_plugin(plugin)) {
+    else if (olsr_disable_plugin(plugin)) {
       abuf_appendf(&con->out, "Could not deactivate plugin %s\n", para2);
     }
     else {
@@ -536,7 +552,7 @@ olsr_txtcmd_plugin(struct comport_connection *con, const char *cmd, const char *
     if (plugin->internal_dlhandle == NULL) {
       abuf_appendf(&con->out, "Plugin %s is static and cannot be unloaded\n", para2);
     }
-    else if (olsr_unload_plugin(plugin)) {
+    else if (olsr_exit_plugin(plugin)) {
       abuf_appendf(&con->out, "Could not unload plugin %s\n", para2);
     }
     else {