summary refs log tree commit diff
diff options
context:
space:
mode:
authorJune McEnroe <june@causal.agency>2021-09-28 16:18:48 -0400
committerJune McEnroe <june@causal.agency>2021-09-28 16:18:48 -0400
commit909cbf302956d75fa872f9a4e54d6a948a99810c (patch)
tree804cfc8375bab82c588cabe3c372a8a467e3bdd5
parentAllocate pollfd array rather than using a VLA (diff)
downloadcatsit-909cbf302956d75fa872f9a4e54d6a948a99810c.tar.gz
catsit-909cbf302956d75fa872f9a4e54d6a948a99810c.zip
Allow backslash line continuation in catsit.conf
-rw-r--r--catsit.conf.59
-rw-r--r--daemon.c30
2 files changed, 36 insertions, 3 deletions
diff --git a/catsit.conf.5 b/catsit.conf.5
index fc2b769..77b4235 100644
--- a/catsit.conf.5
+++ b/catsit.conf.5
@@ -1,4 +1,4 @@
-.Dd March  1, 2021
+.Dd September 28, 2021
 .Dt CATSIT.CONF 5
 .Os
 .
@@ -13,6 +13,10 @@ file lists the services managed by the
 .Xr catsitd 8
 daemon.
 Leading whitespace is ignored.
+The current line
+can be extended over multiple lines
+using a backslash
+.Pq Ql \e .
 Each line of the file
 is one of the following:
 .
@@ -82,7 +86,8 @@ pounce/tilde	pounce ${0#*/}.conf
 pounce/libera	pounce ${0#*/}.conf
 
 # Privileged services:
-@scooper	kfcgi -d -U $USER -p ~/.local -- /bin/scooper
+@scooper	kfcgi -d -U $USER -p ~/.local -- \e
+		/bin/scooper /share/litterbox/litterbox.sqlite
 .Ed
 .
 .Sh SEE ALSO
diff --git a/daemon.c b/daemon.c
index e4c3145..0086a3d 100644
--- a/daemon.c
+++ b/daemon.c
@@ -49,6 +49,34 @@ static void signalHandler(int signal) {
 	signals[signal] = 1;
 }
 
+static ssize_t getlinecont(char **line, size_t *lcap, FILE *file) {
+	size_t cap = 0;
+	char *buf = NULL;
+	ssize_t llen = getline(line, lcap, file);
+	while (llen > 1 && (*line)[llen - 1] == '\n' && (*line)[llen - 2] == '\\') {
+		llen -= 2;
+		ssize_t len = getline(&buf, &cap, file);
+		if (len < 0) {
+			llen = -1;
+			break;
+		}
+		size_t req = llen + len + 1;
+		if (req > *lcap) {
+			char *ptr = realloc(*line, req);
+			if (!ptr) {
+				llen = -1;
+				break;
+			}
+			*line = ptr;
+			*lcap = req;
+		}
+		strlcpy(*line + llen, buf, *lcap - llen);
+		llen += len;
+	}
+	free(buf);
+	return llen;
+}
+
 static int parseConfig(const char *path) {
 	int ret = -1;
 	size_t cap = 0;
@@ -63,7 +91,7 @@ static int parseConfig(const char *path) {
 	prependClear();
 
 	int line = 1;
-	for (ssize_t len; 0 <= (len = getline(&buf, &cap, file)); ++line) {
+	for (ssize_t len; 0 <= (len = getlinecont(&buf, &cap, file)); ++line) {
 		if (buf[len - 1] == '\n') buf[len - 1] = '\0';
 
 		char *ptr = &buf[strspn(buf, WS)];