changeset 381:12d91031f1c7

Before sending the mail to +owner, we should strip "From " "Return-Path:" Or some (broken) mailers may think a new mail is starting.
author mmj
date Tue, 23 Nov 2004 01:15:45 +1100
parents 9b73100c4258
children 7ff4d8124226
files src/mlmmj-process.c
diffstat 1 files changed, 32 insertions(+), 4 deletions(-) [+]
line wrap: on
line diff
--- a/src/mlmmj-process.c	Tue Nov 23 01:12:56 2004 +1100
+++ b/src/mlmmj-process.c	Tue Nov 23 01:15:45 2004 +1100
@@ -426,7 +426,7 @@
 			(delheaders->count+3) * sizeof(char *));
 	delheaders->strs[delheaders->count++] = mystrdup("From ");
 	delheaders->strs[delheaders->count++] = mystrdup("Return-Path:");
-	delheaders->strs[delheaders->count++] = NULL;
+	delheaders->strs[delheaders->count] = NULL;
 	
 	subjectprefix = ctrlvalue(listdir, "prefix");	
 	
@@ -440,7 +440,6 @@
 	for(i = 0; i < delheaders->count; i++)
 		myfree(delheaders->strs[i]);
 	myfree(delheaders->strs);
-	myfree(delheaders);
 
 	close(rawmailfd);
 	close(donemailfd);
@@ -512,13 +511,40 @@
 	if(recipdelim) {
 		owner = concatstr(2, listdir, "/control/owner");
 		if(owner && strncmp(recipdelim, "+owner@", 7) == 0) {
-			unlink(donemailname);
+			/* strip envelope from before resending */
+			delheaders->strs = myrealloc(delheaders->strs,
+				(delheaders->count+3) * sizeof(char *));
+			delheaders->strs[delheaders->count++] =
+				mystrdup("From ");
+			delheaders->strs[delheaders->count++] =
+				mystrdup("Return-Path:");
+			delheaders->strs[delheaders->count] = NULL;
+			if((rawmailfd = open(mailfile, O_RDONLY)) < 0) {
+				log_error(LOG_ARGS, "could not open() "
+						    "input mail file");
+				exit(EXIT_FAILURE);
+			}
+			if((donemailfd = open(donemailname,
+						O_WRONLY|O_TRUNC)) < 0) {
+				log_error(LOG_ARGS, "could not open() "
+						    "output mail file");
+				exit(EXIT_FAILURE);
+			}
+			if(do_all_the_voodo_here(rawmailfd, donemailfd, -1,
+					-1, (const char**)delheaders->strs,
+					NULL, &allheaders, NULL) < 0) {
+				log_error(LOG_ARGS, "do_all_the_voodo_here");
+				exit(EXIT_FAILURE);
+			}
+			close(rawmailfd);
+			close(donemailfd);
+			unlink(mailfile);
 			execlp(mlmmjsend, mlmmjsend,
 					"-l", "4",
 					"-F", efromemails.emaillist[0],
 					"-s", owner,
 					"-a",
-					"-m", mailfile, NULL);
+					"-m", donemailname, NULL);
 			log_error(LOG_ARGS, "execlp() of '%s' failed",
 					mlmmjsend);
 			exit(EXIT_FAILURE);
@@ -533,6 +559,8 @@
 		return EXIT_SUCCESS;
 	}
 
+	myfree(delheaders);
+
 	if(efromemails.emailcount != 1) { /* don't send mails with <> in From
 					     to the list */
 		discardname = concatstr(3, listdir,