Merge branch 'master' of git://tinc-vpn.org/tinc into 1.1
[tinc] / src / control.c
index e3901a6..277f7cb 100644 (file)
 #include "control_common.h"
 #include "graph.h"
 #include "logger.h"
+#include "meta.h"
+#include "net.h"
 #include "protocol.h"
+#include "route.h"
+#include "splay_tree.h"
 #include "utils.h"
 #include "xalloc.h"
 
@@ -92,12 +96,41 @@ bool control_h(connection_t *c, char *request) {
                        int result = reload_configuration();
                        return control_return(c, REQ_RELOAD, result);
 
+               case REQ_DISCONNECT: {
+                       char name[MAX_STRING_SIZE];
+                       connection_t *other;
+                       splay_node_t *node, *next;
+                       bool found = false;
+
+                       if(sscanf(request, "%*d %*d " MAX_STRING, name) != 1)
+                               return control_return(c, REQ_DISCONNECT, -1);
+
+                       for(node = connection_tree->head; node; node = next) {
+                               next = node->next;
+                               other = node->data;
+                               if(strcmp(other->name, name))
+                                       continue;
+                               terminate_connection(other, other->status.active);
+                               found = true;
+                       }
+
+                       return control_return(c, REQ_DISCONNECT, found ? 0 : -2);
+               }
+
+               case REQ_DUMP_TRAFFIC:
+                       return dump_traffic(c);
+
+               case REQ_PCAP:
+                       c->status.pcap = true;
+                       pcap = true;
+                       return true;
+
                default:
                        return send_request(c, "%d %d", CONTROL, REQ_INVALID);
        }
 }
 
-bool init_control() {
+bool init_control(void) {
        randomize(controlcookie, sizeof controlcookie / 2);
        bin2hex(controlcookie, controlcookie, sizeof controlcookie / 2);
        controlcookie[sizeof controlcookie - 1] = 0;
@@ -120,6 +153,6 @@ bool init_control() {
        return true;
 }
 
-void exit_control() {
+void exit_control(void) {
        unlink(controlcookiename);
 }