[comp.mail.elm] Elm Patch 8 of 8

taylor@hpldat.UUCP (Dave Taylor) (05/03/87)

This is Elm Patch Kit #8 of 8, the final of the set, and contains patches for:

  utils/Makefile.mstr   utils/listalias.c   test/test.mail   filter/filter.c
  filter/rules.c        filter/actions.c    filter/parse.c   filter/utils2.c
  Overview              Instructions        Configure.sh     Makefile.mstr
  NOTICE

Please feed this directly to 'patch'.

Index: utils/Makefile.mstr

***************
*** 29,31
  
! ../bin/from: from.c ../src/opt_utils.o ../src/string2.o
  	${CC} ${CFLAGS} ${DEFINE} from.c ../src/opt_utils.o \

--- 29,31 -----
  
! ../bin/from: from.c ../src/opt_utils.o ../src/string2.o ../src/getopt.o
  	${CC} ${CFLAGS} ${DEFINE} from.c ../src/opt_utils.o \
***************
*** 31,33
  	${CC} ${CFLAGS} ${DEFINE} from.c ../src/opt_utils.o \
! 	../src/string2.o -o ../bin/from
  

--- 31,33 -----
  	${CC} ${CFLAGS} ${DEFINE} from.c ../src/opt_utils.o \
! 	../src/string2.o ../src/getopt.o -o ../bin/from
  

Index: utils/listalias.c

