Add cleanup code for html/telnet server
authorHenning Rogge <hrogge@googlemail.com>
Sun, 5 Jul 2009 16:32:20 +0000 (18:32 +0200)
committerHenning Rogge <hrogge@googlemail.com>
Sun, 5 Jul 2009 16:32:20 +0000 (18:32 +0200)
src/main.c
src/olsr_comport.c
src/olsr_comport.h
src/olsr_comport_http.c
src/olsr_comport_http.h
src/olsr_comport_txt.c
src/olsr_comport_txt.h

index 62a7370..f437829 100644 (file)
@@ -492,6 +492,9 @@ olsr_shutdown(void)
 
   OLSR_INFO(LOG_MAIN, "Closing sockets...\n");
 
+  /* kill http/telnet server */
+  olsr_com_destroy();
+
   /* Flush duplicate set */
   olsr_flush_duplicate_entries();
 
index 5b796af..0f653a1 100644 (file)
@@ -56,6 +56,7 @@
 #include "olsr_cookie.h"
 #include "common/autobuf.h"
 #include "common/avl.h"
+#include "common/list.h"
 #include "ipcalc.h"
 #include "olsr.h"
 #include "olsr_comport_http.h"
@@ -68,6 +69,8 @@
 #define MAX_HTTP_PARA 10
 #define COMPORT_MAX_INPUTBUFFER 65536
 
+struct list_node olsr_comport_head;
+
 /* server socket */
 static int comsocket_http = 0;
 static int comsocket_txt = 0;
@@ -120,10 +123,24 @@ void olsr_com_init(void) {
   connection_http_count = 0;
   connection_txt_count = 0;
 
+  list_head_init(&olsr_comport_head);
+
   olsr_com_init_http();
   olsr_com_init_txt();
 }
 
+void olsr_com_destroy(void) {
+  while (!list_is_empty(&olsr_comport_head)) {
+    struct comport_connection *con;
+
+    con = comport_node2con(olsr_comport_head.next);
+    olsr_com_cleanup_session(con);
+  }
+
+  olsr_com_destroy_http();
+  olsr_com_destroy_txt();
+}
+
 void olsr_com_activate_output(struct comport_connection *con) {
   enable_olsr_socket(con->fd, &olsr_com_parse_connection, NULL, SP_PR_WRITE);
 }
