summaryrefslogtreecommitdiffstats
path: root/rfc2045/rfc2045reply.c
diff options
context:
space:
mode:
authorSam Varshavchik2014-06-18 18:13:27 -0400
committerSam Varshavchik2014-06-18 18:13:27 -0400
commit8f3ed494650eac351a8eadb1af08f309b89dfb2d (patch)
treec7255ab2a519dcebf68cfcbd0865dda41bd76005 /rfc2045/rfc2045reply.c
parenta7c7a64052adc5723d4c549f163a70e0375e2adf (diff)
downloadcourier-libs-8f3ed494650eac351a8eadb1af08f309b89dfb2d.tar.bz2
maildrop: add -T replydraft option
Diffstat (limited to 'rfc2045/rfc2045reply.c')
-rw-r--r--rfc2045/rfc2045reply.c93
1 files changed, 69 insertions, 24 deletions
diff --git a/rfc2045/rfc2045reply.c b/rfc2045/rfc2045reply.c
index 3ec0728..28726dc 100644
--- a/rfc2045/rfc2045reply.c
+++ b/rfc2045/rfc2045reply.c
@@ -908,6 +908,8 @@ static char *mlcheck(struct rfc2045_mkreplyinfo *ri, const char *);
static int replydsn(struct rfc2045_mkreplyinfo *);
static int replyfeedback(struct rfc2045_mkreplyinfo *);
+static int replydraft(struct rfc2045_mkreplyinfo *);
+static void copyheaders(struct rfc2045_mkreplyinfo *);
static int mkreply(struct rfc2045_mkreplyinfo *ri)
{
@@ -1364,6 +1366,15 @@ static int mkreply(struct rfc2045_mkreplyinfo *ri)
free(subject);
}
+ if (strcmp(ri->replymode, "replydraft") == 0)
+ {
+ writes(ri, "\n");
+ if (whowrote)
+ free(whowrote);
+ whowrote=0;
+ return replydraft(ri);
+ }
+
writes(ri, "\nMime-Version: 1.0\n");
boundary=NULL;
@@ -1422,6 +1433,7 @@ static int mkreply(struct rfc2045_mkreplyinfo *ri)
{
writes(ri, whowrote);
free(whowrote);
+ whowrote=0;
writes(ri, "\n\n");
}
if (SRC_SEEK(ri->src, start_body) == (off_t)-1)
@@ -1443,9 +1455,6 @@ static int mkreply(struct rfc2045_mkreplyinfo *ri)
{
/* replydsn or replyfeedback */
- char *header, *value;
- struct rfc2045headerinfo *hi;
-
writes(ri, "\n--");
writes(ri, boundary);
writes(ri, "\nContent-Type: message/");
@@ -1488,27 +1497,7 @@ static int mkreply(struct rfc2045_mkreplyinfo *ri)
}
else
{
- writes(ri, "\nContent-Type: text/rfc822-headers; charset=\"iso-8859-1\"\n"
- "Content-Disposition: attachment\n"
- "Content-Transfer-Encoding: 8bit\n\n"
- );
-
- hi=rfc2045header_start(ri->src, ri->rfc2045partp);
-
- while (hi)
- {
- if (rfc2045header_get(hi, &header, &value,
- RFC2045H_NOLC) || !header)
- {
- rfc2045header_end(hi);
- break;
- }
-
- writes(ri, header);
- writes(ri, ": ");
- writes(ri, value);
- writes(ri, "\n");
- }
+ copyheaders(ri);
}
writes(ri, "\n--");
writes(ri, boundary);
@@ -1530,6 +1519,62 @@ static void dsn_arrival_date(struct rfc2045_mkreplyinfo *ri)
writes(ri, "\n");
}
+static void copyheaders(struct rfc2045_mkreplyinfo *ri)
+{
+ struct rfc2045headerinfo *hi;
+ char *header, *value;
+
+
+ writes(ri, "\nContent-Type: text/rfc822-headers; charset=\"iso-8859-1\"\n"
+ "Content-Disposition: attachment\n"
+ "Content-Transfer-Encoding: 8bit\n\n"
+ );
+
+ hi=rfc2045header_start(ri->src, ri->rfc2045partp);
+
+ while (hi)
+ {
+ if (rfc2045header_get(hi, &header, &value,
+ RFC2045H_NOLC) || !header)
+ {
+ rfc2045header_end(hi);
+ break;
+ }
+
+ writes(ri, header);
+ writes(ri, ": ");
+ writes(ri, value);
+ writes(ri, "\n");
+ }
+}
+
+static int replydraft(struct rfc2045_mkreplyinfo *ri)
+{
+ char *boundary=rfc2045_mk_boundary(ri->rfc2045partp, ri->src);
+ if (!boundary)
+ return (-1);
+
+ writes(ri, "Content-Type: multipart/mixed; boundary=\"");
+ writes(ri, boundary);
+ writes(ri, "\"\n\n");
+ writes(ri, RFC2045MIMEMSG);
+ writes(ri, "\n--");
+ writes(ri, boundary);
+ writes(ri, "\n");
+
+ if (ri->content_specify)
+ (*ri->content_specify)(ri->voidarg);
+
+ writes(ri, "\n--");
+ writes(ri, boundary);
+ copyheaders(ri);
+ writes(ri, "\n--");
+ writes(ri, boundary);
+ writes(ri, "--\n");
+ free(boundary);
+ return 0;
+}
+
static int replydsn(struct rfc2045_mkreplyinfo *ri)
{
dsn_arrival_date(ri);