***************
*** 57,59
  	    if ((datafile = fopen(fd_data, "r")) == NULL) {
! 	      fprintf("Opened %s hash file, but couldn't open data file!\n",
  		       count? "system" : "user");

--- 57,59 -----
  	    if ((datafile = fopen(fd_data, "r")) == NULL) {
! 	      printf("Opened %s hash file, but couldn't open data file!\n",
  		       count? "system" : "user");

Index: test/test.mail

***************
*** 40,42
  
! I believe your introduction referred to the uucp network.  usenet is the networXk news
  software mechanism and isn't a "network".

--- 40,42 -----
  
! I believe your introduction referred to the uucp network.  usenet is the network news
  software mechanism and isn't a "network".
***************
*** 64,66
  backing up directories: 
! 	./users/fh ./users/rmd ./users/vince ./users/roberts ./users/row ./users/dt ./Xlost+found ./users/lost+found ./users/scb ./users/kevin ./users/du
  

--- 64,66 -----
  backing up directories: 
! 	./users/fh ./users/rmd ./users/vince ./users/roberts ./users/row ./users/dt ./lost+found ./users/lost+found ./users/scb ./users/kevin ./users/du
  
***************
*** 77,79
  backing up directories: 
! 	./users/fh ./users/rmd ./users/vince ./users/roberts ./users/row ./users/dt ./Xlost+found ./users/lost+found ./users/scb ./users/kevin ./users/du
  

--- 77,79 -----
  backing up directories: 
! 	./users/fh ./users/rmd ./users/vince ./users/roberts ./users/row ./users/dt ./lost+found ./users/lost+found ./users/scb ./users/kevin ./users/du
  
***************
*** 83,85
  backing up directories: 
! 	./users/sbh ./users/ges ./users/cpb ./users/amy ./net ./users/root ./users/balXza ./dev ./users/remple ./users/jr ./users/mwr ./users/larryf
  

--- 83,85 -----
  backing up directories: 
! 	./users/sbh ./users/ges ./users/cpb ./users/amy ./net ./users/root ./users/balza ./dev ./users/remple ./users/jr ./users/mwr ./users/larryf
  
***************
*** 120,122
  Received: by HP-VENUS via CSNET; 7 Aug 1985 09:11:37-PDT (Wed)
! Received: from sumex-aim.arpa by csnet-relay.arpa id a015812; 6 Aug 85 12:14 EDXT
  To: hpcnof!veeger!hpcnou!dat%hplabs.csnet@CSNET-RELAY

--- 120,122 -----
  Received: by HP-VENUS via CSNET; 7 Aug 1985 09:11:37-PDT (Wed)
! Received: from sumex-aim.arpa by csnet-relay.arpa id a015812; 6 Aug 85 12:14 EDT
  To: hpcnof!veeger!hpcnou!dat%hplabs.csnet@CSNET-RELAY
***************
*** 197,199
  >From root Mon Oct 21 10:28:58 1985 remote from hpcnof
! >From DLS.MDC%office-X.arpa@CSNET-RELAY  Mon Oct 21 01:57:05 1985 remote from hXplabs
  Received: by HP-VENUS id AA17376; Mon, 21 Oct 85 01:57:05 pdt

--- 197,199 -----
  >From root Mon Oct 21 10:28:58 1985 remote from hpcnof
! >From DLS.MDC%office-X.arpa@CSNET-RELAY  Mon Oct 21 01:57:05 1985 remote from hplabs
  Received: by HP-VENUS id AA17376; Mon, 21 Oct 85 01:57:05 pdt
***************
*** 200,202
  Date: 21 Oct 85 01:02 EDT
! From: Duane Stone / McDonnell Douglas / CSC-ASD <hplabs!DLS.MDC%office-1.arpa@CXSNET-RELAY>
  Received: by HP-VENUS via CSNET; 21 Oct 1985 01:57:01-PDT (Mon)

--- 200,202 -----
  Date: 21 Oct 85 01:02 EDT
! From: Duane Stone / McDonnell Douglas / CSC-ASD <hplabs!DLS.MDC%office-1.arpa@CSNET-RELAY>
  Received: by HP-VENUS via CSNET; 21 Oct 1985 01:57:01-PDT (Mon)
***************
*** 202,204
  Received: by HP-VENUS via CSNET; 21 Oct 1985 01:57:01-PDT (Mon)
! Received: from office-1.arpa by CSNET-RELAY.ARPA id a019220; 21 Oct 85 1:18 EDTX
  To: Dave Taylor <hpcnou!dat%hplabs.csnet@CSNET-RELAY>

--- 202,204 -----
  Received: by HP-VENUS via CSNET; 21 Oct 1985 01:57:01-PDT (Mon)
! Received: from office-1.arpa by CSNET-RELAY.ARPA id a019220; 21 Oct 85 1:18 EDT
  To: Dave Taylor <hpcnou!dat%hplabs.csnet@CSNET-RELAY>
***************
*** 207,209
  Message-Id: <MDC-DLS-7W9CS@OFFICE-1>
! Comment: Dave -- this is the body of the message I previously 'sent' to you viaX
  

--- 207,209 -----
  Message-Id: <MDC-DLS-7W9CS@OFFICE-1>
! Comment: Dave -- this is the body of the message I previously 'sent' to you via
  
***************
*** 211,213
  
! I might suggest re-wording the para on Author -- my associates might object to X
  'strange' -- something like:

--- 211,213 -----
  
! I might suggest re-wording the para on Author -- my associates might object to 
  'strange' -- something like:
***************
*** 219,221
  
!    Length:  This is computed when the message is sent and gives the recipients X
     an estimate of the number of pages in the document.

--- 219,221 -----
  
!    Length:  This is computed when the message is sent and gives the recipients 
     an estimate of the number of pages in the document.
***************
*** 228,230
  
!    Used to declare whether a Journal item should be Public or Private (to thoseX
     that are on the distribution list or Extended Access list)

--- 228,230 -----
  
!    Used to declare whether a Journal item should be Public or Private (to those
     that are on the distribution list or Extended Access list)
***************
*** 299,301
     Used to submit the message to the Journal.  The adressees receive a short 
!    citation with other header fields and a "Location:" field pointing to a fileX
     in an electronic library.

--- 299,301 -----
     Used to submit the message to the Journal.  The adressees receive a short 
!    citation with other header fields and a "Location:" field pointing to a file
     in an electronic library.
***************
*** 317,319
     Used to send a message "in-turn" to addressees in the "To:" field -- as 
!    opposed to the broadcast method of delivery where everyone gets the message X
     "simultaneously".  Any addresses in the "Cc:" field receive a copy of the 

--- 317,319 -----
     Used to send a message "in-turn" to addressees in the "To:" field -- as 
!    opposed to the broadcast method of delivery where everyone gets the message 
     "simultaneously".  Any addresses in the "Cc:" field receive a copy of the 
***************
*** 328,331
  
!    Created when the user employs the Sign command; used to electronically sign X
!    a message.  It affixes a signature-block to a message.  A "Verify Signature"X
     command is available to recipients that lets them find out if anyone has 

--- 328,331 -----
  
!    Created when the user employs the Sign command; used to electronically sign 
!    a message.  It affixes a signature-block to a message.  A "Verify Signature"
     command is available to recipients that lets them find out if anyone has 

Index: filter/filter.c

***************
*** 19,20
  
     (C) Copyright 1986, Dave Taylor

--- 19,23 -----
  
+     Rev 2.0: knows about From: and Reply-To: 
+     Fix: knows that mail lines are approx. ~5K or greater...
+ 
     (C) Copyright 1986, Dave Taylor
***************
*** 22,24
  
- 
  #include <stdio.h>

--- 25,26 -----
  
  #include <stdio.h>
***************
*** 26,32
  #include <ctype.h>
! #ifdef BSD
! # include <sys/time.h>
! #else
! # include <time.h>
! #endif
  #include <fcntl.h>

--- 28,30 -----
  #include <ctype.h>
! #include <time.h>
  #include <fcntl.h>
***************
*** 46,48
  	char filename[SLEN],			/* name of the temp file    */
! 	     buffer[LONG_SLEN];			/* input buffer space       */
  	int  in_header = TRUE,			/* for header parsing       */

--- 44,46 -----
  	char filename[SLEN],			/* name of the temp file    */
! 	     buffer[MAX_LINE_LEN];		/* input buffer space       */
  	int  in_header = TRUE,			/* for header parsing       */
***************
*** 58,59
  	strcpy(username, passwd_entry->pw_name);
  

--- 56,58 -----
  	strcpy(username, passwd_entry->pw_name);
+ 	to[0] = '\0';	/* nothing read in yet, right? */
  
***************
*** 68,70
  	    case 'l' : log_actions_only = TRUE;			break;
! 	    case 'r' : if (get_filter_rules() == -1)
  		         fprintf(stderr,"Couldn't get rules!\n");

--- 67,70 -----
  	    case 'l' : log_actions_only = TRUE;			break;
! 	    case 'r' : printing_rules = TRUE;		
! 	               if (get_filter_rules() == -1)
  		         fprintf(stderr,"Couldn't get rules!\n");
***************
*** 96,98
  
! 	while (gets(buffer) != NULL) {
  	  if (in_header) {

--- 96,101 -----
  
! 	while (fgets(buffer, MAX_LINE_LEN, stdin) != NULL) {
! 
! 	  remove_return(buffer);
! 
  	  if (in_header) {
***************
*** 106,108
  	      save_subject(buffer);
! 	    else if (the_same(buffer, "To:")) {
  	      in_to++;

--- 109,111 -----
  	      save_subject(buffer);
! 	    else if (the_same(buffer, "To:") || the_same(buffer, "Cc:")) {
  	      in_to++;
***************
*** 112,113
  	      already_been_forwarded++;	/* could be a loop here! */
  	    else if (strlen(buffer) < 2) 

--- 115,122 -----
  	      already_been_forwarded++;	/* could be a loop here! */
+ #ifdef USE_EMBEDDED_ADDRESSES
+ 	    else if (the_same(buffer, "From:"))
+ 	      save_embedded_address(buffer, "From:");
+ 	    else if (the_same(buffer, "Reply-To:"))
+ 	      save_embedded_address(buffer, "Reply-To:");
+ #endif
  	    else if (strlen(buffer) < 2) 
***************
*** 196,198
  {
! 	/** save all but the word "To:" for the to list **/
  

--- 205,207 -----
  {
! 	/** save all but the word "To:" or "Cc:" for the to list **/
  
***************
*** 198,200
  
! 	register int skip = 3;	/* skip "To:" initially */
  

--- 207,209 -----
  
! 	register int skip = 3;	/* skip "To:" or "Cc:" initially */
  
***************
*** 202,204
  
! 	strcpy(to, (char *) buffer + skip);
  }

--- 211,213 -----
  
! 	strcat(to, (char *) buffer + skip);
  }
***************
*** 204,204
  }

--- 213,262 -----
  }
+ 
+ #ifdef USE_EMBEDDED_ADDRESSES
+ 
+ save_embedded_address(buffer, fieldname)
+ char *buffer, *fieldname;
+ {
+ 	/** this will replace the 'from' address with the one given, 
+ 	    unless the address is from a 'reply-to' field (which overrides 
+ 	    the From: field).  The buffer given to this routine can have one 
+             of three forms:
+ 		fieldname: username <address>
+ 		fieldname: address (username)
+ 		fieldname: address
+ 	**/
+ 	
+ 	static int processed_a_reply_to = 0;
+ 	char address[SLEN];
+ 	register int i, j = 0;
+ 
+ 	/** first let's extract the address from this line.. **/
+ 
+ 	if (buffer[strlen(buffer)-1] == '>') {	/* case #1 */
+ 	  for (i=strlen(buffer)-1; buffer[i] != '<' && i > 0; i--)
+ 		/* nothing - just move backwards .. */ ;
+ 	  i++;	/* skip the leading '<' symbol */
+ 	  while (buffer[i] != '>')
+ 	    address[j++] = buffer[i++];
+ 	  address[j] = '\0';
+ 	}
+ 	else {	/* get past "from:" and copy until white space or paren hit */
+ 	  for (i=strlen(fieldname); whitespace(buffer[i]); i++)
+ 	     /* skip past that... */ ;
+ 	  while (buffer[i] != '(' && ! whitespace(buffer[i]))
+ 	    address[j++] = buffer[i++];
+ 	  address[j] = '\0';
+ 	}
+ 
+ 	/** now let's see if we should overwrite the existing from address
+ 	    with this one or not.. **/
+ 
+ 	if (processed_a_reply_to)
+ 	  return;	/* forget it! */
+ 
+ 	strcpy(from, address);			/* replaced!! */
+ 
+ 	if (strcmp(fieldname, "Reply-To:") == 0)
+ 	  processed_a_reply_to++;
+ }
+ #endif

Index: filter/rules.c

***************
*** 11,17
  #include <ctype.h>
! #ifdef BSD
! # include <sys/time.h>
! #else
! # include <time.h>
! #endif
  #include <fcntl.h>

--- 11,13 -----
  #include <ctype.h>
! #include <time.h>
  #include <fcntl.h>
***************
*** 21,22
  
  int

--- 17,20 -----
  
+ char *listrule();
+ 
  int
***************
*** 50,53
         "%sfilter (%s): Error: rules based on 'contains' are not implemented!\n",
! 			     BEEP, username);
! 			     exit(0);
  	    }

--- 48,53 -----
         "%sfilter (%s): Error: rules based on 'contains' are not implemented!\n",
! 			    BEEP, username);
! 			    exit(0); 		
! 
! 	      case ALWAYS: not = FALSE; x = TRUE;			break;
  	    }
***************
*** 77,79
  
! expand_macros(word, buffer, line)
  char *word, *buffer;

--- 77,79 -----
  
! expand_macros(word, buffer, line, display)
  char *word, *buffer;
***************
*** 79,81
  char *word, *buffer;
! int  line;
  {

--- 79,81 -----
  char *word, *buffer;
! int  line, display;
  {
***************
*** 91,93
  		%y	= year		  
! 	    or simply copies word into buffer.
  	**/

--- 91,94 -----
  		%y	= year		  
! 	    or simply copies word into buffer. If "display" is set then
! 	    instead it puts "<day-of-month>" etc. etc. in the output.
  	**/
***************
*** 104,106
  	      case 'r' : buffer[j] = '\0';
! 			 strcat(buffer, from);
  	                 j = strlen(buffer);

--- 105,110 -----
  	      case 'r' : buffer[j] = '\0';
! 			 if (display)
! 	 		   strcat(buffer, "<return-address>");
! 			 else
! 			   strcat(buffer, from);
  	                 j = strlen(buffer);
***************
*** 109,111
  	      case 's' : buffer[j] = '\0';
! 			 strcat(buffer, subject);
  	                 j = strlen(buffer);

--- 113,121 -----
  	      case 's' : buffer[j] = '\0';
! 			 if (display)
! 	 		   strcat(buffer, "<subject>");
! 			 else {
! 			   strcat(buffer, "\"");
! 			   strcat(buffer, subject);
! 			   strcat(buffer, "\"");
! 			 }
  	                 j = strlen(buffer);
***************
*** 114,116
  	      case 'S' : buffer[j] = '\0';
! 			 if (! the_same(subject, "Re:")) 
  			   strcat(buffer, subject);

--- 124,130 -----
  	      case 'S' : buffer[j] = '\0';
! 			 if (display)
! 	 		   strcat(buffer, "<Re: subject>");
! 			 else {
! 			   if (! the_same(subject, "Re:")) 
! 			     strcat(buffer, "\"Re: ");
  			   strcat(buffer, subject);
***************
*** 116,118
  			   strcat(buffer, subject);
! 			 strcat(buffer, subject);
  	                 j = strlen(buffer);

--- 130,133 -----
  			   strcat(buffer, subject);
! 			   strcat(buffer, "\"");
! 			 }
  	                 j = strlen(buffer);
***************
*** 121,123
  	      case 'd' : get_the_time(); buffer[j] = '\0';
! 			 strcat(buffer, itoa(timerec->tm_mday,FALSE));
  	                 j = strlen(buffer);

--- 136,141 -----
  	      case 'd' : get_the_time(); buffer[j] = '\0';
! 			 if (display)
! 			   strcat(buffer, "<day-of-month>");
! 			 else
! 			   strcat(buffer, itoa(timerec->tm_mday,FALSE));
  	                 j = strlen(buffer);
***************
*** 126,128
  	      case 'D' : get_the_time(); buffer[j] = '\0';
! 			 strcat(buffer, itoa(timerec->tm_wday,FALSE));
  	                 j = strlen(buffer);

--- 144,149 -----
  	      case 'D' : get_the_time(); buffer[j] = '\0';
! 			 if (display)
! 			   strcat(buffer, "<day-of-week>");
! 			 else
! 			   strcat(buffer, itoa(timerec->tm_wday,FALSE));
  	                 j = strlen(buffer);
***************
*** 131,133
  	      case 'm' : get_the_time(); buffer[j] = '\0';
! 			 strcat(buffer, itoa(timerec->tm_mon,FALSE));
  	                 j = strlen(buffer);

--- 152,157 -----
  	      case 'm' : get_the_time(); buffer[j] = '\0';
! 			 if (display)
! 			   strcat(buffer, "<month>");
! 			 else
! 			   strcat(buffer, itoa(timerec->tm_mon,FALSE));
  	                 j = strlen(buffer);
***************
*** 136,138
  	      case 'y' : get_the_time(); buffer[j] = '\0';
! 			 strcat(buffer, itoa(timerec->tm_year,FALSE));
  	                 j = strlen(buffer);

--- 160,165 -----
  	      case 'y' : get_the_time(); buffer[j] = '\0';
! 			 if (display)
! 			   strcat(buffer, "<year>");
! 			 else
! 			   strcat(buffer, itoa(timerec->tm_year,FALSE));
  	                 j = strlen(buffer);
***************
*** 141,143
  	      case 'h' : get_the_time(); buffer[j] = '\0';
! 			 strcat(buffer, itoa(timerec->tm_hour,FALSE));
  	                 j = strlen(buffer);

--- 168,173 -----
  	      case 'h' : get_the_time(); buffer[j] = '\0';
! 			 if (display)
! 			   strcat(buffer, "<hour>");
! 			 else
! 			   strcat(buffer, itoa(timerec->tm_hour,FALSE));
  	                 j = strlen(buffer);
***************
*** 146,150
  	      case 't' : get_the_time(); buffer[j] = '\0';
! 			 strcat(buffer, itoa(timerec->tm_hour,FALSE));
! 			 strcat(buffer, ":");
! 			 strcat(buffer, itoa(timerec->tm_min,TRUE));
  	                 j = strlen(buffer);

--- 176,184 -----
  	      case 't' : get_the_time(); buffer[j] = '\0';
! 			 if (display)
! 			   strcat(buffer, "<time>");
! 		         else {
! 			   strcat(buffer, itoa(timerec->tm_hour,FALSE));
! 			   strcat(buffer, ":");
! 			   strcat(buffer, itoa(timerec->tm_min,TRUE));
! 			 }
  	                 j = strlen(buffer);
***************
*** 161,163
  	  else 
! 	    buffer[j++] = word[i];
  	}

--- 195,197 -----
  	  else 
! 	    buffer[j++] = (word[i] == '_' ? ' ' : word[i]);
  	}
***************
*** 175,176
  	while (++i < total_rules) {
  	  printf("\nRule %d:  if (", i+1);

--- 209,216 -----
  	while (++i < total_rules) {
+ 	  if (rules[i].condition->matchwhat == ALWAYS) {
+ 	    printf("\nRule %d:  ** always ** \n\t%s %s\n", i+1,
+ 		 actionname(rules[i].action), listrule(rules[i].argument2));
+ 	    continue;
+ 	  }
+ 
  	  printf("\nRule %d:  if (", i+1);
***************
*** 202,204
  		 actionname(rules[i].action), 
! 		 rules[i].argument2);
  	}

--- 242,244 -----
  		 actionname(rules[i].action), 
! 		 listrule(rules[i].argument2));
  	}
