[comp.mail.sendmail] NAME env. var. misfeature + fix & m macro enhancement

seeger@helios.iec.ufl.edu (F. L. Charles Seeger III) (08/24/89)

Problem:
	When sendmail is started in daemon mode from the command line, it
	reads the "NAME" environment variable to be used as the sender's
	Full Name.  When mail was forwarded by a machine running such a
	sendmail, full names would be incorrectly altered when the
	addresses were rewritten.  If NAME isn't set there is no problem.

Solution:
	Don't read NAME when starting in daemon mode.

Fix:
	The context diffs included below inlcude a test for daemon mode
	operation before reading NAME.

Notes:
	The "NAME" enviroment variable is not properly used when mail is
	sent from a host that doesn't run its own sendmail daemon and just
	forwards outgoing mail to a server.  This is probably a continuing
	bug.  A better fix, which addresses this problem as well, is
	probably possible, if someone wishes to look into it.

	These diffs also include the definition of the m macro (a la Sun's
	sendmail) to be the domain name, obtained by getdomainname().  The
	use of the {GET,DEF}_DOMAIN macros (definitions added to conf.h)
	is quite clear.  Sorry for mixing the two in one set of diffs.

	The definition of YELLOW_PAGES in conf.h comes from Stanley
	Barber's patches for SunOS-4 with YP support.

	The default cf file is redefined to "/etc/sendmail.cf".

	I've also upped the limits for MAXHOP, MAXMXHOSTS and jbuf[] size.

	Tomorrow is my last day at my current job, and I don't know what
	my net access will be like in the near future.  Use of this Email
	address should get to me for a while, though.

Regards,
Chuck
--
  Charles Seeger            216 Larsen Hall             +1 904 392 8935
  Electrical Engineering    University of Florida       "Bye, Opus.
  seeger@iec.ufl.edu        Gainesville, FL 32611       It's been fun."
--
============================ conf.h.diff =================================
*** conf.h.orig	Wed Aug 23 17:43:50 1989
--- conf.h	Wed Aug 23 18:33:27 1989
***************
*** 31,37 ****
  # define MAXNAME	256		/* max length of a name */
  # define MAXFIELD	2500		/* max total length of a hdr field */
  # define MAXPV		40		/* max # of parms to mailers */
! # define MAXHOP		17		/* max value of HopCount */
  # define MAXATOM	100		/* max atoms per address */
  # define MAXMAILERS	25		/* maximum mailers known to system */
  # define MAXRWSETS	30		/* max # of sets of rewriting rules */
--- 31,37 ----
  # define MAXNAME	256		/* max length of a name */
  # define MAXFIELD	2500		/* max total length of a hdr field */
  # define MAXPV		40		/* max # of parms to mailers */
! # define MAXHOP		32		/* max value of HopCount */
  # define MAXATOM	100		/* max atoms per address */
  # define MAXMAILERS	25		/* maximum mailers known to system */
  # define MAXRWSETS	30		/* max # of sets of rewriting rules */
***************
*** 39,45 ****
  # define MAXTRUST	30		/* maximum number of trusted users */
  # define MAXUSERENVIRON	40		/* max # of items in user environ */
  # define QUEUESIZE	600		/* max # of jobs per queue run */
! # define MAXMXHOSTS	10		/* max # of MX records */
  
  /*
  **  Compilation options.
--- 39,45 ----
  # define MAXTRUST	30		/* maximum number of trusted users */
  # define MAXUSERENVIRON	40		/* max # of items in user environ */
  # define QUEUESIZE	600		/* max # of jobs per queue run */
! # define MAXMXHOSTS	16		/* max # of MX records */
  
  /*
  **  Compilation options.
***************
*** 56,61 ****
--- 56,64 ----
  # define DAEMON		1	/* include the daemon (requires IPC & SMTP) */
  # define SETPROCTITLE	1	/* munge argv to display current status */
  # define NAMED_BIND	1	/* use Berkeley Internet Domain Server */
+ # define YELLOW_PAGES	1	/* use Yellow Pages for aliases lookup */
+ # define GET_DOMAIN	1	/* use getdomainname() to define m macro */
+ # define DEF_DOMAIN	"iec.ufl.edu"	/* default domain name */
  
  	/*
  	 * Use query type of ANY if possible (NO_WILDCARD_MX), which will
***************
*** 65,68 ****
  	 * searched, we can't use ANY; it would cause fully-qualified names
  	 * to match as names in a local domain.
  	 */
