From: Guus Sliepen <guus@tinc-vpn.org>
Date: Sun, 15 Jul 2012 18:37:38 +0000 (+0200)
Subject: Add an easy way to edit a configuration file.
X-Git-Tag: import-tinc-1.1~362
X-Git-Url: https://git.meshlink.io/?a=commitdiff_plain;h=eb01fd96258e5f99be0e4930eac04e5487a108a0;p=meshlink

Add an easy way to edit a configuration file.
---

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},
 };