***************
*** 259,260
  	return(-1);
  }

--- 299,316 -----
  	return(-1);
+ }
+ 
+ char *listrule(rule)
+ char *rule;
+ {
+ 	/** simply translates all underscores into spaces again on the
+ 	    way past... **/
+ 
+ 	static char buffer[SLEN];
+ 	register int i;
+ 
+ 	for (i=0; i < strlen(rule); i++)
+ 	  buffer[i] = (rule[i] == '_' ? ' ' : rule[i]);
+ 	buffer[i] = '\0';
+ 
+ 	return( (char *) buffer);
  }

Index: filter/actions.c

***************
*** 39,41
  
! 	  if ((tempfd = fopen(tempfile, "r")) < 0) {
  	    fprintf(stderr, "%sfilter (%s): Can't open temp file %s!!\n", 

--- 39,41 -----
  
! 	  if ((tempfd = fopen(tempfile, "r")) == NULL) {
  	    fprintf(stderr, "%sfilter (%s): Can't open temp file %s!!\n", 
***************
*** 134,135
  
  	  while (fgets(buffer, sizeof(buffer), tempfd) != NULL) {

--- 134,136 -----
  
+ 
  	  while (fgets(buffer, sizeof(buffer), tempfd) != NULL) {
***************
*** 141,142
  	  }
  

--- 142,145 -----
  	  }
+ 
+ 	  fputs("\n", mailfd);
  

Index: filter/parse.c

***************
*** 130,132
  
! 	      else if (the_same(word,"?") || the_same(word, "then")) {
  

--- 130,133 -----
  
! 	      else if (the_same(word,"?") || the_same(word, "then") || 
! 		       the_same(word, "always")) {
  
***************
*** 141,143
  
! 		cond->matchwhat = lasttype;
  	        if (relop == NONE) relop = EQ;	/* otherwise can't do -relop */

--- 142,148 -----
  
! 	        if (the_same(word, "always"))
! 		  cond->matchwhat = ALWAYS;	/* so it's a hack... */
! 		else
! 		  cond->matchwhat = lasttype;
! 
  	        if (relop == NONE) relop = EQ;	/* otherwise can't do -relop */
***************
*** 286,288
  	      rules[total_rules].action = action;
! 	      expand_macros(action_argument, rules[total_rules].argument2,line);
  	      total_rules++;

--- 291,294 -----
  	      rules[total_rules].action = action;
! 	      expand_macros(action_argument, rules[total_rules].argument2,line,
! 			    printing_rules);
  	      total_rules++;

Index: filter/utils2.c

***************
*** 9,10
  
  #ifdef BSD

--- 9,12 -----
  
+ #include "defs.h"
+ 
  #ifdef BSD
***************
*** 14,15
  #ifdef NEED_GETHOSTNAME
  #  include <sys/utsname.h>

--- 16,18 -----
  #ifdef NEED_GETHOSTNAME
+ #  include <sys/types.h>
  #  include <sys/utsname.h>
***************
*** 33,36
  	(void) strncpy(hostname,name.nodename,size-1);
! 	hostname[size] = '\0';
! 
  }

--- 36,38 -----
  	(void) strncpy(hostname,name.nodename,size-1);
! 	hostname[size-1] = '\0';
  }

Index: Overview

***************
*** 6,9
  	This file discusses the functionality of the Elm mail system
! and explains some of the motivation behind the creation and of various
! features.
  

--- 6,8 -----
  	This file discusses the functionality of the Elm mail system
! and explains some of the motivation behind the various features.
  
***************
*** 117,119
  screens and commands, are legally copyrighted by the author, and while
! they can be used, and abused for public domain systems, will be in 
  violation of the law if used in systems or programs sold for profit.

--- 116,118 -----
  screens and commands, are legally copyrighted by the author, and while
! they can be used, and abused, for public domain systems, it will be in 
  violation of the law if used in systems or programs sold for profit.
***************
*** 132,134
  				
! 				hplabs!taylor
  

--- 131,133 -----
  				
! 				taylor@hplabs.HP.COM
  

Index: Instructions

***************
*** 4,6
  
! 			Last Update: July 17th, 1986
  

--- 4,6 -----
  
! 		        Last Update: January 19th, 1987
  
***************
*** 34,36
  
!     When that's done, or even if it fails (don't worry too much about it)
  

--- 34,37 -----
  
!     When that's done, or even if it fails (don't worry too much about it) AS
! ROOT, do the following:
  
***************
*** 50,52
      "answer", "arepdaemon", "autoreply", "fastmail", "from", 
!     "elm", "newalias", "newmail", "printmail", and "readmsg".
  

--- 51,53 -----
      "answer", "arepdaemon", "autoreply", "fastmail", "from", 
!     "elm", "newalias", "newmail", "printmail", "readmsg" and "listalias".
  
***************
*** 65,67
  
! should say "no mail" if nothing's in your incoming mailbox, and
  

--- 66,69 -----
  
! should say "no mail" if nothing's in your incoming mailbox or should
! start up the Elm program if there is, and
  
***************
*** 71,78
  A)lias C)urrent message for each of the eight messages to confirm that
