summaryrefslogtreecommitdiffstats
path: root/usr.sbin/smtpd/queue_fsqueue.c
diff options
context:
space:
mode:
authorgilles <gilles@openbsd.org>2012-01-11 22:24:37 +0000
committergilles <gilles@openbsd.org>2012-01-11 22:24:37 +0000
commit75b3e49a459d9c192f589c97e6155e34d541b5c6 (patch)
tree92bf9d469ee07de6ed5ac379b06b177de334bd15 /usr.sbin/smtpd/queue_fsqueue.c
parentsync (diff)
downloadwireguard-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.c176
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;
+}