From 36491e787c8be5b32b93f5c3b20edd9aa9d4c4e9 Mon Sep 17 00:00:00 2001 From: Laurent Bercot Date: Mon, 2 Feb 2026 18:01:03 +0000 Subject: More qmail-smtpc stuff --- src/qmail-smtpc/qmailr_control.c | 81 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 81 insertions(+) create mode 100644 src/qmail-smtpc/qmailr_control.c (limited to 'src/qmail-smtpc/qmailr_control.c') diff --git a/src/qmail-smtpc/qmailr_control.c b/src/qmail-smtpc/qmailr_control.c new file mode 100644 index 0000000..a46cb22 --- /dev/null +++ b/src/qmail-smtpc/qmailr_control.c @@ -0,0 +1,81 @@ +/* ISC license. */ + +#include +#include + +#include +#include +#include +#include +#include +#include + +#include "qmailr.h" + +#include + +int qmailr_control_read (char const *file, stralloc *sa, size_t *pos) +{ + int fd = openc_readb(file) ; + if (fd == -1) return errno == ENOENT ? (errno = 0, 0) : -1 ; + + char buf[4096] ; + size_t r = allread(fd, buf, 4096) ; + fd_close(fd) ; + if (r == 4096) return (errno = ENAMETOOLONG, -1) ; + if (!r) return 0 ; + if (buf[r-1] == '\n') r-- ; + if (!r) return 0 ; + if (!stralloc_readyplus(sa, r+1)) return -1 ; + *pos = sa->len ; + stralloc_catb(sa, buf, r) ; stralloc_0(sa) ; + return 1 ; +} + +int qmailr_control_readint (char const *file, unsigned int *x, stralloc *sa) +{ + size_t pos ; + int r = qmailr_control_readfile(file, sa, &pos) ; + if (r <= 0) return r ; + sa->len = pos ; + if (!uint0_scan(sa->s + sa->len, x)) return (errno = EPROTO, 0) ; + return 1 ; +} + +int qmailr_control_readiplist (char const *file, stralloc *ip4, stralloc *ip6) +{ + int fd = openc_readb(file) ; + if (fd == -1) return errno == ENOENT ? (errno = 0, 0) : -1 ; + + size_t pos4 = ip4->len, pos6 = ip6->len ; + char buf[4096] ; + buffer b = BUFFER_INIT(&buffer_read, fd, buf, 4096) ; + + for (;;) + { + char line[128] ; + char ip[16] ; + size_t len = 0 ; + int r = getlnmax(&b, line, 127, &len, '\n') ; + if (r == -1) goto err ; + if (!r) break ; + if (!len) continue ; + if (line[len-1] != '\n') line[len++] = '\n' ; + if (ip6_scan(line, ip) == len-1) + { + if (!stralloc_catb(ip6, ip, 16)) goto err ; + } + else if (ip4_scan(line, ip) == len-1) + { + if (!stralloc_catb(ip4, ip, 4)) goto err ; + } + else goto errinval ; + } + return 1 ; + + errinval: + errno = EINVAL ; + err: + ip4->len = pos4 ; ip6->len = pos6 ; + return 0 ; +} -- cgit v1.3.1