! # define NO_WILDCARD_MX	1
--- 68,71 ----
  	 * searched, we can't use ANY; it would cause fully-qualified names
  	 * to match as names in a local domain.
  	 */
! /* # define NO_WILDCARD_MX	1 */
============================ daemon.c.diff =================================
*** daemon.c.orig	Wed Aug 23 17:22:01 1989
--- daemon.c	Wed Aug 23 18:37:33 1989
***************
*** 484,489 ****
--- 484,502 ----
  		return (NULL);
  }
  
+ #ifdef DEF_DOMAIN
+ mydomainname(hostbuf, size)
+ 	char hostbuf[];
+ 	int size;
+ {
+ #ifdef GET_DOMAIN
+ 	if (getdomainname(hostbuf, size) < 0)
+ #endif
+ 		(void) strcpy(hostbuf, DEF_DOMAIN);
+ 	return (NULL);
+ }
+ #endif DEF_DOMAIN
+ 
  /*
   *  MAPHOSTNAME -- turn a hostname into canonical form
   *
============================ main.c.diff =================================
*** main.c.orig	Wed Aug 23 17:07:11 1989
--- main.c	Wed Aug 23 18:38:15 1989
***************
*** 112,119 ****
  	bool readconfig = TRUE;
  	bool queuemode = FALSE;		/* process queue requests */
  	bool nothaw;
  	static bool reenter = FALSE;
! 	char jbuf[30];			/* holds MyHostName */
  	extern bool safefile();
  	extern time_t convtime();
  	extern putheader(), putbody();
--- 112,120 ----
  	bool readconfig = TRUE;
  	bool queuemode = FALSE;		/* process queue requests */
  	bool nothaw;
+ 	bool daemonmode = FALSE;
  	static bool reenter = FALSE;
! 	char jbuf[64];			/* holds MyHostName */
  	extern bool safefile();
  	extern time_t convtime();
  	extern putheader(), putbody();
***************
*** 183,189 ****
  		{
  			ConfFile = &p[2];
  			if (ConfFile[0] == '\0')
! 				ConfFile = "sendmail.cf";
  			(void) setgid(getrgid());
  			(void) setuid(getruid());
  			nothaw = TRUE;
--- 184,190 ----
  		{
  			ConfFile = &p[2];
  			if (ConfFile[0] == '\0')
! 				ConfFile = "/etc/sendmail.cf";
  			(void) setgid(getrgid());
  			(void) setuid(getruid());
  			nothaw = TRUE;
***************
*** 190,195 ****
--- 191,198 ----
  		}
  		else if (strncmp(p, "-bz", 3) == 0)
  			nothaw = TRUE;
+ 		else if (strncmp(p, "-bd", 3) == 0)
+ 			daemonmode = TRUE;
  		else if (strncmp(p, "-d", 2) == 0)
  		{
  			tTsetup(tTdvect, sizeof tTdvect, "0-99.1");
***************
*** 234,240 ****
  	OldUmask = umask(0);
  	OpMode = MD_DELIVER;
  	MotherPid = getpid();
! 	FullName = getenv("NAME");
  
  #ifdef LOG_MAIL
  	openlog("sendmail", LOG_PID, LOG_MAIL);
--- 237,246 ----
  	OldUmask = umask(0);
  	OpMode = MD_DELIVER;
  	MotherPid = getpid();
! 	if (daemonmode)
! 		FullName = NULL;
! 	else
! 		FullName = getenv("NAME");
  
  #ifdef LOG_MAIL
  	openlog("sendmail", LOG_PID, LOG_MAIL);
***************
*** 266,271 ****
--- 272,289 ----
  			setclass('w', *av++);
  		}
  
+ #ifdef DEF_DOMAIN
+ 		/* domainname */
+ 		(void) mydomainname(jbuf, sizeof jbuf);
+ 		if (jbuf[0] != '\0')
+ 		{
+ 			if (tTd(0, 4))
+ 				printf("domain name: %s\n", jbuf);
+ 			p = newstr(jbuf);
+ 			define('m', p, CurEnv);
+ 		}
+ #endif
+ 
  		/* version */
  		define('v', Version, CurEnv);
  	}
--
  Charles Seeger            216 Larsen Hall             +1 904 392 8935
  Electrical Engineering    University of Florida       "Bye, Opus.
  seeger@iec.ufl.edu        Gainesville, FL 32611       It's been fun."