@@ -253,6 +270,8 @@ static void olsr_com_parse_request(int fd, void *data __attribute__ ((unused)),
 
   add_olsr_socket(sock, &olsr_com_parse_connection, NULL, con, SP_PR_READ
       | SP_PR_WRITE);
+
+  list_add_after(&olsr_comport_head, &con->node);
 }
 
 static void olsr_com_cleanup_session(struct comport_connection *con) {
@@ -262,6 +281,8 @@ static void olsr_com_cleanup_session(struct comport_connection *con) {
     connection_txt_count--;
   }
 
+  list_remove(&con->node);
+
   if (con->stop_handler) {
     con->stop_handler(con);
   }
index f06b028..39c288b 100644 (file)
@@ -43,6 +43,7 @@
 
 #include "defs.h"
 #include "common/autobuf.h"
+#include "common/list.h"
 
 enum http_header_type {
   PLAIN,
@@ -92,6 +93,7 @@ struct comport_connection {
   /*
    * internal part of the server
    */
+  struct list_node node;
   int fd;
   enum connection_state state;
   enum http_header_type send_as;
@@ -100,7 +102,11 @@ struct comport_connection {
   struct autobuf in;
 };
 
+LISTNODE2STRUCT(comport_node2con, struct comport_connection, node);
+
 void olsr_com_init(void);
+void olsr_com_destroy(void);
+
 void EXPORT(olsr_com_activate_output) (struct comport_connection *con);
 
 #endif /* OLSR_COMPORT_H_ */
index 1cdee83..4c4ca93 100644 (file)
@@ -50,8 +50,8 @@
 
 #define HTTP_VERSION "HTTP/1.1"
 
-static struct avl_tree http_handler_tree;
 static struct olsr_cookie_info *htmlsite_cookie;
+struct avl_tree http_handler_tree;
 
 /**Response types */
 static char http_200_response[] = "OK";
@@ -85,6 +85,13 @@ olsr_com_init_http(void) {
   init_test();
 }
 
+void olsr_com_destroy_http(void) {
+  struct olsr_html_site *site;
+  OLSR_FOR_ALL_HTML_ENTRIES(site) {
+    olsr_com_remove_htmlsite(site);
+  } OLSR_FOR_ALL_HTML_ENTRIES_END(site)
+}
+
 struct olsr_html_site *
 olsr_com_add_htmlsite(char *path, char *content, size_t length) {
   struct olsr_html_site *site;
index 45c0bc9..d690bcc 100644 (file)
@@ -66,7 +66,19 @@ struct olsr_html_site {
   void (*sitehandler)(struct autobuf *buf, char *path, int parameter_count, char *parameters[]);
 };
 
+AVLNODE2STRUCT(html_tree2site, struct olsr_html_site, node);
+
+#define OLSR_FOR_ALL_HTML_ENTRIES(site) \
+{ \
+  struct avl_node *site_node, *next_site_node; \
+  for (site_node = avl_walk_first(&http_handler_tree); \
+    site_node; site_node = next_site_node) { \
+    next_site_node = avl_walk_next(site_node); \
+    site = html_tree2site(site_node);
+#define OLSR_FOR_ALL_HTML_ENTRIES_END(site) }}
+
 void olsr_com_init_http(void);
+void olsr_com_destroy_http(void);
 
 struct olsr_html_site *EXPORT(olsr_com_add_htmlsite) (
     char *path, char *content, size_t length);
@@ -85,4 +97,6 @@ void EXPORT(olsr_com_create_httperror) (struct comport_connection *con);
 char *EXPORT(olsr_com_get_http_message) (enum http_header_type type);
 void EXPORT(olsr_com_decode_url) (char *str);
 
+extern struct avl_tree EXPORT(http_handler_tree);
+
 #endif /* OLSR_COMPORT_HTTP_H_ */
index c8e4c8d..4ac53eb 100644 (file)
@@ -118,7 +118,8 @@ static olsr_txthandler txt_internal_handlers[] = {
   olsr_txtcmd_plugin
 };
 
-void olsr_com_init_txt(void) {
+void
+olsr_com_init_txt(void) {
   size_t i;
 
   avl_init(&txt_normal_tree, &avl_comp_strcasecmp);
@@ -137,6 +138,24 @@ void olsr_com_init_txt(void) {
   }
 }
 
+void
+olsr_com_destroy_txt(void) {
+  struct olsr_txtcommand *cmd;
+  struct avl_node *node;
+
+  while ((node = avl_walk_first(&txt_normal_tree)) != NULL) {
+    cmd = txt_tree2cmd(node);
+    olsr_com_remove_normal_txtcommand(cmd);
+  }
+  while ((node = avl_walk_first(&txt_csv_tree)) != NULL) {
+    cmd = txt_tree2cmd(node);
+    olsr_com_remove_csv_txtcommand(cmd);
+  }
+  while ((node = avl_walk_first(&txt_help_tree)) != NULL) {
+    cmd = txt_tree2cmd(node);
+    olsr_com_remove_help_txtcommand(cmd);
+  }
+}
 struct olsr_txtcommand *
 olsr_com_add_normal_txtcommand (const char *command, olsr_txthandler handler) {
   struct olsr_txtcommand *txt;
index 224819e..53ef06f 100644 (file)
@@ -65,8 +65,10 @@ struct olsr_txtcommand {
   olsr_txthandler handler;
 };
 
+AVLNODE2STRUCT(txt_tree2cmd, struct olsr_txtcommand, node);
 
 void olsr_com_init_txt(void);
+void olsr_com_destroy_txt(void);
 
 struct olsr_txtcommand *EXPORT(olsr_com_add_normal_txtcommand) (
     const char *command, olsr_txthandler handler);