! the reply/address system is working okay.   Now try to C)hange mailboxes
! to the file "test/test.note" and use the '%' key to see if the mailer is
! generating valid return addresses for the notes (If not, then you might
! need to install the pathalias database - see "sysdefs.h" for more info)
! Change back to "test/test.mail" and Q)uit without having marked anything 
! for deletion...answer the questions accordingly.
  

--- 73,76 -----
  A)lias C)urrent message for each of the eight messages to confirm that
! the reply/address system is working okay.  Now Q)uit without having 
! marked anything for deletion...answer the questions accordingly.
  
***************
*** 131,132
  
! 	(C) Copyright 1986, Dave Taylor

--- 129,130 -----
  
! 	(C) Copyright 1986, 1987 by Dave Taylor

Index: Configure.sh

***************
*** 47,49
  
!        		    Elm Configuration Script, v4
         

--- 47,49 -----
  
!        		    Elm Configuration Script, v5
         
***************
*** 88,89
  
  exit 0

--- 88,94 -----
  
+ if [ -d /.attbin ]
+ then
+   echo "pyramid" > .osname
+ fi
+ 
  exit 0
***************
*** 130,132
      sun)	NAME="BSD"; OS_FLAG="";		;;
!     pyramid)	NAME="Pyramid BSD"; OS_FLAG="PYRAMID";	;;
      amdahl)	NAME="UTS"; OS_FLAG="UTS";  	;;

