[comp.sources.bugs] Mush 6.4 to 6.5 Patch Kit, Part 4 of 6

schaefer@ogccse.ogc.edu (Barton E. Schaefer) (04/29/89)

Part 4 of the Mush 6.5 Upgrade Kit.  Read the instructions in part 1.
---------------------------------------------------------------------------
Prereq: Part3
*** mush-6.4/kit.check	Tue Apr 18 17:29:04 1989
--- kit.check	Tue Apr 18 17:29:04 1989
***************
*** 1 ****
!  Part3 
--- 1 ----
!  Part3-check 
*** mush-6.4/msgs.c	Fri Mar 24 10:13:05 1989
--- msgs.c	Tue Apr 18 09:38:20 1989
***************
*** 313,321 ****
      }
  #ifdef DOT_LOCK
      if ((i = dot_lock(mailfile)) == 0)
! #endif /* DOT_LOCK */
! #ifdef DOT_LOCK
!     mail_fp = mask_fopen(mailfile, "w+");
  #else /* !DOT_LOCK */
      /* We can't lock a file unless we have an fd, but "w+" will zero
       * the file.  If the lock later failed for any reason (possible
--- 313,319 ----
      }
  #ifdef DOT_LOCK
      if ((i = dot_lock(mailfile)) == 0)
! 	mail_fp = mask_fopen(mailfile, "w+");
  #else /* !DOT_LOCK */
      /* We can't lock a file unless we have an fd, but "w+" will zero
       * the file.  If the lock later failed for any reason (possible
***************
*** 418,440 ****
  #endif /* SYSV */
  #endif /* !DOT_LOCK */
  
-     close_lock(mailfile, mail_fp);
- 
- #ifdef SUNTOOL
-     if (istool) {
- 	mail_timer.it_value.tv_sec = time_out;
- 	setitimer(ITIMER_REAL, &mail_timer, NULL);
-     }
- #endif /* SUNTOOL */
- 
      /* some users like to have zero length folders for frequent usage */
      if (mbox)
  	fclose(mbox);
      if (j) {
- 	long times[2];
- 	times[1] = time(&times[0]) - (long)2;
- 	if (!strcmp(mailfile, spoolfile) && utime(mailfile, times))
- 	    error("utime");
  	print_more(": saved %d message%s\n", j, (j==1)? NO_STRING: "s");
      } else
  #ifdef HOMEMAIL
--- 416,425 ----
***************
*** 452,457 ****
--- 437,458 ----
      if (k)
  	print("saved %d message%s in %s\n",k,(k==1)? NO_STRING:"s", mbox_file);
  
+     close_lock(mailfile, mail_fp);
+ 
+     if (j) {
+ 	long times[2];
+ 	times[1] = time(&times[0]) - (long)2;
+ 	if (!strcmp(mailfile, spoolfile) && utime(mailfile, times))
+ 	    error("utime");
+     }
+ 
+ #ifdef SUNTOOL
+     if (istool) {
+ 	mail_timer.it_value.tv_sec = time_out;
+ 	setitimer(ITIMER_REAL, &mail_timer, NULL);
+     }
+ #endif /* SUNTOOL */
+ 
      turnoff(glob_flags, IGN_SIGS);
  
      return 1;
***************
*** 525,534 ****
  			char *tail = rindex(mailfile, '/'); 
  			if (tail && tail[1])
  			    b += Strcpy(b, tail+1);
! 			else
  			    /* Fall through */
  		    case 'F':
! 			b += Strcpy(b, mailfile);
  			if (ison(glob_flags, READ_ONLY))
  			    b += Strcpy(b, " [read-only]");
  		    }
--- 526,536 ----
  			char *tail = rindex(mailfile, '/'); 
  			if (tail && tail[1])
  			    b += Strcpy(b, tail+1);
! 			else {
  			    /* Fall through */
  		    case 'F':
! 			    b += Strcpy(b, mailfile);
! 			}
  			if (ison(glob_flags, READ_ONLY))
  			    b += Strcpy(b, " [read-only]");
  		    }
***************
*** 546,552 ****
  	return;
      }
      (void) sprintf(buf,"\"%s\"%s: %d message%s, %d new, %d unread",
! 	mailfile, ison(glob_flags, READ_ONLY)? " [read only]" : "",
  	msg_cnt, (msg_cnt != 1)? "s": NO_STRING, new, unread);
      if (istool || iscurses)
  	(void) sprintf(buf+strlen(buf), ", %d deleted", deleted);
--- 548,555 ----
  	return;
      }
      (void) sprintf(buf,"\"%s\"%s: %d message%s, %d new, %d unread",
! 	trim_filename(mailfile),
! 	ison(glob_flags, READ_ONLY)? " [read only]" : "",
  	msg_cnt, (msg_cnt != 1)? "s": NO_STRING, new, unread);
      if (istool || iscurses)
  	(void) sprintf(buf+strlen(buf), ", %d deleted", deleted);
