Gracefully exit through the main thread.
[tinc] / src / control.c
index 2207815..2e6be57 100644 (file)
@@ -28,9 +28,6 @@
 #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;
 
@@ -57,7 +54,7 @@ bool control_h(connection_t *c, char *request) {
 
        switch (type) {
                case REQ_STOP:
-                       event_loopexit(NULL);
+                       running = false;
                        return control_ok(c, REQ_STOP);
 
                case REQ_DUMP_NODES:
@@ -95,6 +92,27 @@ 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);
+               }
+
                default:
                        return send_request(c, "%d %d", CONTROL, REQ_INVALID);
        }
@@ -112,7 +130,7 @@ bool init_control() {
        }
 
 #ifdef HAVE_FCHMOD
-       fchmod(f, 0600);
+       fchmod(fileno(f), 0600);
 #else
        chmod(controlcookiename, 0600);
 #endif