--- 135,137 -----
      sun)	NAME="BSD"; OS_FLAG="";		;;
!     pyramid|osx*)NAME="Pyramid BSD"; OS_FLAG="PYRAMID";	;;
      amdahl)	NAME="UTS"; OS_FLAG="UTS";  	;;
***************
*** 472,474
  
! $rm -f a.out .test.c .vfork .log
  

--- 477,479 -----
  
! $rm -f a.out .test.c .vfork .log .test.o
  
***************
*** 497,499
  
! $rm -f a.out .test.c .hostname .log
  

--- 502,504 -----
  
! $rm -f a.out .test.c .hostname .log .test.o
  
***************
*** 499,500
  
  # next let's see if we have long variable names...

--- 504,530 -----
  
+ # how about the cuserid() routine?
+ 
+ cat << EOF > .test.c
+ main()
+ {
+ 	(void) cuserid();
+ }
+ EOF
+ 
+ cat << EOF > .cuserid
+ cc .test.c
+ EOF
+ 
+ sh .cuserid > .log 2>& 1
+ 
+ if [ "`cat .log | wc -l`" -eq "0" ]
+ then
+   echo "You have the 'cuserid()' system call..."
+ else
+   echo "s/\/\*\* #define NEED_CUSERID \*\*\//#define NEED_CUSERID/" \
+   >> $SED1
+ fi
+ 
+ $rm -f a.out .test.c .cuserid .log .test.o
+ 
  # next let's see if we have long variable names...
