From b0f3a76e9bf8ceeab75c1e6f4dce6763aecddc5e Mon Sep 17 00:00:00 2001 From: Guus Sliepen Date: Wed, 1 Aug 2012 15:50:45 +0200 Subject: [PATCH] Add the ability to query configuration variables to tincctl. --- doc/tinc.texi | 5 ++++ doc/tincctl.8.in | 5 ++++ src/tincctl.c | 67 ++++++++++++++++++++++++++++++++---------------- 3 files changed, 55 insertions(+), 22 deletions(-) diff --git a/doc/tinc.texi b/doc/tinc.texi index 40a297a3..b2236b4b 100644 --- a/doc/tinc.texi +++ b/doc/tinc.texi @@ -2044,6 +2044,11 @@ the value of this environment variable is used. Create initial configuration files and RSA and ECDSA keypairs with default length. If no @var{name} for this node is given, it will be asked for. +@item config [get] @var{variable} +Print the current value of configuration variable @var{variable}. +If more than one variable with the same name exists, +the value of each of them will be printed on a separate line. + @item config [set] @var{variable} @var{value} Set configuration variable @var{variable} to the given @var{value}. All previously existing configuration variables with the same name are removed. diff --git a/doc/tincctl.8.in b/doc/tincctl.8.in index 4b6d4263..3ca67534 100644 --- a/doc/tincctl.8.in +++ b/doc/tincctl.8.in @@ -52,6 +52,11 @@ Create initial configuration files and RSA and ECDSA keypairs with default lengt If no .Ar name for this node is given, it will be asked for. +.It config Oo get Oc Ar variable +Print the current value of configuration variable +.Ar variable . +If more than one variable with the same name exists, +the value of each of them will be printed on a separate line. .It config Oo set Oc Ar variable Ar value Set configuration variable .Ar variable diff --git a/src/tincctl.c b/src/tincctl.c index 188db922..64340c7f 100644 --- a/src/tincctl.c +++ b/src/tincctl.c @@ -111,6 +111,7 @@ static void usage(bool status) { "Valid commands are:\n" " init [name] Create initial configuration files.\n" " config Change configuration:\n" + " [get] VARIABLE - print current value of VARIABLE\n" " [set] VARIABLE VALUE - set VARIABLE to VALUE\n" " add VARIABLE VALUE - add VARIABLE with the given VALUE\n" " del VARIABLE [VALUE] - remove VARIABLE [only ones with watching VALUE]\n" @@ -942,7 +943,7 @@ static int cmd_log(int argc, char *argv[]) { } static int cmd_pid(int argc, char *argv[]) { - if(!connect_tincd()) + if(!connect_tincd() && !pid) return 1; printf("%d\n", pid); @@ -1056,8 +1057,10 @@ static int cmd_config(int argc, char *argv[]) { return 1; } - int action = 0; - if(!strcasecmp(argv[1], "add")) { + int action = -2; + if(!strcasecmp(argv[1], "get")) { + argv++, argc--; + } else if(!strcasecmp(argv[1], "add")) { argv++, argc--, action = 1; } else if(!strcasecmp(argv[1], "del")) { argv++, argc--, action = -1; @@ -1109,6 +1112,9 @@ static int cmd_config(int argc, char *argv[]) { return 1; } + if(action < -1 && *value) + action = 0; + /* Some simple checks. */ bool found = false; @@ -1157,8 +1163,8 @@ static int cmd_config(int argc, char *argv[]) { return 1; } - if(!found && action >= 0) { - if(force) { + if(!found) { + if(force || action < 0) { fprintf(stderr, "Warning: %s is not a known configuration variable!\n", variable); } else { fprintf(stderr, "%s: is not a known configuration variable! Use --force to use it anyway.\n", variable); @@ -1190,19 +1196,24 @@ static int cmd_config(int argc, char *argv[]) { } } - char *tmpfile; - xasprintf(&tmpfile, "%s.config.tmp", filename); - FILE *tf = fopen(tmpfile, "w"); - if(!tf) { - fprintf(stderr, "Could not open temporary file %s: %s\n", tmpfile, strerror(errno)); - return 1; + char *tmpfile = NULL; + FILE *tf = NULL; + + if(action >= -1) { + xasprintf(&tmpfile, "%s.config.tmp", filename); + tf = fopen(tmpfile, "w"); + if(!tf) { + fprintf(stderr, "Could not open temporary file %s: %s\n", tmpfile, strerror(errno)); + return 1; + } } - // Copy the file, making modifications on the fly. + // Copy the file, making modifications on the fly, unless we are just getting a value. char buf1[4096]; char buf2[4096]; bool set = false; bool removed = false; + found = false; while(fgets(buf1, sizeof buf1, f)) { buf1[sizeof buf1 - 1] = 0; @@ -1224,8 +1235,12 @@ static int cmd_config(int argc, char *argv[]) { // Did it match? if(!strcasecmp(buf2, variable)) { + // Get + if(action < -1) { + found = true; + printf("%s\n", bvalue); // Del - if(action < 0) { + } else if(action == -1) { if(!*value || !strcasecmp(bvalue, value)) { removed = true; continue; @@ -1245,18 +1260,20 @@ static int cmd_config(int argc, char *argv[]) { } } - // Copy original line... - if(fputs(buf1, tf) < 0) { - fprintf(stderr, "Error writing to temporary file %s: %s\n", tmpfile, strerror(errno)); - return 1; - } - - // Add newline if it is missing... - if(*buf1 && buf1[strlen(buf1) - 1] != '\n') { - if(fputc('\n', tf) < 0) { + if(action >= -1) { + // Copy original line... + if(fputs(buf1, tf) < 0) { fprintf(stderr, "Error writing to temporary file %s: %s\n", tmpfile, strerror(errno)); return 1; } + + // Add newline if it is missing... + if(*buf1 && buf1[strlen(buf1) - 1] != '\n') { + if(fputc('\n', tf) < 0) { + fprintf(stderr, "Error writing to temporary file %s: %s\n", tmpfile, strerror(errno)); + return 1; + } + } } } @@ -1279,6 +1296,12 @@ static int cmd_config(int argc, char *argv[]) { } } + if(action < -1) { + if(!found) + fprintf(stderr, "No matching configuration variables found.\n"); + return 0; + } + // Make sure we wrote everything... if(fclose(tf)) { fprintf(stderr, "Error closing temporary file %s: %s\n", tmpfile, strerror(errno)); -- 2.39.5