#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;
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;
}
#ifdef HAVE_FCHMOD
- fchmod(f, 0600);
+ fchmod(fileno(f), 0600);
#else
chmod(controlcookiename, 0600);
#endif
return true;
}
-void exit_control() {
+void exit_control(void) {
unlink(controlcookiename);
}