***************
*** 527,529
  
! $rm -f a.out .test.c .varnames .log
  

--- 557,559 -----
  
! $rm -f a.out .test.c .varnames .log .test.o
  
***************
*** 607,608
  
  case $OS_FLAG in 

--- 637,651 -----
  
+ if [ ! -f /usr/lib/libtermcap.a -a ! -f /lib/libtermcap.a ]
+ then
+   if [ ! -f /usr/lib/libtermlib.a -a ! -f /lib/libtermlib.a ]
+   then
+     echo "You don't have termcap or termlib!  Using terminfo but it might fail"
+     termlib=termlib
+   else  
+    termlib=termlib
+   fi
+ else
+   termlib=termcap
+ fi
+     
  case $OS_FLAG in 
***************
*** 612,614
         then
!          echo "s/>libs</-ltermcap -ldbm/" >> $SED2
         else

--- 655,657 -----
         then
!          echo "s/>libs</-l$termlib -ldbm/" >> $SED2
         else
***************
*** 614,616
         else
!          echo "s/>libs</-ltermcap/"       >> $SED2
         fi

--- 657,659 -----
         else
!          echo "s/>libs</-l$termlib/"       >> $SED2
         fi
***************
*** 622,624
         then
!          echo "s/>libs</-ltermcap -ldbm/"     >> $SED2
         else

