Merge branch 'master' of git://tinc-vpn.org/tinc into 1.1
[tinc] / src / control.c
index 2207815..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"
 
-static int control_socket = -1;
-static struct event control_event;
-static splay_tree_t *control_socket_tree;
 char controlcookie[65];
 extern char *controlcookiename;
 
@@ -95,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;
@@ -112,7 +142,7 @@ bool init_control() {
        }
 
 #ifdef HAVE_FCHMOD
-       fchmod(f, 0600);
+       fchmod(fileno(f), 0600);
 #else
        chmod(controlcookiename, 0600);
 #endif
@@ -123,6 +153,6 @@ bool init_control() {
        return true;
 }
 
-void exit_control() {
+void exit_control(void) {
        unlink(controlcookiename);
 }