summaryrefslogtreecommitdiff
path: root/usr.sbin/smtpd
diff options
context:
space:
mode:
authorGilles Chehade <gilles@cvs.openbsd.org>2009-08-06 14:27:42 +0000
committerGilles Chehade <gilles@cvs.openbsd.org>2009-08-06 14:27:42 +0000
commitb01b4ae8cca90bdcf508812f02e0403c69d03f5b (patch)
treea07de28ca9f53b26e30c0ad4cca03e1a490fe6ad /usr.sbin/smtpd
parentcfed36f4872ad807b5085bdae7b3024ec263d4d1 (diff)
factorize file_copy_session() and file_copy() so file_copy() can handle
both deliveries to mailboxes (mbox/maildir) and copying to a session.
Diffstat (limited to 'usr.sbin/smtpd')
-rw-r--r--usr.sbin/smtpd/bounce.c4
-rw-r--r--usr.sbin/smtpd/smtpd.h5
-rw-r--r--usr.sbin/smtpd/store.c46
3 files changed, 12 insertions, 43 deletions
diff --git a/usr.sbin/smtpd/bounce.c b/usr.sbin/smtpd/bounce.c
index d9ceb5a03d0..add6d442087 100644
--- a/usr.sbin/smtpd/bounce.c
+++ b/usr.sbin/smtpd/bounce.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: bounce.c,v 1.3 2009/08/06 14:16:37 gilles Exp $ */
+/* $OpenBSD: bounce.c,v 1.4 2009/08/06 14:27:41 gilles Exp $ */
/*
* Copyright (c) 2009 Gilles Chehade <gilles@openbsd.org>
@@ -151,7 +151,7 @@ bounce_session_switch(struct smtpd *env, FILE *fp, enum session_state *state, ch
fprintf(fp, "\r\n");
fprintf(fp, "Below is a copy of the original message:\r\n\r\n");
- if (! file_copy_session(env, fp, srcfp)) {
+ if (! file_copy(fp, srcfp, NULL, 0, 1)) {
return 0;
}
diff --git a/usr.sbin/smtpd/smtpd.h b/usr.sbin/smtpd/smtpd.h
index f62491f1379..0af1e79ebca 100644
--- a/usr.sbin/smtpd/smtpd.h
+++ b/usr.sbin/smtpd/smtpd.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: smtpd.h,v 1.132 2009/08/06 14:12:48 gilles Exp $ */
+/* $OpenBSD: smtpd.h,v 1.133 2009/08/06 14:27:41 gilles Exp $ */
/*
* Copyright (c) 2008 Gilles Chehade <gilles@openbsd.org>
@@ -873,8 +873,7 @@ void session_bufferevent_new(struct session *);
SPLAY_PROTOTYPE(sessiontree, session, s_nodes, session_cmp);
/* store.c */
-int
-file_copy_session(struct smtpd *, FILE *, FILE *);
+int file_copy(FILE *, FILE *, struct path *, enum action_type, int);
int store_write_header(struct batch *, struct message *, FILE *, int);
int store_write_message(struct batch *, struct message *);
int store_write_daemon(struct batch *, struct message *);
diff --git a/usr.sbin/smtpd/store.c b/usr.sbin/smtpd/store.c
index 9e50c2460a0..b9cf478cf70 100644
--- a/usr.sbin/smtpd/store.c
+++ b/usr.sbin/smtpd/store.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: store.c,v 1.21 2009/08/06 13:40:45 gilles Exp $ */
+/* $OpenBSD: store.c,v 1.22 2009/08/06 14:27:41 gilles Exp $ */
/*
* Copyright (c) 2008 Gilles Chehade <gilles@openbsd.org>
@@ -38,39 +38,8 @@
#include "smtpd.h"
-int file_copy(FILE *, FILE *, struct path *, enum action_type);
-
-int
-file_copy_session(struct smtpd *env, FILE *dest, FILE *src)
-{
- char *buf, *lbuf;
- size_t len;
-
- lbuf = NULL;
- while ((buf = fgetln(src, &len))) {
- if (buf[len - 1] == '\n') {
- buf[len - 1] = '\0';
- len--;
- }
- else {
- /* EOF without EOL, copy and add the NUL */
- if ((lbuf = malloc(len + 1)) == NULL)
- err(1, NULL);
- memcpy(lbuf, buf, len);
- lbuf[len] = '\0';
- buf = lbuf;
- }
-
- if (fprintf(dest, "%s\r\n", buf) != (int)len + 2)
- return 0;
- }
- free(lbuf);
-
- return 1;
-}
-
int
-file_copy(FILE *dest, FILE *src, struct path *path, enum action_type type)
+file_copy(FILE *dest, FILE *src, struct path *path, enum action_type type, int session)
{
char *buf, *lbuf;
size_t len;
@@ -96,7 +65,7 @@ file_copy(FILE *dest, FILE *src, struct path *path, enum action_type type)
* path set to the original recipient. In that case, we can
* add the X-OpenSMTPD-Loop header to help loop detection.
*/
- if (path != NULL && inheaders &&
+ if (!session && path != NULL && inheaders &&
strchr(buf, ':') == NULL && !isspace(*buf)) {
if (fprintf(dest, "X-OpenSMTPD-Loop: %s@%s\n",
path->user, path->domain) == -1)
@@ -104,7 +73,7 @@ file_copy(FILE *dest, FILE *src, struct path *path, enum action_type type)
inheaders = 0;
}
- if (type == A_MBOX) {
+ if (!session && type == A_MBOX) {
escape = buf;
while (*escape == '>')
++escape;
@@ -114,12 +83,13 @@ file_copy(FILE *dest, FILE *src, struct path *path, enum action_type type)
}
}
- if (fprintf(dest, "%s\n", buf) != (int)len + 1)
+ if (fprintf(dest, "%s%s", buf, session ? "\r\n" : "\n") !=
+ (int)len + (session ? 2 : 1))
return 0;
}
free(lbuf);
- if (type == A_MBOX) {
+ if (!session && type == A_MBOX) {
if (fprintf(dest, "\n") != 1)
return 0;
}
@@ -142,7 +112,7 @@ store_write_message(struct batch *batchp, struct message *messagep)
goto bad;
if (! file_copy(mboxfp, messagefp, &messagep->session_rcpt,
- messagep->recipient.rule.r_action))
+ messagep->recipient.rule.r_action, 0))
goto bad;
fflush(mboxfp);