--- 665,667 -----
         then
!          echo "s/>libs</-l$termlib -ldbm/"     >> $SED2
         else
***************
*** 624,626
         else
!          echo "s/>libs</-ltermcap/"     >> $SED2
         fi

--- 667,669 -----
         else
!          echo "s/>libs</-l$termlib/"     >> $SED2
         fi
***************
*** 642,644
         then
!          echo "s/>libs</-ltermcap -ldbm/" >> $SED2
         else

--- 685,687 -----
         then
!          echo "s/>libs</-l$termlib -ldbm/" >> $SED2
         else
***************
*** 644,646
         else
!          echo "s/>libs</-ltermcap/"       >> $SED2
         fi

--- 687,689 -----
         else
!          echo "s/>libs</-l$termlib/"       >> $SED2
         fi
***************
*** 749,751
    then
!     echo "s^/bin/rm^$answer^" >> $SED1
    fi

--- 792,794 -----
    then
!     echo "s^/bin/cat^$answer^" >> $SED1
    fi
***************
*** 753,755
   
! if [ ! -c /dev/rct ]
  then

--- 796,798 -----
   
! if [ ! -f /dev/rct ]
  then
***************
*** 755,757
  then
!   if [ ! -c /dev/rmt ]
    then

--- 798,800 -----
  then
