summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorchl <chl@openbsd.org>2012-08-19 10:32:32 +0000
committerchl <chl@openbsd.org>2012-08-19 10:32:32 +0000
commit046adb15fee675cf210158e06180f9f4146fcade (patch)
treeeed287b67b275cb6d3d329e86e0885e56b8c3f00
parentAdd warnings on io errors to help diagnosis. (diff)
downloadwireguard-openbsd-046adb15fee675cf210158e06180f9f4146fcade.tar.xz
wireguard-openbsd-046adb15fee675cf210158e06180f9f4146fcade.zip
Kill envelope_{dump,load}_file() and replace them with envelope_{dump,load}_buffer().
with input from eric@ ok eric@
-rw-r--r--usr.sbin/smtpd/envelope.c70
-rw-r--r--usr.sbin/smtpd/queue_fsqueue.c69
-rw-r--r--usr.sbin/smtpd/smtpd.h6
3 files changed, 81 insertions, 64 deletions
diff --git a/usr.sbin/smtpd/envelope.c b/usr.sbin/smtpd/envelope.c
index 6cbb2c8e923..ce0bc6d3917 100644
--- a/usr.sbin/smtpd/envelope.c
+++ b/usr.sbin/smtpd/envelope.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: envelope.c,v 1.6 2012/06/03 19:52:56 eric Exp $ */
+/* $OpenBSD: envelope.c,v 1.7 2012/08/19 10:32:32 chl Exp $ */
/*
* Copyright (c) 2011 Gilles Chehade <gilles@openbsd.org>
@@ -90,11 +90,8 @@ envelope_set_errormsg(struct envelope *e, char *fmt, ...)
}
int
-envelope_load_file(struct envelope *ep, FILE *fp)
+envelope_load_buffer(struct envelope *ep, char *buf, size_t buflen)
{
- char *buf, *lbuf;
- char *field;
- size_t len;
enum envelope_field fields[] = {
EVP_VERSION,
EVP_ID,
@@ -121,24 +118,20 @@ envelope_load_file(struct envelope *ep, FILE *fp)
EVP_MTA_RELAY_FLAGS,
EVP_MTA_RELAY_AUTHMAP
};
- int i;
- int n;
- int ret;
+ char *field, *nextline;
+ size_t len;
+ 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;
- }
+ while (buflen > 0) {
+ len = strcspn(buf, "\n");
+ buf[len] = '\0';
+ nextline = buf + len + 1;
+ buflen -= (nextline - buf);
for (i = 0; i < n; ++i) {
field = envelope_ascii_field_name(fields[i]);
len = strlen(field);
@@ -160,6 +153,7 @@ envelope_load_file(struct envelope *ep, FILE *fp)
ret = envelope_ascii_load(fields[i], ep, buf);
if (ret == 0)
goto err;
+ buf = nextline;
break;
}
}
@@ -168,16 +162,14 @@ envelope_load_file(struct envelope *ep, FILE *fp)
if (i == n)
goto err;
}
- free(lbuf);
- return 1;
+ return (1);
err:
- free(lbuf);
- return 0;
+ return (0);
}
int
-envelope_dump_file(struct envelope *ep, FILE *fp)
+envelope_dump_buffer(struct envelope *ep, char *dest, size_t len)
{
char buf[8192];
@@ -211,9 +203,10 @@ envelope_dump_file(struct envelope *ep, FILE *fp)
EVP_MTA_RELAY_FLAGS
};
enum envelope_field *pfields = NULL;
- int i;
- int n;
+ int i, n, l;
+ char *p;
+ p = dest;
n = sizeof(fields) / sizeof(enum envelope_field);
for (i = 0; i < n; ++i) {
bzero(buf, sizeof buf);
@@ -221,8 +214,13 @@ envelope_dump_file(struct envelope *ep, FILE *fp)
goto err;
if (buf[0] == '\0')
continue;
- fprintf(fp, "%s: %s\n",
- envelope_ascii_field_name(fields[i]), buf);
+
+ l = snprintf(dest, len, "%s: %s\n",
+ envelope_ascii_field_name(fields[i]), buf);
+ if (l == -1 || (size_t) l >= len)
+ goto err;
+ dest += l;
+ len -= l;
}
switch (ep->type) {
@@ -249,18 +247,20 @@ envelope_dump_file(struct envelope *ep, FILE *fp)
goto err;
if (buf[0] == '\0')
continue;
- fprintf(fp, "%s: %s\n",
- envelope_ascii_field_name(pfields[i]), buf);
+
+ l = snprintf(dest, len, "%s: %s\n",
+ envelope_ascii_field_name(pfields[i]), buf);
+ if (l == -1 || (size_t) l >= len)
+ goto err;
+ dest += l;
+ len -= l;
}
}
- if (fflush(fp) != 0)
- goto err;
-
- return 1;
+ return (dest - p);
err:
- return 0;
+ return (0);
}
char *
diff --git a/usr.sbin/smtpd/queue_fsqueue.c b/usr.sbin/smtpd/queue_fsqueue.c
index b405c2aa9c6..5e56ae6de6e 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.47 2012/08/08 17:31:55 eric Exp $ */
+/* $OpenBSD: queue_fsqueue.c,v 1.48 2012/08/19 10:32:32 chl Exp $ */
/*
* Copyright (c) 2011 Gilles Chehade <gilles@openbsd.org>
@@ -108,46 +108,60 @@ fsqueue_envelope_path(uint64_t evpid, char *buf, size_t len)
static int
fsqueue_envelope_dump_atomic(char *dest, struct envelope *ep)
{
- FILE *fp;
- char buf[MAXPATHLEN];
+ int fd;
+ char evpname[MAXPATHLEN];
+ char evpbuf[sizeof(struct envelope)];
+ size_t evplen;
+ ssize_t w;
+
+ evplen = envelope_dump_buffer(ep, evpbuf, sizeof evpbuf);
+ if (evplen == 0)
+ return (0);
/* temporary fix for multi-process access to the queue,
* should be fixed by rerouting ALL queue access through
* the queue process.
*/
- snprintf(buf, sizeof buf, PATH_EVPTMP".%d", getpid());
+ snprintf(evpname, sizeof evpname, PATH_EVPTMP".%d", getpid());
- fp = fopen(buf, "w");
- if (fp == NULL) {
+ if ((fd = open(evpname, O_RDWR | O_CREAT | O_EXCL, 0600)) == -1) {
if (errno == ENOSPC || errno == ENFILE)
goto tempfail;
fatal("fsqueue_envelope_dump_atomic: open");
}
- if (! envelope_dump_file(ep, fp)) {
+ w = write(fd, evpbuf, evplen);
+ if (w == -1) {
+ log_warn("fsqueue_envelope_dump_atomic: write");
if (errno == ENOSPC)
goto tempfail;
- fatal("fsqueue_envelope_dump_atomic: fwrite");
+ fatal("fsqueue_envelope_dump_atomic: write");
}
- if (! safe_fclose(fp))
+ if ((size_t) w != evplen) {
+ log_warnx("fsqueue_envelope_dump_atomic: partial write");
goto tempfail;
- fp = NULL;
+ }
+
+ if (fsync(fd))
+ fatal("fsync");
+ close(fd);
- if (rename(buf, dest) == -1) {
+ if (rename(evpname, dest) == -1) {
+ log_warn("fsqueue_envelope_dump_atomic: rename");
if (errno == ENOSPC)
goto tempfail;
fatal("fsqueue_envelope_dump_atomic: rename");
}
- return 1;
+ return (1);
tempfail:
- if (fp)
- fclose(fp);
- if (unlink(buf) == -1)
+ if (fd != -1)
+ close(fd);
+ if (unlink(evpname) == -1)
fatal("fsqueue_envelope_dump_atomic: unlink");
- return 0;
+ return (0);
}
static int
@@ -174,23 +188,26 @@ again:
static int
fsqueue_envelope_load(struct envelope *ep)
{
- char pathname[MAXPATHLEN];
- FILE *fp;
- int ret;
+ char pathname[MAXPATHLEN];
+ char evpbuf[sizeof(struct envelope)];
+ int fd;
+ ssize_t r;
fsqueue_envelope_path(ep->id, pathname, sizeof(pathname));
- fp = fopen(pathname, "r");
- if (fp == NULL) {
+ fd = open(pathname, O_RDONLY);
+ if (fd == -1) {
if (errno == ENOENT || errno == ENFILE)
- return 0;
- fatal("fsqueue_envelope_load: fopen");
+ return (0);
+ fatal("fsqueue_envelope_load: open");
}
- ret = envelope_load_file(ep, fp);
- fclose(fp);
+ if ((r = read(fd, evpbuf, sizeof evpbuf)) == -1)
+ return (0);
- return ret;
+ close(fd);
+
+ return (envelope_load_buffer(ep, evpbuf, r));
}
static int
diff --git a/usr.sbin/smtpd/smtpd.h b/usr.sbin/smtpd/smtpd.h
index 7eb4d7bdf94..e0d46b6d8e2 100644
--- a/usr.sbin/smtpd/smtpd.h
+++ b/usr.sbin/smtpd/smtpd.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: smtpd.h,v 1.324 2012/08/19 08:45:44 chl Exp $ */
+/* $OpenBSD: smtpd.h,v 1.325 2012/08/19 10:32:32 chl Exp $ */
/*
* Copyright (c) 2008 Gilles Chehade <gilles@openbsd.org>
@@ -971,8 +971,8 @@ void envelope_set_errormsg(struct envelope *, char *, ...);
char *envelope_ascii_field_name(enum envelope_field);
int envelope_ascii_load(enum envelope_field, struct envelope *, char *);
int envelope_ascii_dump(enum envelope_field, struct envelope *, char *, size_t);
-int envelope_load_file(struct envelope *, FILE *);
-int envelope_dump_file(struct envelope *, FILE *);
+int envelope_load_buffer(struct envelope *, char *, size_t);
+int envelope_dump_buffer(struct envelope *, char *, size_t);
/* expand.c */
int expand_cmp(struct expandnode *, struct expandnode *);