From eb01fd96258e5f99be0e4930eac04e5487a108a0 Mon Sep 17 00:00:00 2001 From: Guus Sliepen Date: Sun, 15 Jul 2012 20:37:38 +0200 Subject: [PATCH] Add an easy way to edit a configuration file. --- doc/tinc.texi | 4 ++++ doc/tincctl.8.in | 3 +++ src/tincctl.c | 54 ++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 61 insertions(+) diff --git a/doc/tinc.texi b/doc/tinc.texi index 2dbfdfb5..66300eae 100644 --- a/doc/tinc.texi +++ b/doc/tinc.texi @@ -2056,6 +2056,10 @@ As above, but without removing any previously existing configuration variables. Remove configuration variables with the same name and @var{value}. If no @var{value} is given, all configuration variables with the same name will be removed. +@item edit @var{filename} +Start an editor for the given configuration file. +You do not need to specify the full path to the file. + @item start Start @samp{tincd}. diff --git a/doc/tincctl.8.in b/doc/tincctl.8.in index 9f11e118..8a9bfcdd 100644 --- a/doc/tincctl.8.in +++ b/doc/tincctl.8.in @@ -68,6 +68,9 @@ Remove configuration variables with the same name and If no .Ar value is given, all configuration variables with the same name will be removed. +.It edit Ar filename +Start an editor for the given configuration file. +You do not need to specify the full path to the file. .It start Start .Xr tincd 8 . diff --git a/src/tincctl.c b/src/tincctl.c index 523bbb4e..6725b8b2 100644 --- a/src/tincctl.c +++ b/src/tincctl.c @@ -1269,6 +1269,59 @@ static int cmd_version(int argc, char *argv[]) { return 0; } +static const char *conffiles[] = { + "tinc.conf", + "tinc-up", + "tinc-down", + "subnet-up", + "subnet-down", + "host-up", + "host-down", + NULL, +}; + +static int cmd_edit(int argc, char *argv[]) { + if(argc != 2) { + fprintf(stderr, "Invalid number of arguments.\n"); + return 1; + } + + char *filename = NULL; + + if(strncmp(argv[1], "hosts/", 6)) { + for(int i = 0; conffiles[i]; i++) { + if(!strcmp(argv[1], conffiles[i])) { + xasprintf(&filename, "%s/%s", confbase, argv[1]); + break; + } + } + } else { + argv[1] += 6; + } + + if(!filename) { + xasprintf(&filename, "%s/%s", hosts_dir, argv[1]); + char *dash = strchr(argv[1], '-'); + if(dash) { + *dash++ = 0; + if((strcmp(dash, "up") && strcmp(dash, "down")) || !check_id(argv[1])) { + fprintf(stderr, "Invalid configuration filename.\n"); + return 1; + } + } + } + +#ifndef HAVE_MINGW + char *editor = getenv("VISUAL") ?: getenv("EDITOR") ?: "vi"; +#else + char *editor = "edit" +#endif + + char *command; + xasprintf(&command, "\"%s\" \"%s\"", editor, filename); + return system(command); +} + static const struct { const char *command; int (*function)(int argc, char *argv[]); @@ -1294,6 +1347,7 @@ static const struct { {"generate-ecdsa-keys", cmd_generate_ecdsa_keys}, {"help", cmd_help}, {"version", cmd_version}, + {"edit", cmd_edit}, {NULL, NULL}, }; -- 2.39.5