From 909cbf302956d75fa872f9a4e54d6a948a99810c Mon Sep 17 00:00:00 2001 From: "C. McEnroe" Date: Tue, 28 Sep 2021 16:18:48 -0400 Subject: Allow backslash line continuation in catsit.conf --- daemon.c | 30 +++++++++++++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) (limited to 'daemon.c') 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)]; -- cgit 1.4.1