diff options
author | June McEnroe <june@causal.agency> | 2021-09-28 16:18:48 -0400 |
---|---|---|
committer | June McEnroe <june@causal.agency> | 2021-09-28 16:18:48 -0400 |
commit | 909cbf302956d75fa872f9a4e54d6a948a99810c (patch) | |
tree | 804cfc8375bab82c588cabe3c372a8a467e3bdd5 /daemon.c | |
parent | Allocate pollfd array rather than using a VLA (diff) | |
download | catsit-909cbf302956d75fa872f9a4e54d6a948a99810c.tar.gz catsit-909cbf302956d75fa872f9a4e54d6a948a99810c.zip |
Allow backslash line continuation in catsit.conf
Diffstat (limited to '')
-rw-r--r-- | daemon.c | 30 |
1 files changed, 29 insertions, 1 deletions
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)]; |