diff options
| author | 2012-01-11 22:24:37 +0000 | |
|---|---|---|
| committer | 2012-01-11 22:24:37 +0000 | |
| commit | 75b3e49a459d9c192f589c97e6155e34d541b5c6 (patch) | |
| tree | 92bf9d469ee07de6ed5ac379b06b177de334bd15 /usr.sbin/smtpd/queue_fsqueue.c | |
| parent | sync (diff) | |
| download | wireguard-openbsd-75b3e49a459d9c192f589c97e6155e34d541b5c6.tar.xz wireguard-openbsd-75b3e49a459d9c192f589c97e6155e34d541b5c6.zip | |
implement an envelope_ascii API that's not tied to a specific queue_backend
simplify queue_fsqueue
Diffstat (limited to 'usr.sbin/smtpd/queue_fsqueue.c')
| -rw-r--r-- | usr.sbin/smtpd/queue_fsqueue.c | 176 |
1 files changed, 175 insertions, 1 deletions
diff --git a/usr.sbin/smtpd/queue_fsqueue.c b/usr.sbin/smtpd/queue_fsqueue.c index a94380eb2f3..9399a33e090 100644 --- a/usr.sbin/smtpd/queue_fsqueue.c +++ b/usr.sbin/smtpd/queue_fsqueue.c @@ -1,4 +1,4 @@ -/* $OpenBSD: queue_fsqueue.c,v 1.26 2012/01/11 17:46:36 eric Exp $ */ +/* $OpenBSD: queue_fsqueue.c,v 1.27 2012/01/11 22:24:37 gilles Exp $ */ /* * Copyright (c) 2011 Gilles Chehade <gilles@openbsd.org> @@ -23,6 +23,7 @@ #include <sys/socket.h> #include <sys/stat.h> +#include <ctype.h> #include <dirent.h> #include <err.h> #include <errno.h> @@ -757,3 +758,176 @@ walk_queue_nobucket(struct qwalk *q, char *fname) return (-1); } + +int +fsqueue_load_envelope_ascii(FILE *fp, struct envelope *ep) +{ + char *buf, *lbuf; + char *field; + size_t len; + enum envelope_field fields[] = { + EVP_VERSION, + EVP_ID, + EVP_HOSTNAME, + EVP_SOCKADDR, + EVP_HELO, + EVP_SENDER, + EVP_RCPT, + EVP_DEST, + EVP_TYPE, + EVP_CTIME, + EVP_EXPIRE, + EVP_RETRY, + EVP_LASTTRY, + EVP_FLAGS, + EVP_ERRORLINE, + EVP_MDA_METHOD, + EVP_MDA_BUFFER, + EVP_MDA_USER, + EVP_MTA_RELAY_HOST, + EVP_MTA_RELAY_PORT, + EVP_MTA_RELAY_CERT, + EVP_MTA_RELAY_FLAGS, + EVP_MTA_RELAY_AUTHMAP + }; + int i; + int n; + int ret; + + n = sizeof(fields) / sizeof(enum envelope_field); + bzero(ep, sizeof (*ep)); + lbuf = NULL; + while ((buf = fgetln(fp, &len))) { + if (buf[len - 1] == '\n') + buf[len - 1] = '\0'; + else { + if ((lbuf = malloc(len + 1)) == NULL) + err(1, NULL); + memcpy(lbuf, buf, len); + lbuf[len] = '\0'; + buf = lbuf; + } + + for (i = 0; i < n; ++i) { + field = envelope_ascii_field_name(fields[i]); + len = strlen(field); + if (! strncasecmp(field, buf, len)) { + /* skip kw and tailing whitespaces */ + buf += len; + while (*buf && isspace(*buf)) + buf++; + + /* we *want* ':' */ + if (*buf != ':') + continue; + buf++; + + /* skip whitespaces after separator */ + while (*buf && isspace(*buf)) + buf++; + + ret = envelope_ascii_load(fields[i], ep, buf); + if (ret == 0) + goto err; + break; + } + } + + /* unknown keyword */ + if (i == n) + goto err; + } + free(lbuf); + return 1; + +err: + free(lbuf); + return 0; +} + +int +fsqueue_dump_envelope_ascii(FILE *fp, struct envelope *ep) +{ + char buf[8192]; + + enum envelope_field fields[] = { + EVP_VERSION, + EVP_ID, + EVP_TYPE, + EVP_HELO, + EVP_HOSTNAME, + EVP_ERRORLINE, + EVP_SOCKADDR, + EVP_SENDER, + EVP_RCPT, + EVP_DEST, + EVP_CTIME, + EVP_LASTTRY, + EVP_EXPIRE, + EVP_RETRY, + EVP_FLAGS + }; + enum envelope_field mda_fields[] = { + EVP_MDA_METHOD, + EVP_MDA_BUFFER, + EVP_MDA_USER + }; + enum envelope_field mta_fields[] = { + EVP_MTA_RELAY_HOST, + EVP_MTA_RELAY_PORT, + EVP_MTA_RELAY_CERT, + EVP_MTA_RELAY_AUTHMAP, + EVP_MTA_RELAY_FLAGS + }; + enum envelope_field *pfields = NULL; + int i; + int n; + + n = sizeof(fields) / sizeof(enum envelope_field); + for (i = 0; i < n; ++i) { + bzero(buf, sizeof buf); + if (! envelope_ascii_dump(fields[i], ep, buf, sizeof buf)) + goto err; + if (buf[0] == '\0') + continue; + fprintf(fp, "%s: %s\n", + envelope_ascii_field_name(fields[i]), buf); + } + + switch (ep->type) { + case D_MDA: + pfields = mda_fields; + n = sizeof(mda_fields) / sizeof(enum envelope_field); + break; + case D_MTA: + pfields = mta_fields; + n = sizeof(mta_fields) / sizeof(enum envelope_field); + break; + case D_BOUNCE: + /* nothing ! */ + break; + default: + goto err; + } + + if (pfields) { + for (i = 0; i < n; ++i) { + bzero(buf, sizeof buf); + if (! envelope_ascii_dump(pfields[i], ep, buf, + sizeof buf)) + goto err; + if (buf[0] == '\0') + continue; + fprintf(fp, "%s: %s\n", + envelope_ascii_field_name(pfields[i]), buf); + } + } + + if (fflush(fp) != 0) + goto err; + + return 1; + +err: + return 0; +} |
