1
0
mirror of https://git.FreeBSD.org/ports.git synced 2024-11-08 23:06:56 +00:00
freebsd-ports/mail/popper/files/patch-ad
Andrey A. Chernov 65bf87e492 Return-path patch improvement: skip Return-path comes from headers
if we already generate our own.
Previous variant produce two and more Return-Path'es
1997-10-08 06:46:50 +00:00

171 lines
4.8 KiB
Plaintext

These paths translate From_ lines into Return-Path: in unix style mailboxes.
If the mailbox is in MMDF format, it does nothing (since MMDF has already
done the Return-Path: translation while writing the message out.
WARNING: Do not merge these patches in with other patch files.
Keep them separate (Andrey, I mean you).
-- Paul Traina
17-Feb-1997
With old variant of this patch message size was counted incorrectly,
"rpath" variable can be referenced without initialization, second
Return-Path not skipped, fixed now.
-- Andrey Chernov
8-Oct-1997
*** pop_dropcopy.c.orig Fri Jul 25 21:42:07 1997
--- pop_dropcopy.c Wed Oct 8 10:36:34 1997
***************
*** 151,156 ****
--- 151,187 ----
return(ti != 0);
}
+ char *
+ return_path (const char *unixfrom)
+ {
+ static char tmpbuf[BUFSIZ];
+ int fromlen = sizeof("From ") - 1;
+ const char *fp, *hp, *cp, *ep;
+
+ /* if it doesn't start with a From_, it's not */
+ if (strncmp(unixfrom, "From ", fromlen))
+ return NULL;
+
+ fp = unixfrom + fromlen;
+ hp = cp = strchr(fp, ' ');
+ while (hp = strchr(++hp, 'r'))
+ if (!strncmp(hp, "remote from", sizeof("remote from") - 1)) {
+ hp = strrchr(hp, ' ');
+ break;
+ }
+
+ if (hp) {
+ ep = strrchr(++hp, '\n');
+ snprintf(tmpbuf, sizeof(tmpbuf), "Return-Path: %.*s!%.*s\n",
+ ep - hp, hp,
+ cp - fp, fp);
+ } else
+ snprintf(tmpbuf, sizeof(tmpbuf), "Return-Path: %.*s\n",
+ cp - fp, fp);
+
+ return tmpbuf;
+ }
+
/* Hashing to a spool directory helps reduce the lookup time for sites
* with thousands of mail spool files. Unix uses a linear list to
* save directory information and the following methods attempt to
***************
*** 275,280 ****
--- 306,312 ----
char buffer[MAXLINELEN]; /* Read buffer */
MD5_CTX mdContext;
unsigned char digest[16];
+ char *rpath = NULL;
#ifdef DEBUG
if(p->debug)
***************
*** 340,345 ****
--- 372,380 ----
(p->mmdf_separator ? !strcmp(p->mmdf_separator, buffer) :
isfromline(buffer))) {
+ if (!p->mmdf_separator)
+ rpath = return_path(buffer);
+
if (expecting_trailer) {
/* skip over the MMDF trailer */
expecting_trailer = 0;
***************
*** 385,390 ****
--- 420,428 ----
mp->retr_flag = FALSE;
mp->orig_retr_state = FALSE;
mp->uidl_str = "\n";
+ mp->return_path = rpath ? strdup(rpath) : NULL;
+ if (rpath)
+ mp->length += strlen(rpath) + 1;
#ifdef DEBUG
if(p->debug)
pop_log(p,POP_DEBUG, "Msg %d being added to list", mp->number);
***************
*** 463,468 ****
--- 501,508 ----
mp->retr_flag = TRUE;
mp->orig_retr_state = TRUE;
}
+ } else if (rpath && (strncasecmp(buffer,"Return-Path:",12) == 0)) {
+ continue;
}
} else {
content_nchar += nchar;
***************
*** 502,507 ****
--- 542,548 ----
int content_length, content_nchar, cont_len;
MD5_CTX mdContext;
unsigned char digest[16];
+ char *rpath = NULL;
FILE *mail_drop; /* Streams for fids */
***************
*** 574,579 ****
--- 615,623 ----
(p->mmdf_separator ? !strcmp(p->mmdf_separator, buffer) :
isfromline(buffer))) {
+ if (!p->mmdf_separator)
+ rpath = return_path(buffer);
+
if (expecting_trailer) {
expecting_trailer = 0;
continue;
***************
*** 619,624 ****
--- 663,671 ----
mp->retr_flag = FALSE;
mp->orig_retr_state = FALSE;
mp->uidl_str = "\n";
+ mp->return_path = rpath ? strdup(rpath) : NULL;
+ if (rpath)
+ mp->length += strlen(rpath) + 1;
#ifdef DEBUG
if(p->debug)
***************
*** 701,706 ****
--- 748,755 ----
mp->retr_flag = TRUE;
mp->orig_retr_state = TRUE;
}
+ } else if (rpath && (strncasecmp(buffer,"Return-Path:",12) == 0)) {
+ continue;
}
} else {
content_nchar += nchar;
--- pop_send.c Mon Feb 17 13:14:25 1997
+++ pop_send.c Mon Feb 17 13:15:28 1997
@@ -84,6 +84,9 @@
/* Skip the first line (the sendmail "From" or MMDF line) */
(void)fgets (buffer,MAXMSGLINELEN,p->drop);
+ if (mp->return_path)
+ pop_sendline(p, mp->return_path);
+
/* Send the header of the message followed by a blank line */
while (fgets(buffer, MAXMSGLINELEN, p->drop)) {
if (!strncasecmp(buffer, "Content-Length:", 15) ||
--- popper.h Mon Feb 17 13:15:44 1997
+++ popper.h Mon Feb 17 13:35:48 1997
@@ -260,6 +263,8 @@
Used for RSET cmd. */
char *uidl_str; /* Cache of the UIDL str for
faster access */
+ char *return_path; /* Cache of the rpath str for
+ faster access */
} MsgInfoList;
typedef struct { /* POP parameter block */