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(×[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(×[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