Retry connections through control socket
[tinc] / src / control.c
index 7b27f69..6a39e02 100644 (file)
@@ -38,6 +38,7 @@ static void handle_control_data(struct bufferevent *event, void *data) {
        size_t size;
        tinc_ctl_request_t res;
        struct evbuffer *res_data = NULL;
+       void *req_data;
 
        if(EVBUFFER_LENGTH(event->input) < sizeof(tinc_ctl_request_t))
                return;
@@ -47,6 +48,7 @@ static void handle_control_data(struct bufferevent *event, void *data) {
 
        if(EVBUFFER_LENGTH(event->input) < req.length)
                return;
+       req_data = EVBUFFER_DATA(event->input) + sizeof(tinc_ctl_request_t);
 
        if(req.length < sizeof(tinc_ctl_request_t))
                goto failure;
@@ -62,11 +64,72 @@ static void handle_control_data(struct bufferevent *event, void *data) {
        }
 
        if(req.type == REQ_STOP) {
-               logger(LOG_NOTICE, _("Got stop command"));
+               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(debug_t));
+                       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;
+       }
+
        logger(LOG_DEBUG, _("Malformed control command received"));
        res.res_errno = EINVAL;