***************
*** 726,732 ****
  		    char path[256];
  		    parse_from(fp, path);
  		    if (path[0])
! 			(void) sprintf(buf, "From %s %s %s %d %d:%d:00 %d\n",
  			    path, wkday, month, day, hour, mins, year);
  		    bytes = ftell(tmpf);
  		}
--- 729,735 ----
  		    char path[256];
  		    parse_from(fp, path);
  		    if (path[0])
! 			(void)sprintf(buf,"From %s %s %s %d %02d:%02d:00 %d\n",
  			    path, wkday, month, day, hour, mins, year);
  		    bytes = ftell(tmpf);
  		}
*** mush-6.4/mush.1	Fri Mar 24 10:16:50 1989
--- mush.1	Tue Apr 18 09:26:39 1989
***************
*** 123,128 ****
--- 123,140 ----
  .B debug
  command.
  .TP
+ \-e
+ (\-echo)
+ Normally, the program runs with the local echo off and each character
+ typed is processed individually so as to process certain macros and
+ keyboard mappings.  This option will supress this from taking place
+ and the program will only process input after a carriage return has
+ been hit.  Under normal circumstances, this action is transparent to
+ the user and the use of this option is discouraged except when using
+ a debugger with the program.  Note that if this option is specified,
+ any key sequence set by map or map! will not take place.  This option
+ is ignored for curses mode.
+ .TP
  \-F[!] filename
  (\-source)
  This file is the same type as the initialization file read on startup
***************
*** 1862,1871 ****
  .in -4
  .fi
  .sp
! If a `+' or `\-' precedes the list of bits, the specified bits are turned
! on or off respectively, without modifying other bits.
  If no `+' or `\-' is given, then the list of bits is set explicitly and
  all other bits are lost.
  .sp
  Message lists can be piped to the
  .B flags
--- 1874,1886 ----
  .in -4
  .fi
  .sp
! If a `+' or `\-' is included in the list of bits, the specified bits are
! turned on or off respectively, without modifying other bits.
  If no `+' or `\-' is given, then the list of bits is set explicitly and
  all other bits are lost.
+ The `\-' modifier can be escaped with a backslash (i.e., \*Q\\\-\*U) to
+ prevent its interpretation as part of a message range, or it may be given
+ \fIafter\fR the list of bits for the same reason.
  .sp
  Message lists can be piped to the
  .B flags
***************
*** 1873,1884 ****
  .sp
  .nf
  .ti +4
! cmd r 'reply \\!* | flags + r'
  .fi
  .sp
  to mark as
  .I replied-to
! all messages included in a reply,
  .TP
  .BR folder " [\-N] [\-r] [!] [ %[user] | # | & | file ]"
  .RB ( fo )
--- 1888,1899 ----
  .sp
  .nf
  .ti +4
! cmd r 'flags \\!* + r | reply'
  .fi
  .sp
  to mark as
  .I replied-to
! all messages included in a reply.
  .TP
  .BR folder " [\-N] [\-r] [!] [ %[user] | # | & | file ]"
  .RB ( fo )
***************
*** 2281,2287 ****
  You can create personalized headers in your outgoing mail using this command.
  .sp
  .nf
! Usages:
  .in +2
  .ta 2.5i
  my_hdr	print all your headers
--- 2296,2302 ----
  You can create personalized headers in your outgoing mail using this command.
  .sp
  .nf
! Command usage:
  .in +2
  .ta 2.5i
  my_hdr	print all your headers
***************
*** 2310,2315 ****
--- 2325,2339 ----
  The
  .B un_hdr
  command may take `*' as an argument to un_hdr everything set.
+ .sp
+ Example:
+ .sp
+ .ti +2
+ my_hdr Phone-Number: (415) 491-1000
+ .sp
+ Note: You cannot set the headers From: and Date:.  Attempting to do
+ so will not result in any error messages; they will simply be overwritten
+ by the system when your mail is delivered.
  .TP
  .BR pick " [flags] [<pattern>]"
  Allows the user to select particular messages from a folder.
***************
*** 2837,2843 ****
--- 2861,2877 ----
  If a message list is specified, each digest is disassembled to the same
  filename (if given).  If no filename is given and the user did not request
  a merge, then a temporary file is made.
+ .TP
+ .BR update " -N"
+ Updates your current folder writing back changes just as if you
+ .BR quit.
+ The \-N option prevents the headers from being listed once the
+ folder has been read back in once it has been updated.
  .sp
+ See the
+ .BR folder
+ command for complete information.
+ .sp
  .SH VARIABLES
  Shell variables are controlled via the
  .B set
***************
*** 2926,2931 ****
--- 2960,2969 ----
  finished editing a letter to be sent.
  In the tool mode, this is ignored; the Cc list
  is always prompted for after the Subject prompt.