!   if [ ! -f /dev/rmt ]
    then

Index: Makefile.mstr

***************
*** 23,26
  LIB=    /usr/local/lib
! MAN=	/usr/man/man1
! CATMAN= /usr/man/cat1
  SHAR=   /usr/local/bin/shar -s 60000

--- 23,26 -----
  LIB=    /usr/local/lib
! MAN=	/usr/local/man/man1
! CATMAN= /usr/local/man/cat1
  SHAR=   /usr/local/bin/shar -s 60000
***************
*** 90,92
  doc/Filter.fmtd: doc/Filter.guide
! 	${TBL} doc/Filter.guide | ${FORMATTER} -mm > doc/Filter.fmtd
  

--- 90,92 -----
  doc/Filter.fmtd: doc/Filter.guide
! 	${FORMATTER} -mm doc/Filter.guide > doc/Filter.fmtd
  
***************
*** 104,106
  	
! bin/utils: ${UTILSRC} ${MISCHHDRS}
  	cd utils; make 'DEFINE=${DEFINE}' 'LIBS=${LIB2}' all

--- 104,106 -----
  	
! bin/utils: ${UTILSRC} ${MISCHDRS}
  	cd utils; make 'DEFINE=${DEFINE}' 'LIBS=${LIB2}' all

Index: NOTICE

***************
*** 4,6
  
! 		   	(C) Copyright 1986, Dave Taylor
  

--- 4,6 -----
  
! 		    (C) Copyright 1986, 1987, by Dave Taylor
  
***************
*** 13,15
  
!         1. You may without additional permission from the author, distribute 
             Elm or components of Elm, with or without additions developed by 

--- 13,15 -----
  
!         1. You may, without additional permission from the author, distribute 
             Elm or components of Elm, with or without additions developed by 
***************
*** 19,21
             and provided that those interested only in Elm must be notified 
!            that it is product freely available from the author.
  

--- 19,21 -----
             and provided that those interested only in Elm must be notified 
!            that it is a product freely available from the author.
  
***************
*** 23,25
             or without additions developed by you or others, then you must 
!            either make available source of all portions of the Elm program 
             (exclusive of any additions made by you or by others) upon request, 

--- 23,25 -----
             or without additions developed by you or others, then you must 
!            either make available the source to all portions of the Elm system 
             (exclusive of any additions made by you or by others) upon request, 
***************
*** 35,38
  
!         5. Lastly, any users of this software must be notified that it is any 
!            without warrantee, or guarantee of any nature, express or implied, 
             nor is there any fitness for use represented.

--- 35,38 -----
  
!         5. Lastly, any users of this software must be notified that it is
!            without warrantee or guarantee of any nature, express or implied, 
             nor is there any fitness for use represented.
***************
*** 51,53
  
! NOTE that it is not permitted to copy, sublicense distribute or transfer any
  of the Elm software except as expressly indicated herein.  Any attempts to

--- 51,53 -----
  
! NOTE that it is not permitted to copy, sublicense, distribute or transfer any
  of the Elm software except as expressly indicated herein.  Any attempts to

End of 6, 
  u
  u