summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--mail/popper/files/patch-ad130
1 files changed, 130 insertions, 0 deletions
diff --git a/mail/popper/files/patch-ad b/mail/popper/files/patch-ad
new file mode 100644
index 000000000000..76efb0426422
--- /dev/null
+++ b/mail/popper/files/patch-ad
@@ -0,0 +1,130 @@
+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
+
+--- pop_dropcopy.c Mon Feb 17 13:14:18 1997
++++ pop_dropcopy.c Mon Feb 17 15:51:37 1997
+@@ -160,6 +160,37 @@
+ 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
+@@ -284,6 +315,7 @@
+ char buffer[MAXLINELEN]; /* Read buffer */
+ MD5_CTX mdContext;
+ unsigned char digest[16];
++ char *rpath;
+
+ #ifdef DEBUG
+ if(p->debug)
+@@ -349,6 +381,12 @@
+ (p->mmdf_separator ? !strcmp(p->mmdf_separator, buffer) :
+ isfromline(buffer))) {
+
++ if (!p->mmdf_separator) {
++ rpath = return_path(buffer);
++ if (rpath)
++ snprintf(buffer, sizeof(buffer), rpath);
++ }
++
+ if (expecting_trailer) {
+ /* skip over the MMDF trailer */
+ expecting_trailer = 0;
+@@ -394,6 +432,7 @@
+ mp->retr_flag = FALSE;
+ mp->orig_retr_state = FALSE;
+ mp->uidl_str = "\n";
++ mp->return_path = rpath ? strdup(rpath) : NULL;
+ #ifdef DEBUG
+ if(p->debug)
+ pop_log(p,POP_DEBUG, "Msg %d being added to list", mp->number);
+@@ -511,6 +550,7 @@
+ int content_length, content_nchar, cont_len;
+ MD5_CTX mdContext;
+ unsigned char digest[16];
++ char *rpath;
+
+ FILE *mail_drop; /* Streams for fids */
+
+@@ -583,6 +623,12 @@
+ (p->mmdf_separator ? !strcmp(p->mmdf_separator, buffer) :
+ isfromline(buffer))) {
+
++ if (!p->mmdf_separator) {
++ rpath = return_path(buffer);
++ if (rpath)
++ snprintf(buffer, sizeof(buffer), rpath);
++ }
++
+ if (expecting_trailer) {
+ expecting_trailer = 0;
+ continue;
+@@ -628,6 +674,7 @@
+ mp->retr_flag = FALSE;
+ mp->orig_retr_state = FALSE;
+ mp->uidl_str = "\n";
++ mp->return_path = rpath ? strdup(rpath) : NULL;
+
+ #ifdef DEBUG
+ if(p->debug)
+--- 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 */