+ If the variable
+ .B edit_hdrs
+ is set, prompting will not occur, but a Cc: line will be added to the
+ edit file.
  .TP
  .B autodelete
  (Boolean)
***************
*** 3112,3117 ****
--- 3150,3156 ----
  autosign2 = \*Qaddress1, address2, ... : <signature>\*U
  .sp
  Each address can be one of these types:
+ .RS
  .TP
  1)  address
  Legal mailing addresses that do not contain comment
***************
*** 3120,3136 ****
  .TP
  2)  *username
  If the username is present on the recipient list, regardless of what
! remove site the user may reside (including locally), the pattern matches.
  .TP
  3)  !hostname !host1!host2...
  Any user can be specified as long as he resides on the specified hostname.
  If a path of hosts is specified, then the user must reside on the end of
  the specified path.
  .TP
! 4)  @dom.ain
! The user must reside on any host within the domain specified.  Neither
! the user or the hostname needs to match; only the domain name must be
! required to match.
  .sp
  Example:
  .sp
--- 3159,3179 ----
  .TP
  2)  *username
  If the username is present on the recipient list, regardless of what
! remote site the user may reside (including locally), the pattern matches.
  .TP
  3)  !hostname !host1!host2...
  Any user can be specified as long as he resides on the specified hostname.
  If a path of hosts is specified, then the user must reside on the end of
  the specified path.
+ .\" Nroff note: there is a problem with the @sub.domain line.  Why?
+ .\" The .br is intended to deal with this.
  .TP
! 4)  @sub.domain
! .br
! The user must reside on any host within the domain specified.
! Neither the user or the hostname needs to match; only the domain name must
! be required to match.
! .RE
  .sp
  Example:
  .sp
***************
*** 3142,3149 ****
  This means that any mail sent to 1) anyone at island, 2) anyone within
  the berkeley domain, 3) anyone within the mit domain, 4) Bart Schaefer
  (at any host anywhere -- even locally),
! and 4) root on my local machine only (or, root@my-machine-name)
! will be signed  by my "alternate" signature.  If any address on the
  recipient list fails to satisfy these four matches, the mail will be
  signed by my regular signature.
  .sp
--- 3185,3192 ----
  This means that any mail sent to 1) anyone at island, 2) anyone within
  the berkeley domain, 3) anyone within the mit domain, 4) Bart Schaefer
  (at any host anywhere -- even locally),
! and 4) root on the local machine only (or, root@local-machine-name)
! will be signed  by my \*Qalternate\*U signature.  If any address on the
  recipient list fails to satisfy these four matches, the mail will be
  signed by my regular signature.
  .sp
***************
*** 3253,3258 ****
--- 3296,3354 ----
  Editor to use when \*Q~e\*U is specified.
  Default is the value of the variable
  .BR visual .
+ .TP
+ .B edit_hdrs
+ (Boolean)
+ When in letter-composition mode (via \fBmail\fR or \fBreply\fR, etc),
+ the headers of the outgoing message is stored in the same buffer as
+ the text of the letter.  So, if the editor is called to edit the message
+ buffer, the headers of the message can be edited as well.  There are
+ some restrictions, however.
+ .sp
+ There must be a To: header.  Without this, mush will not deliver the
+ letter.  Instead, the editor must be reentered and a To: header with
+ a valid recipient must be inserted.  Just because a valid Cc: header
+ exists does not affect this restriction.  You may have as many To: and
+ Cc: headers as you like.
+ .sp
+ The From: header must not be altered.  Altering this header will
+ result in a warning and it will be replaced by a correct one.
+ .sp
+ The Date: header will always be replaced by one with a more accurate
+ time and date stamp.  Therefore, changing or removing this header has
+ no effect.
+ .sp
+ You cannot add a Status: header and blank headers are dropped.
+ For example, if an empty Cc: header exists, the header will
+ not show up in the outgoing message.  Therefore, leaving empty
+ headers has no effect.
+ .sp
+ Aliases specified on the command line are expanded and put into the
+ message buffer in their expanded form regardless of the value of
+ .B no_expand.
+ However, if the user changes the headers using the editor and specifies
+ aliases, those aliases will not be expanded if
+ .B no_expand
+ is set.  Otherwise, they are expanded as usual.
+ .sp
+ The headers Bcc: and Fcc: are removed as expected.
+ .sp
+ One added side effect of
+ .B edit_hdrs
+ is that you can add an Fcc: header to specify a \*QFile Carbon Copy\*U.
+ This must be a full pathname to a file or program.  For programs, the
+ pathname must be preceded by a pipe character (|).
+ .sp
+ When using
+ .B edit_hdrs,
+ certain tilde escapes don't work.  Specifically, any tilde escape that
+ allows you to add or set headers or to empty the file are inactive.
+ These functions are to be done in the editor only.
+ .sp
+ Once a letter is being edited,
+ .B edit_hdrs
+ cannot be set or unset; the user must end the letter (either
+ by sending it or forcefully terminating it) first.
  .TP
  .B escape
  (Character)
