summaryrefslogblamecommitdiff
path: root/mail/popper/files/patch-ad
blob: 620e4d77c1bdea7da9056e8863fb7127834c2639 (plain) (tree)
1
2
3
4
5
6
7
8
9








                                                                            


                                                                    


                                                                 






                                                                            
               

                





                                    
                                     
















                                                                     
                                                                    


                              
                                                               
                              
                           






                                                                        

                







                                                                                  

                









                                                                     

                



                                                           





                                          



                                                                               

                








                                                                               

                







                                                                            

                









                                                                     
                


                                          














                                                                                 

                          
                                                                                 
               

                







                                                                               










                                                                              




































                                                                                
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

This patch hits again: wrong mbox size calculation and Return-Path was never
writted out
						-- Andrey Chernov
						   30-Jun-1998

*** pop_dropcopy.c.orig	Thu Nov 20 00:20:38 1997
--- pop_dropcopy.c	Tue Jun 30 10:19:40 1998
***************
*** 155,160 ****
--- 155,191 ----
      return(ti != 0);
  }
  
+ char *
+ return_path (const char *unixfrom)
+ {
+     static char tmpbuf[MAXLINELEN];
+     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)-2, "Return-Path: %.*s!%.*s",
+ 		 ep - hp, hp,
+ 		 cp - fp, fp);
+     } else
+ 	snprintf(tmpbuf, sizeof(tmpbuf)-2, "Return-Path: %.*s",
+ 		 cp - fp, fp);
+     strcat(tmpbuf, "\n");
+     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
***************
*** 279,284 ****
--- 310,316 ----
      char                    buffer[MAXLINELEN];		/*  Read buffer */
      MD5_CTX		    mdContext;
      unsigned char	    digest[16];
+     char                   *rpath = NULL;
  
  #ifdef DEBUG
      if(p->debug)
***************
*** 343,348 ****
--- 375,383 ----
  	    (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;
***************
*** 388,393 ****
--- 423,435 ----
  	    mp->retr_flag = FALSE;
  	    mp->orig_retr_state = FALSE;
  	    mp->uidl_str = "\n";
+ 	    mp->return_path = rpath ? strdup(rpath) : NULL;
+ 	    if (rpath) {
+ 		int i = strlen(rpath) + 1;
+ 		mp->length += i;
+ 		p->drop_size += i;
+ 		mp->lines++;
+ 	    }
  #ifdef DEBUG
  	    if(p->debug)
  		pop_log(p,POP_DEBUG, "Msg %d being added to list", mp->number);
***************
*** 466,471 ****
--- 508,515 ----
  		    mp->retr_flag = TRUE;
  		    mp->orig_retr_state = TRUE;
  		}
+ 	    } else if (rpath && (strncasecmp(buffer,"Return-Path:",12) == 0)) {
+ 		continue;
  	    }
  	} else {
  	    content_nchar += nchar;
***************
*** 505,510 ****
--- 549,555 ----
      int			    content_length, content_nchar, cont_len;
      MD5_CTX		    mdContext;
      unsigned char	    digest[16];
+     char                   *rpath = NULL;
  
      FILE		    *mail_drop;		    /*  Streams for fids */
  
***************
*** 577,582 ****
--- 622,630 ----
  	    (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;
***************
*** 622,628 ****
              mp->retr_flag = FALSE;
              mp->orig_retr_state = FALSE;
  	    mp->uidl_str = "\n";
! 
  #ifdef DEBUG
              if(p->debug)
                  pop_log(p,POP_DEBUG, "Msg %d being added to list", mp->number);
--- 670,682 ----
              mp->retr_flag = FALSE;
              mp->orig_retr_state = FALSE;
  	    mp->uidl_str = "\n";
! 	    mp->return_path = rpath ? strdup(rpath) : NULL;
! 	    if (rpath) {
! 		int i = strlen(rpath) + 1;
! 		mp->length += i;
! 		p->drop_size += i;
! 		mp->lines++;
! 	    }
  #ifdef DEBUG
              if(p->debug)
                  pop_log(p,POP_DEBUG, "Msg %d being added to list", mp->number);
***************
*** 705,710 ****
--- 759,766 ----
  		    mp->retr_flag = TRUE;
  		    mp->orig_retr_state = TRUE;
  		}
+ 	    } else if (rpath && (strncasecmp(buffer,"Return-Path:",12) == 0)) {
+ 		continue;
  	    }
  	} else {
  	    content_nchar += nchar;
--- 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 */
*** pop_send.c.old	Thu Nov 20 00:20:38 1997
--- pop_send.c	Tue Jun 30 10:06:23 1998
***************
*** 38,43 ****
--- 38,44 ----
      register int            msg_num;
      register int            msg_lines;
      register int	    uidl_sent = 0;
+     register int            rpath_sent = 0;
      char                    buffer[MAXMSGLINELEN];
  
      /*  Convert the first parameter into an integer */
***************
*** 86,91 ****
--- 87,93 ----
      /*  Send the header of the message followed by a blank line */
      while (fgets(buffer, MAXMSGLINELEN, p->drop)) {
  	if (!strncasecmp(buffer, "Content-Length:", 15) ||
+ 	    (mp->return_path && !strncasecmp(buffer,"Return-Path:",12)) ||
  	    !strncasecmp(buffer, "X-UIDL:", 7)) {	/* Skip UIDLs */
  	    continue;	/* Content-Length is MTA dependent, don't send to MUA */
  	}
***************
*** 96,101 ****
--- 98,109 ----
  	    sprintf(uidl_buf, "%s %s", "X-UIDL:", mp->uidl_str);
  	    pop_sendline(p, uidl_buf);
  	    uidl_sent++;
+ 	}
+ 	if (mp->return_path && !rpath_sent && (*buffer=='\n' ||
+ 			    !strncasecmp(buffer,"Status:",7) ||
+ 			    !strncasecmp(buffer,"Received:",9))) {
+ 	    pop_sendline(p, mp->return_path);
+ 	    rpath_sent++;
  	}
  
  	pop_sendline(p, buffer);