Add LogLevel config option
[tinc] / src / tincctl.c
index 5067ded..0309cd4 100644 (file)
@@ -74,6 +74,9 @@ bool netnamegiven = false;
 char *scriptinterpreter = NULL;
 char *scriptextension = "";
 static char *prompt;
+char *device = NULL;
+char *iface = NULL;
+int debug_level = -1;
 
 static struct option const long_options[] = {
        {"batch", no_argument, NULL, 'b'},
@@ -89,7 +92,7 @@ static struct option const long_options[] = {
 static void version(void) {
        printf("%s version %s (built %s %s, protocol %d.%d)\n", PACKAGE,
                   BUILD_VERSION, BUILD_DATE, BUILD_TIME, PROT_MAJOR, PROT_MINOR);
-       printf("Copyright (C) 1998-2016 Ivo Timmermans, Guus Sliepen and others.\n"
+       printf("Copyright (C) 1998-2017 Ivo Timmermans, Guus Sliepen and others.\n"
                        "See the AUTHORS file for a complete list.\n\n"
                        "tinc comes with ABSOLUTELY NO WARRANTY.  This is free software,\n"
                        "and you are welcome to redistribute it under certain conditions;\n"
@@ -510,7 +513,7 @@ bool recvline(int fd, char *line, size_t len) {
        char *newline = NULL;
 
        if(!fd)
-               abort();
+               return false;
 
        while(!(newline = memchr(buffer, '\n', blen))) {
                int result = recv(fd, buffer + blen, sizeof buffer - blen, 0);
@@ -800,7 +803,7 @@ bool connect_tincd(bool verbose) {
        char data[4096];
        int version;
 
-       if(!recvline(fd, line, sizeof line) || sscanf(line, "%d %s %d", &code, data, &version) != 3 || code != 0) {
+       if(!recvline(fd, line, sizeof line) || sscanf(line, "%d %4095s %d", &code, data, &version) != 3 || code != 0) {
                if(verbose)
                        fprintf(stderr, "Cannot read greeting from control socket: %s\n", sockstrerror(sockerrno));
                close(fd);
@@ -948,11 +951,11 @@ static int cmd_stop(int argc, char *argv[]) {
        if(!connect_tincd(true)) {
                if(pid) {
                        if(kill(pid, SIGTERM)) {
-                               fprintf(stderr, "Could not send TERM signal to process with PID %u: %s\n", pid, strerror(errno));
+                               fprintf(stderr, "Could not send TERM signal to process with PID %d: %s\n", pid, strerror(errno));
                                return 1;
                        }
 
-                       fprintf(stderr, "Sent TERM signal to process with PID %u.\n", pid);
+                       fprintf(stderr, "Sent TERM signal to process with PID %d.\n", pid);
                        waitpid(pid, NULL, 0);
                        return 0;
                }
@@ -1027,7 +1030,6 @@ static int dump_invitations(void) {
                FILE *f = fopen(fname, "r");
                if(!f) {
                        fprintf(stderr, "Cannot open %s: %s\n", fname, strerror(errno));
-                       fclose(f);
                        continue;
                }
 
@@ -1116,7 +1118,7 @@ static int cmd_dump(int argc, char *argv[]) {
 
        while(recvline(fd, line, sizeof line)) {
                char node1[4096], node2[4096];
-               int n = sscanf(line, "%d %d %s %s", &code, &req, node1, node2);
+               int n = sscanf(line, "%d %d %4095s %4095s", &code, &req, node1, node2);
                if(n == 2) {
                        if(do_graph && req == REQ_DUMP_NODES)
                                continue;
@@ -1148,7 +1150,7 @@ static int cmd_dump(int argc, char *argv[]) {
 
                switch(req) {
                        case REQ_DUMP_NODES: {
-                               int n = sscanf(line, "%*d %*d %s %s %s port %s %d %d %d %d %x %x %s %s %d %hd %hd %hd %ld", node, id, host, port, &cipher, &digest, &maclength, &compression, &options, &status_int, nexthop, via, &distance, &pmtu, &minmtu, &maxmtu, &last_state_change);
+                               int n = sscanf(line, "%*d %*d %4095s %4095s %4095s port %4095s %d %d %d %d %x %x %4095s %4095s %d %hd %hd %hd %ld", node, id, host, port, &cipher, &digest, &maclength, &compression, &options, &status_int, nexthop, via, &distance, &pmtu, &minmtu, &maxmtu, &last_state_change);
                                if(n != 17) {
                                        fprintf(stderr, "Unable to parse node dump from tincd: %s\n", line);
                                        return 1;
@@ -1178,7 +1180,7 @@ static int cmd_dump(int argc, char *argv[]) {
                        } break;
 
                        case REQ_DUMP_EDGES: {
-                               int n = sscanf(line, "%*d %*d %s %s %s port %s %s port %s %x %d", from, to, host, port, local_host, local_port, &options, &weight);
+                               int n = sscanf(line, "%*d %*d %4095s %4095s %4095s port %4095s %4095s port %4095s %x %d", from, to, host, port, local_host, local_port, &options, &weight);
                                if(n != 8) {
                                        fprintf(stderr, "Unable to parse edge dump from tincd.\n");
                                        return 1;
@@ -1196,7 +1198,7 @@ static int cmd_dump(int argc, char *argv[]) {
                        } break;
 
                        case REQ_DUMP_SUBNETS: {
-                               int n = sscanf(line, "%*d %*d %s %s", subnet, node);
+                               int n = sscanf(line, "%*d %*d %4095s %4095s", subnet, node);
                                if(n != 2) {
                                        fprintf(stderr, "Unable to parse subnet dump from tincd.\n");
                                        return 1;
@@ -1205,7 +1207,7 @@ static int cmd_dump(int argc, char *argv[]) {
                        } break;
 
                        case REQ_DUMP_CONNECTIONS: {
-                               int n = sscanf(line, "%*d %*d %s %s port %s %x %d %x", node, host, port, &options, &socket, &status_int);
+                               int n = sscanf(line, "%*d %*d %4095s %4095s port %4095s %x %d %x", node, host, port, &options, &socket, &status_int);
                                if(n != 6) {
                                        fprintf(stderr, "Unable to parse connection dump from tincd.\n");
                                        return 1;
@@ -1488,9 +1490,11 @@ const var_t variables[] = {
        {"Hostnames", VAR_SERVER},
        {"IffOneQueue", VAR_SERVER},
        {"Interface", VAR_SERVER},
+       {"InvitationExpire", VAR_SERVER},
        {"KeyExpire", VAR_SERVER},
        {"ListenAddress", VAR_SERVER | VAR_MULTIPLE},
        {"LocalDiscovery", VAR_SERVER},
+       {"LogLevel", VAR_SERVER},
        {"MACExpire", VAR_SERVER},
        {"MaxConnectionBurst", VAR_SERVER},
        {"MaxOutputBufferSize", VAR_SERVER},
@@ -2230,7 +2234,7 @@ static int cmd_import(int argc, char *argv[]) {
        bool firstline = true;
 
        while(fgets(buf, sizeof buf, in)) {
-               if(sscanf(buf, "Name = %s", name) == 1) {
+               if(sscanf(buf, "Name = %4095s", name) == 1) {
                        firstline = false;
 
                        if(!check_id(name)) {
@@ -2722,7 +2726,7 @@ static char *complete_info(const char *text, int state) {
 
        while(recvline(fd, line, sizeof line)) {
                char item[4096];
-               int n = sscanf(line, "%d %d %s", &code, &req, item);
+               int n = sscanf(line, "%d %d %4095s", &code, &req, item);
                if(n == 2) {
                        i++;
                        if(i >= 2)
@@ -2823,8 +2827,6 @@ static int cmd_shell(int argc, char *argv[]) {
 
                while(p && *p) {
                        if(nargc >= maxargs) {
-                               fprintf(stderr, "next %p '%s', p %p '%s'\n", next, next, p, p);
-                               abort();
                                maxargs *= 2;
                                nargv = xrealloc(nargv, maxargs * sizeof *nargv);
                        }