[net.bugs.4bsd] Wanted: reply fix for 4.2 mailer

rcc@imsvax.UUCP (06/19/84)

We're running the distribution 4.2 mail system.  The reply command has
a number of bugs, the most aggravating of which is that the reply
command, when given on a message with more than one From line in the
header, figures out the path to be used from the wrong From line.
This results in reply being worse than useless for replying to any
message that originates more than one machine or so away.

Someone must have fixed this by now.  Could someone who has this fix
*please* mail me a copy ?  Many thanks...
-- 

The preceding message was brought to you by --

		Ray Chen

UUCP:	umcp-cs!eneevax!imsvax!rcc  (NEW ADDRESS)
Voice:	(301)  984-8343
USnail:	Integrated Microcomputer Systems, Inc.
	Suite 400
	6100 Executive Blvd.
	Rockville, MD  20852

pag@hao.UUCP (Peter Gross) (06/24/84)

imsvax!rcc:

> We're running the distribution 4.2 mail system.  The reply command has
> a number of bugs, the most aggravating of which is that the reply
> command, when given on a message with more than one From line in the
> header, figures out the path to be used from the wrong From line.
> This results in reply being worse than useless for replying to any
> message that originates more than one machine or so away.

This problem is due to mail passing from 4.2 sendmail sites through
non-sendmail sites.  Sendmail either adds a "From: " (note colon) header
or prepends the sitename to an existing one.  Unfortunately this scheme
causes problems when the mail passes through non-sendmail sites;
they ignore the "From: " header, adding their site name only to the
"From " line.  Berkeley Mail always uses the "From: " header in preference
to the "From " one.  Thus you end up with incorrect reply paths.

The real problem is that sendmail is conforming to RFC 822 (right number?)
when most of the rest of the Unix world is not.  What we really need is
a public domain mailer that all uucp sites can run which conforms to
RFC822.  The approach I took was to add a defined constant IGNOREFROM
which uucp-only sites can use to cure the problem.  Here are those
changes:

1.  In Mail/Makefile add "-DIGNOREFROM" to the options line.

2.  diffs for Mail/aux.c:
*** /tmp/,RCSt1013078	Sat Jun 23 15:43:47 1984
--- aux.c	Sat Jun 23 15:41:13 1984
***************
*** 1,5
  #ifndef lint
! static char *sccsid = "@(#)aux.c	2.11 (Berkeley) 8/11/83";
  #endif
  
  #include "rcv.h"

--- 1,5 -----
  #ifndef lint
! static char *rcsid = "$Header: aux.c,v 2.12 84/06/23 15:39:54 pag Exp $";
  #endif
  
  #include "rcv.h"
