-static int control_socket = -1;
-static struct event control_event;
-static splay_tree_t *control_socket_tree;
-extern char *controlsocketname;
-
-static void handle_control_data(struct bufferevent *event, void *data) {
- tinc_ctl_request_t req;
- tinc_ctl_request_t res;
- struct evbuffer *res_data = NULL;
- void *req_data;
-
- if(EVBUFFER_LENGTH(event->input) < sizeof req)
- return;
-
- /* Copy the structure to ensure alignment */
- memcpy(&req, EVBUFFER_DATA(event->input), sizeof req);
-
- if(EVBUFFER_LENGTH(event->input) < req.length)
- return;
- req_data = EVBUFFER_DATA(event->input) + sizeof req;
-
- if(req.length < sizeof req)
- goto failure;
-
- memset(&res, 0, sizeof res);
- res.type = req.type;
- res.id = req.id;
-
- res_data = evbuffer_new();
- if(res_data == NULL) {
- res.res_errno = ENOMEM;
- goto respond;
- }
-
- if(req.type == REQ_STOP) {
- logger(LOG_NOTICE, _("Got '%s' command"), "stop");
- event_loopexit(NULL);
- goto respond;
- }
-
- if(req.type == REQ_DUMP_NODES) {
- logger(LOG_NOTICE, _("Got '%s' command"), "dump nodes");
- res.res_errno = dump_nodes(res_data);
- goto respond;
- }
-
- if(req.type == REQ_DUMP_EDGES) {
- logger(LOG_NOTICE, _("Got '%s' command"), "dump edges");
- res.res_errno = dump_edges(res_data);
- goto respond;
- }
-
- if(req.type == REQ_DUMP_SUBNETS) {
- logger(LOG_NOTICE, _("Got '%s' command"), "dump subnets");
- res.res_errno = dump_subnets(res_data);
- goto respond;
- }
-
- if(req.type == REQ_DUMP_CONNECTIONS) {
- logger(LOG_NOTICE, _("Got '%s' command"), "dump connections");
- res.res_errno = dump_connections(res_data);
- goto respond;
- }
-
- if(req.type == REQ_DUMP_GRAPH) {
- logger(LOG_NOTICE, _("Got '%s' command"), "dump graph");
- res.res_errno = dump_graph(res_data);
- goto respond;
- }
-
- if(req.type == REQ_PURGE) {
- logger(LOG_NOTICE, _("Got '%s' command"), "purge");
- purge();
- goto respond;
- }
-
- if(req.type == REQ_SET_DEBUG) {
- debug_t new_debug_level;
-
- logger(LOG_NOTICE, _("Got '%s' command"), "debug");
- if(req.length != sizeof req + sizeof debug_level)
- res.res_errno = EINVAL;
- else {
- memcpy(&new_debug_level, req_data, sizeof new_debug_level);
- logger(LOG_NOTICE, _("Changing debug level from %d to %d"),
- debug_level, new_debug_level);
- if(evbuffer_add_printf(res_data,
- _("Changing debug level from %d to %d\n"),
- debug_level, new_debug_level) == -1)
- res.res_errno = errno;
- debug_level = new_debug_level;
- }
- goto respond;
- }
-
- if(req.type == REQ_RETRY) {
- logger(LOG_NOTICE, _("Got '%s' command"), "retry");
- retry();
- goto respond;
- }