*** mush-6.4/mush.h	Fri Mar 24 10:12:35 1989
--- mush.h	Tue Apr 18 09:38:29 1989
***************
*** 1,6 ****
  /* @(#)mush.h	(c) copyright 1986 (Dan Heller) */
  
! #define VERSION "Mail User's Shell (6.4 2/14/89)"
  
  #include "config.h"
  
--- 1,6 ----
  /* @(#)mush.h	(c) copyright 1986 (Dan Heller) */
  
! #define VERSION "Mail User's Shell (6.5 4/03/89)"
  
  #include "config.h"
  
***************
*** 34,39 ****
--- 34,48 ----
  #include <setjmp.h>
  #include "strings.h"
  
+ extern char
+     *malloc(),		/* allocate memory */
+     *calloc(),		/* allocate and clear memory */
+     *realloc();		/* re-allocate memory */
+ 
+ extern void
+     free_vec(),		/* free a malloc'ed argv */
+     xfree();		/* free malloc'ed pointers */
+ 
  #ifdef SUNTOOL
  #    include <suntool/tool_hs.h>
  #else  /* SUNTOOL */
***************
*** 340,345 ****
--- 349,355 ----
  #define EDIT		4	/* enter editor by default on mailing */
  #define SIGN		5	/* auto-include ~/.signature in mail */
  #define DO_FORTUNE	6	/* add a fortune at end of msgs */
+ #define EDIT_HDRS	7	/* if true, user edits headers using editor */
  
  /* msg flags */
  #define NO_HEADER	7	/* don't print header of message (top, write) */
***************
*** 427,432 ****
--- 437,443 ----
      *getpath(),		/* static char returning path (expanding ~, +, %, #) */
      *do_set(),		/* set/unset an option, alias, ignored-hdr */
      *reverse(),		/* reverse a string */
+     *trim_filename(),	/* remove or condense leading file name path */
      *prog_name,
  
      /* from loop.c */
*** mush-6.4/rite.c	Fri Mar 24 10:01:25 1989
--- rite.c	Thu Apr 13 16:52:58 1989
***************
*** 6,11 ****
--- 6,12 ----
  
  static char String[BUFSIZ];
  static int count, overflow, save_orig_x;
+ static int backspace(), Addch();
  
  char *
  rite(c)
***************
*** 22,28 ****
  	return NULL;
      }
      literal_next = 0;
!     if (c == _tty.sg_erase || c == CTRL(127) || c == CTRL(H)) {
  	if (count)
  	    backspace();
      } else if (c == _tty.sg_kill) {
--- 23,29 ----
  	return NULL;
      }
      literal_next = 0;