***************
*** 10,15
   * Mail -- a mail program
   *
   * Auxiliary functions.
   */
  
  /*

--- 10,21 -----
   * Mail -- a mail program
   *
   * Auxiliary functions.
+  *
+  * $Log:	aux.c,v $
+  * Revision 2.12  84/06/23  15:39:54  pag
+  * Added IGNOREFROM conditional code to keep responses from using the
+  * incomplete "From:" header
+  * 
   */
  
  /*
***************
*** 616,621
  	register FILE *ibuf;
  	int first = 1;
  
  	if ((cp = hfield("from", mp)) != NOSTR)
  		return(cp);
  	if (reptype == 0 && (cp = hfield("sender", mp)) != NOSTR)

--- 622,628 -----
  	register FILE *ibuf;
  	int first = 1;
  
+ #ifndef IGNOREFROM
  	if ((cp = hfield("from", mp)) != NOSTR)
  		return(cp);
  	if (reptype == 0 && (cp = hfield("sender", mp)) != NOSTR)
***************
*** 620,625
  		return(cp);
  	if (reptype == 0 && (cp = hfield("sender", mp)) != NOSTR)
  		return(cp);
  	ibuf = setinput(mp);
  	copy("", namebuf);
  	if (readline(ibuf, linebuf) <= 0)

--- 627,633 -----
  		return(cp);
  	if (reptype == 0 && (cp = hfield("sender", mp)) != NOSTR)
  		return(cp);
+ #endif IGNOREFROM
  	ibuf = setinput(mp);
  	copy("", namebuf);
  	if (readline(ibuf, linebuf) <= 0)

3.  diffs for cmd3.c:
*** /tmp/,RCSt1013089	Sat Jun 23 15:44:51 1984
--- cmd3.c	Sat Jun 23 15:42:49 1984
***************
*** 1,5
  #ifndef lint
! static char *sccsid = "@(#)cmd3.c	2.14 (Berkeley) 8/11/83";
  #endif
  
  #include "rcv.h"

--- 1,5 -----
  #ifndef lint
! static char *rcsid = "$Header: cmd3.c,v 2.15 84/06/23 15:41:47 pag Exp $";
  #endif
  
  #include "rcv.h"
***************
*** 9,14
   * Mail -- a mail program
   *
   * Still more user commands.
   */
  
  /*

--- 9,20 -----
   * Mail -- a mail program
   *
   * Still more user commands.
+  *
+  * $Log:	cmd3.c,v $
+  * Revision 2.15  84/06/23  15:41:47  pag
+  * Added IGNOREFROM conditional code to keep responses from using a
+  * possibly incomplete "From:" header
+  * 
   */
  
  /*
***************
*** 205,210
  	cp = skin(nameof(mp, 1));
  	if (cp != NOSTR)
  	    rcv = cp;
  	cp = skin(hfield("from", mp));
  	if (cp != NOSTR)
  	    rcv = cp;

--- 211,217 -----
  	cp = skin(nameof(mp, 1));
  	if (cp != NOSTR)
  	    rcv = cp;
+ #ifndef IGNOREFROM
  	cp = skin(hfield("from", mp));
  	if (cp != NOSTR)
  	    rcv = cp;
***************
*** 208,213
  	cp = skin(hfield("from", mp));
  	if (cp != NOSTR)
  	    rcv = cp;
  	replyto = skin(hfield("reply-to", mp));
  	strcpy(buf, "");
  	if (replyto != NOSTR)

--- 215,221 -----
  	cp = skin(hfield("from", mp));
  	if (cp != NOSTR)
  	    rcv = cp;
+ #endif IGNOREFROM
  	replyto = skin(hfield("reply-to", mp));
  	strcpy(buf, "");
  	if (replyto != NOSTR)
***************
*** 673,678
  	for (s = 0, ap = msgvec; *ap != 0; ap++) {
  		mp = &message[*ap - 1];
  		dot = mp;
  		if ((cp = skin(hfield("from", mp))) != NOSTR)
  		    s+= strlen(cp) + 1;
  		else

--- 681,687 -----
  	for (s = 0, ap = msgvec; *ap != 0; ap++) {
  		mp = &message[*ap - 1];
  		dot = mp;
+ #ifndef IGNOREFROM
  		if ((cp = skin(hfield("from", mp))) != NOSTR)
  		    s+= strlen(cp) + 1;
  		else
***************
*** 676,681
  		if ((cp = skin(hfield("from", mp))) != NOSTR)
  		    s+= strlen(cp) + 1;
  		else
  		    s += strlen(skin(nameof(mp, 2))) + 1;
  	}
  	if (s == 0)

--- 685,691 -----
  		if ((cp = skin(hfield("from", mp))) != NOSTR)
  		    s+= strlen(cp) + 1;
  		else
+ #endif IGNOREFROM
  		    s += strlen(skin(nameof(mp, 2))) + 1;
  	}
  	if (s == 0)
***************
*** 684,689
  	head.h_to = cp;
  	for (ap = msgvec; *ap != 0; ap++) {
  		mp = &message[*ap - 1];
  		if ((cp2 = skin(hfield("from", mp))) == NOSTR)
  		    cp2 = skin(nameof(mp, 2));
  		cp = copy(cp2, cp);

--- 694,700 -----
  	head.h_to = cp;
  	for (ap = msgvec; *ap != 0; ap++) {
  		mp = &message[*ap - 1];
+ #ifndef IGNOREFROM
  		if ((cp2 = skin(hfield("from", mp))) == NOSTR)
  #endif IGNOREFROM
  		    cp2 = skin(nameof(mp, 2));
***************
*** 685,690
  	for (ap = msgvec; *ap != 0; ap++) {
  		mp = &message[*ap - 1];
  		if ((cp2 = skin(hfield("from", mp))) == NOSTR)
  		    cp2 = skin(nameof(mp, 2));
  		cp = copy(cp2, cp);
  		*cp++ = ' ';

--- 696,702 -----
  		mp = &message[*ap - 1];
  #ifndef IGNOREFROM
  		if ((cp2 = skin(hfield("from", mp))) == NOSTR)
+ #endif IGNOREFROM
  		    cp2 = skin(nameof(mp, 2));
  		cp = copy(cp2, cp);
  		*cp++ = ' ';
*********************************************************************
--peter gross
hao!pag