X-Git-Url: http://tinc-vpn.org/git/browse?a=blobdiff_plain;f=src%2Fcontrol.c;h=2fa326a07741460a6f82d9fc90ddb7ccda5bc1bd;hb=8c6131deda546452386f3703af968ee664cadfbd;hp=1481a2d836e39b7b49899d5fa979a24f400f7015;hpb=e9043e17c76f92b787c9ecdaf1a2ae7916f690a6;p=tinc diff --git a/src/control.c b/src/control.c index 1481a2d8..2fa326a0 100644 --- a/src/control.c +++ b/src/control.c @@ -35,15 +35,33 @@ extern char *controlsocketname; static void handle_control_data(int fd, short events, void *event) { char buf[MAXBUFSIZE]; size_t inlen; + char *p; inlen = read(fd, buf, sizeof buf); - if(inlen <= 0) { - logger(LOG_DEBUG, _("Closing control socket")); - event_del(event); - splay_delete(control_socket_tree, event); - close(fd); + if(inlen <= 0) + goto close; + + p = memchr(buf, '\n', sizeof buf); + if(!p || p - buf + 1 != inlen) + goto malformed; + + *p = 0; + + if(!strcasecmp(buf, "stop")) { + logger(LOG_NOTICE, _("Got stop command")); + event_loopexit(NULL); + return; } + +malformed: + logger(LOG_DEBUG, _("Malformed control command received")); + +close: + logger(LOG_DEBUG, _("Closing control socket")); + event_del(event); + splay_delete(control_socket_tree, event); + close(fd); } static void handle_new_control_socket(int fd, short events, void *data) {