!     if (c == _tty.sg_erase || c == CTRL(\127) || c == CTRL(H)) {
  	if (count)
  	    backspace();
      } else if (c == _tty.sg_kill) {
*** mush-6.4/select.c	Fri Mar 24 10:04:44 1989
--- select.c	Wed Apr 12 10:26:35 1989
***************
*** 307,313 ****
  	action = event;
  
      if (menu_ptr == &help_menu || action == MENU_HELP) {
! 	switch(action) {
  	    when DEL_MSG: case UNDEL_MSG:
  		(void) help(fd, "menu_delete", tool_help);
  	    when READ_MSG: (void) help(fd, "next", tool_help);
--- 307,313 ----
  	action = event;
  
      if (menu_ptr == &help_menu || action == MENU_HELP) {
! 	switch ((int) action) {
  	    when DEL_MSG: case UNDEL_MSG:
  		(void) help(fd, "menu_delete", tool_help);
  	    when READ_MSG: (void) help(fd, "next", tool_help);
***************
*** 405,411 ****
  	action = m_item->mi_data;
      else
  	return;
!     switch(action) {
  	case O_SAVE:
  	    save_opts(0, DUBL_NULL);
  	when O_RSTR:
--- 405,411 ----
  	action = m_item->mi_data;
      else
  	return;
!     switch ((int) action) {
  	case O_SAVE:
  	    save_opts(0, DUBL_NULL);
  	when O_RSTR:
*** mush-6.4/setopts.c	Fri Mar 24 10:05:46 1989
--- setopts.c	Thu Apr 13 16:53:02 1989
***************
*** 11,17 ****
  register char **argv;
  {
      register struct options *tmp;
-     struct options *calloc();
      register char *option, *value = NULL;
  
      if (!(option = *argv))
--- 11,16 ----
***************
*** 50,59 ****
      }
  
      /* check to see if option is already set by attempting to unset it */
!     (void) un_set(list, option);
  
      /* now make a new option struct and set fields */
!     if (!(tmp = calloc((unsigned)1, sizeof(struct options)))) {
  	error("calloc");
  	return -1;
      }
--- 49,59 ----
      }
  
      /* check to see if option is already set by attempting to unset it */
!     if (un_set(list, option) == -1)
! 	return 0;
  
      /* now make a new option struct and set fields */
!     if (!(tmp = (struct options *)calloc((unsigned)1,sizeof(struct options)))) {
  	error("calloc");
  	return -1;
      }
***************
*** 106,112 ****
  	    tmp->value = savestr(sprintf(wval, "%d", wrapcolumn));
  	} else if (!strcmp(tmp->option, "history"))
  	    init_history((value && *value)? atoi(value) : 1);
! 	else if (!strcmp(tmp->option, "known_hosts")) {
  	    register char *p;
  	    int n;
  	    /* in case user separated with commas */
--- 106,118 ----
  	    tmp->value = savestr(sprintf(wval, "%d", wrapcolumn));
  	} else if (!strcmp(tmp->option, "history"))
  	    init_history((value && *value)? atoi(value) : 1);
! 	else if (!strcmp(tmp->option, "realname")) {
! 	    char *new[4];
! 	    new[1] = "NAME";
! 	    new[2] = tmp->value;
! 	    new[3] = NULL;
! 	    Setenv(3, new); /* new[0] is ignored */
! 	} else if (!strcmp(tmp->option, "known_hosts")) {
  	    register char *p;
  	    int n;
  	    /* in case user separated with commas */
***************
*** 144,160 ****
  #ifdef SUNTOOL
      int x,y;
  
!     if (istool && !str)
  	y = 10 + 2 * l_height(LARGE);
  #endif /* SUNTOOL */
  
!     if (!str && !istool)
  	(void) do_pager(NULL, TRUE); /* page using internal pager */
  
      for (opts = list; opts; opts = opts->next)
  	if (!str) {
  #ifdef SUNTOOL
! 	    if (istool)
  		pw_text(msg_win, 5, y, PIX_SRC, fonts[DEFAULT], opts->option);
  	    else
  #endif /* SUNTOOL */
--- 150,166 ----
  #ifdef SUNTOOL
      int x,y;
  
!     if (istool >= 2 && !str)
  	y = 10 + 2 * l_height(LARGE);
  #endif /* SUNTOOL */
  
!     if (!str && istool < 2)
  	(void) do_pager(NULL, TRUE); /* page using internal pager */
  
      for (opts = list; opts; opts = opts->next)
  	if (!str) {
  #ifdef SUNTOOL
! 	    if (istool >= 2)
  		pw_text(msg_win, 5, y, PIX_SRC, fonts[DEFAULT], opts->option);
  	    else
  #endif /* SUNTOOL */
***************
*** 161,167 ****
  		(void) do_pager(opts->option, FALSE);
  	    if (opts->value)
  #ifdef SUNTOOL
! 		if (istool) {
  		    x = 30*l_width(DEFAULT);
  		    pw_text(msg_win, x,y, PIX_SRC, fonts[DEFAULT], opts->value);
  		    pw_text(msg_win, x+1, y, PIX_SRC|PIX_DST,
--- 167,173 ----
  		(void) do_pager(opts->option, FALSE);
  	    if (opts->value)
  #ifdef SUNTOOL
! 		if (istool >= 2) {
  		    x = 30*l_width(DEFAULT);
  		    pw_text(msg_win, x,y, PIX_SRC, fonts[DEFAULT], opts->value);
  		    pw_text(msg_win, x+1, y, PIX_SRC|PIX_DST,
***************
*** 174,180 ****
  		    (void) do_pager(opts->value, FALSE);
  		}
  #ifdef SUNTOOL
! 	    if (istool)
  		Clrtoeol(msg_win, x, y, DEFAULT), y += l_height(DEFAULT);
  	    else
  #endif /* SUNTOOL */
--- 180,186 ----
  		    (void) do_pager(opts->value, FALSE);
  		}
  #ifdef SUNTOOL
! 	    if (istool >= 2)
  		Clrtoeol(msg_win, x, y, DEFAULT), y += l_height(DEFAULT);
  	    else
  #endif /* SUNTOOL */
***************
*** 189,195 ****
  		return "";
  	}
  
!     if (!str && !istool)
  	(void) do_pager(NULL, FALSE); /* terminate internal pager */
  
      /* if we still haven't matched, check for environment vars */
--- 195,201 ----
  		return "";
  	}
  
!     if (!str && istool < 2)
  	(void) do_pager(NULL, FALSE); /* terminate internal pager */
  
      /* if we still haven't matched, check for environment vars */
***************
*** 259,264 ****
--- 265,273 ----
  	} else if (!strcmp(p, "hostname")) {
  	    free_vec(ourname);
  	    ourname = DUBL_NULL;
+ 	} else if (ison(glob_flags, IS_GETTING) && !strcmp(p, "edit_hdrs")) {
+ 	    wprint("You mush finish this letter first.\n");
+ 	    return -1;
  	}
      }
  
***************
*** 617,623 ****
  	else if (firstchar == 'f')
  	    help_str = "fkey";
  	else
! 	    help_str = "own_hdrs";
  	return help(0, help_str, cmd_help);
      }
  
--- 626,632 ----
  	else if (firstchar == 'f')
  	    help_str = "fkey";
  	else
! 	    help_str = "my_hdr";
  	return help(0, help_str, cmd_help);
      }
  
*** mush-6.4/signals.c	Fri Mar 24 10:04:09 1989
--- signals.c	Wed Apr 12 10:28:16 1989
***************
*** 296,306 ****
  	    turnoff(glob_flags, NEW_MAIL);
  	else
  	    turnon(glob_flags, NEW_MAIL);
  	if (istool) {
  	    mail_status(0);
  	    (void) do_hdrs(0, DUBL_NULL, NULL);
! 	    bell();
  	}
  	if (msg_cnt < last_msg_cnt) {
  	    last_msg_cnt = msg_cnt;
  	    last_spool_size = spool_size;
--- 296,308 ----
  	    turnoff(glob_flags, NEW_MAIL);
  	else
  	    turnon(glob_flags, NEW_MAIL);
+ #ifdef SUNTOOL
  	if (istool) {
  	    mail_status(0);
  	    (void) do_hdrs(0, DUBL_NULL, NULL);
! 	    window_bell(print_sw);
  	}
+ #endif /* SUNTOOL */
  	if (msg_cnt < last_msg_cnt) {
  	    last_msg_cnt = msg_cnt;
  	    last_spool_size = spool_size;
*** mush-6.4/strings.c	Fri Mar 24 10:04:11 1989
--- strings.c	Wed Apr 12 10:44:12 1989
***************
*** 161,182 ****
      return n;
  }
  
- void
- xfree(cp)
- char *cp;
- {
-     extern char end[];
- 
-     if (cp >= end && cp < (char *) &cp && debug < 5)
- 	free(cp);
- }
- 
  char *
  savestr(s)
  register char *s;
  {
      register char *p;
!     char *malloc();
      if (!s)
  	s = "";
      if (!(p = malloc((unsigned) (strlen(s) + 1)))) {
--- 161,172 ----
      return n;
  }
  
  char *
  savestr(s)
  register char *s;
  {
      register char *p;
! 
      if (!s)
  	s = "";
      if (!(p = malloc((unsigned) (strlen(s) + 1)))) {
***************
*** 184,201 ****
  	return NULL;
      }
      return strcpy(p, s);
- }
- 
- void
- free_vec(argv)
- char **argv;
- {
-     register int n;
-     if (!argv)
- 	return;
-     for (n = 0; argv[n]; n++)
- 	xfree(argv[n]);
-     xfree((char *)argv);
  }
  
  /* copy a vector of strings into one string -- return the end of the string */
--- 174,179 ----
*** mush-6.4/strings.h	Fri Mar 24 09:58:43 1989
--- strings.h	Wed Apr 12 10:13:28 1989
***************
*** 30,36 ****
      *savestr();		/* strcpy arg into malloc-ed memory; return address */
  
  extern void
-     free_vec(),		/* free a malloc'ed argv */
      print_argv(),	/* prints an argv as one string */
!     putstring(),	/* put a string */
!     xfree();		/* free malloc'ed pointers */
--- 30,34 ----
      *savestr();		/* strcpy arg into malloc-ed memory; return address */
  
  extern void
      print_argv(),	/* prints an argv as one string */
!     putstring();	/* put a string */
*** mush-6.4/viewopts.c	Fri Mar 24 10:04:45 1989
--- viewopts.c	Wed Apr 12 10:33:50 1989
***************
*** 35,41 ****
  	"Include a copy of author's message each time you reply to mail." },
      { "autoprint", NULL, TOOL | TEXT,
  	"Display the next message on the list when you delete a message." },
!     { "auto_route", NULL, TOOL | TEXT,
  	"Remove redundant uucp addresses when replying to messages." },
      { "autosign", "-Filename", TOOL | TEXT,
  	"Add file (~/.signature if set but no value) at end of all letters." },
--- 35,41 ----
  	"Include a copy of author's message each time you reply to mail." },
      { "autoprint", NULL, TOOL | TEXT,
  	"Display the next message on the list when you delete a message." },
!     { "auto_route", "-Host/Path", TOOL | TEXT,
  	"Remove redundant uucp addresses when replying to messages." },
      { "autosign", "-Filename", TOOL | TEXT,
  	"Add file (~/.signature if set but no value) at end of all letters." },
***************
*** 51,56 ****
--- 51,58 ----
  	"The name of the file to store dead mail (default = ~/dead.letter)." },
      { "dot", NULL, TOOL | TEXT,
  	"Allow \".\" on a line by itself to send letter." },
+     { "edit_hdrs", NULL, TOOL | TEXT,
+ 	"Allow headers of messages to be edited using your editor." },
      { "editor", "Editor name/path", TOOL | TEXT,
  	"Editor for message editing (default = env EDITOR or \"vi\")." },
      { "escape", "Character", TOOL | TEXT,
***************
*** 77,83 ****
  	"Ignores ^D as exit, or (if set), execute \"command\"." },
      { "indent_str", "String", TOOL | TEXT,
  	"String to offset included messages within your letters." },
!     { "in_reply_to", NULL, TOOL | TEXT,
  	"When responding to mail, add In-Reply-To: to message headers." },
      { "keepsave", NULL, TOOL | TEXT,
  	"Prevents messages from being marked as `deleted' when you `save'." },
--- 79,85 ----
  	"Ignores ^D as exit, or (if set), execute \"command\"." },
      { "indent_str", "String", TOOL | TEXT,
  	"String to offset included messages within your letters." },
!     { "in_reply_to", "-String", TOOL | TEXT,
  	"When responding to mail, add In-Reply-To: to message headers." },
      { "keepsave", NULL, TOOL | TEXT,
  	"Prevents messages from being marked as `deleted' when you `save'." },
***************
*** 249,255 ****
  	    txt.y = 50 + line*20 + l_height(curfont);
  	}
  	if (!p || *p == '-') {
! 	    register char *argv[2];
  	    argv[0] = viewopts[start_cnt+line].v_opt;
  	    argv[1] = NULL;
  	    (void) add_option(&set_options, argv);
--- 251,257 ----
  	    txt.y = 50 + line*20 + l_height(curfont);
  	}
  	if (!p || *p == '-') {
! 	    char *argv[2];
  	    argv[0] = viewopts[start_cnt+line].v_opt;
  	    argv[1] = NULL;
  	    (void) add_option(&set_options, argv);
*** mush-6.4/PATCHNOTES	Mon Mar 27 12:14:39 1989
--- PATCHNOTES	Mon Mar 27 10:50:20 1989
***************
*** 0 ****
--- 1,184 ----
+ Changes/bugfixes in this patch:
+ 
+     General:
+ 	The functions malloc() and calloc() have been declared correctly
+ 	in mush.h, and corresponding changes to use typecasts have been
+ 	made to other files.  Those changes are not mentioned here.
+ 
+ 	Changes were also made to eliminate gcc warnings in a number of
+ 	files.  Again, those changes are not described here.
+ 
+ 	The makefiles have been modified to include the new malloc.c file.
+ 
+     README:
+ 	Corrected installation instructions for Sun and Xenix systems.
+ 	Removed references to the obsolete OLD_MAILER definition.
+ 
+ 	Added descriptions of PICKY_MAILER, MTA_EXIT, TIMEZONE and
+ 	INTERNAL_MALLOC definitions.
+ 
+     README-6.4:
+ 	Corrected typographical error.
+ 
+     README-6.5:
+ 	A new file summarizing these patch notes.
+ 
+     addrs.c:
+ 	Fixed ordering problem in if-else in compare_addresses
+ 
+ 	Repaired route_addresses().
+ 
+     cmd_help:
+ 	Changed the key string for my_hdr help to fix curses "h?" bug.
+ 
+     commands.c:
+ 	The "edit" commmand now invokes $editor, and the "visual" command
+ 	must be used to get $visual.  Abbreviations "e" and "v" still work.
+ 
+ 	Piping of deleted messages is now possible if $show_deleted
+ 	is set.
+ 
+     config.h-dist:
+ 	Added new definition MTA_EXIT.  It should be set to an integer
+ 	representing a successful exit status from your MTA.
+ 
+ 	Changed the way locking is defined for MMDF, to better support
+ 	the variety of MMDF locking protocols.
+ 
+ 	Changed the VERBOSE_ARG for MMDF from W to Ww.
+ 
+ 	Removed references to the obsolete OLD_MAILER definition.
+ 	Added new definition PICKY_MAILER, which is the opposite: if
+ 	your MTA absolutely insists on adding From: and Date:, this
+ 	definition will suppress mush's versions of those headers.
+ 	Added descriptions of INTERNAL_MALLOC, TIMEZONE, DAYLITETZ,
+ 	MMDF, HOMEMAIL, and NO_COMMAS definitions.
+ 
+     curses.c:
+ 	Improved the behavior of "quit" (q) from curses mode when the
+ 	mailbox needs to be updated.  In particular, the mailbox is no
+ 	longer needlessly reread before exiting.
+ 
+ 	Added screen refresh (redo) and macro flush after executing
+ 	source command (C_SOURCE).
+ 
+     dates.c:
+ 	Added usage of the new TIMEZONE definitions to rfc_date() for
+ 	systems lacking any other method for determining the current
+ 	timezone.  The new DAYLITETZ definition is also used.
+ 
+     file.c:
+ 	Corrected compilation error for HOMEMAIL systems.  This patch has
+ 	already appeared on comp.sources.bugs, as noted above.
+ 
+ 	Lock and save names of files opened by find_files(), to prevent
+ 	collisions in send_it() (mail.c) among mush children.
+ 
+ 	Added function trim_filename().
+ 
+     folders.c:
+ 	Changing folders now sets the mailfile to a full path name to
+ 	prevent name collisions when changing directories.
+ 
+     hdrs.c:
+ 	Small change to header_field() to allow its use in conjunction
+ 	with the header editing changes.
+ 
+ 	Fixed bugs in do_hdr(): "z-" now works correctly; the -H option
+ 	works correctly again; completing a screenful of header summaries
+ 	by scanning backward when the current message is deleted works.
+ 
+     lock.c:
+ 	Delay loop to wait for exclusive lock would exit incorrectly
+ 	when interrupted.  It also printed its message each time around
+ 	the loop, instead of adding ellipses as was intended.
+ 
+ 	#ifdef MMDF ended in the wrong place, changed it.
+ 
+ 	Explicit unlocking added to close_lock for BSD due to Ultrix
+ 	fclose problems.
+ 
+ 	Changed the way locking is defined for MMDF, to better support
+ 	the variety of MMDF locking protocols.
+ 
+     mail.c:
+ 	Write errors when sending mail are now correctly caught and dealt
+ 	with.  If write to the MTA fails, sending aborts and a dead.letter
+ 	is created.
+ 
+ 	The exit status of the MTA is now monitored, and a dead.letter is
+ 	created when the MTA returns an error.  This doesn't necessarily
+ 	mean the mail wasn't sent, and you may get error mail from the MTA.
+ 
+ 	Setting the $verbose variable during composition is now handled
+ 	correctly.
+ 
+ 	Carbon-copy recipients are collected correctly when using replyall
+ 	on two or more messages.
+ 
+ 	Files opened in send_it() are now locked (see file.c) to prevent
+ 	collisions with other sends.  Pipes opened are now closed with
+ 	pclose() to avoid filling up popen's internal tables.
+ 
+ 	Extensive changes have been made to support header editing.  See
+ 	REAMDE-6.5 for the ramifications.
+ 
+     main.c:
+ 	The 6.4 PATCHDATE has been undef'd.
+ 
+ 	Code has been added to handle the optional INTERNAL_MALLOC and to
+ 	start the mushtool correctly when run from .suntools in SunOS4.0.
+ 
+     malloc.c:
+ 	A new file to support the INTERNAL_MALLOC definition.  The xfree()
+ 	and free_vec() functions have moved here.
+ 
+     misc.c:
+ 	Moved an incorrectly placed fseek() in sign_letter().
+ 
+ 	Added backslash handling to msg_flags() to allow escaping of the
+ 	`-' argument (turn off bits).  This helps prevent collisions
+ 	with message-list parsing.
+ 
+     msgs.c:
+ 	Some compilers were having trouble with a case label within an
+ 	else, producing incorrect code.  Added braces to force correct
+ 	interpretation.
+ 
+ 	HOMEMAIL systems could lose mail if the "spool" mailbox was
+ 	updated and unlinked while new mail was being delivered.  Moved
+ 	releasing of the lock to below the unlink to help prevent this.
+ 
+ 	The new trim_filename() function (see file.c) is used by the
+ 	mail_status() function to shorten the folder name it displays.
+ 
+     mush.1:
+ 	Documented the long-undocumented -e option.
+ 
+ 	Documented the new edit_hdrs setting.
+ 
+ 	Documented the "update" command separately from the "folder"
+ 	command.
+ 
+ 	Minor formatting corrections and proofreading.
+ 
+     mush.h:
+ 	Changed VERSION to 6.5 and date to 4/03/89.
+ 
+ 	Added glob_flag for EDIT_HDRS and declarations of alloc functions.
+ 	Also added declaration of trim_filename().
+ 
+     setopts.c:
+ 	Added support for the new $edit_hdrs variable.
+ 
+ 	Fixed the help string for the my_hdr command in do_alias().
+ 
+     strings.c:
+ 	The functions xfree() and free_vec() have moved to malloc.c.
+ 
+     strings.h:
+ 	The declaration of xfree() has moved to mush.h.
+ 
+     viewopts.c:
+ 	Added support for the new $edit_hdrs variable.
+ 
*** mush-6.4/kit.check	Tue Apr 18 17:29:04 1989
--- kit.check	Tue Apr 18 17:29:04 1989
***************
*** 1 ****
!  Part3-check 
--- 1 ----
!  Part4 
-- 
Bart Schaefer       "And if you believe that, you'll believe anything."
							-- DangerMouse
CSNET / Internet                schaefer@cse.ogc.edu
UUCP                            ...{sun,tektronix,verdix}!ogccse!schaefer