dheller@cory.Berkeley.EDU (Dan Heller) (11/07/87)
Here is a summary of the fixes/enhancements made to the Mail User's Shell posted to comp.sources.unix a few weeks ago. You can obtain a copy before the diffs get posted by anonymous ftp to spam.istc.sri.com. The release there is 5.9, but the next major (posted) release will be 6.0 (pending last minute bug reports). One of the major changes is support for system V compatibility. These changes are mostly based by SunOS's claim to be compatible with system V. If you can't ftp to spam, but would like a copy of the diffs in "tarmail" format, you can mail me here or at island!argv@ucbcad.berkeley.edu. Remember, to use tarmail, you need atob and compress. The categories beflow are: makefiles and compiler flags, curses changes, suntools (toolmode) changes, and misc enhancements. New makefile, compiler flags, system-dependent library support: System V machines that aren't XENIX should use the makefile.sys.v makefile. The old makefile.sys.v has been moved to makefile.xenix. System-V people who aren't xenix may note -DUSG in the makefile. USG is defined in curses.h but is required to be in the makefile if compiling without the curses libraries. It should be in the makefile anyway so you never have to worry about it. Some systems have regcmp/regex as their regular expression matching routines while others have re_comp/re_exec -- If you have regcmp, then you must have -DREGCMP in the makefile you're using. If you have both sets of routines, take a pick. Machines that use mail transfer agents that *do not* use a colon-less "From " line as a message separator should #define in config.h the string MSG_SEPARATOR. Since this string is usually control characters, you need to specify actual ascii values for those characters. Users of MMDF, for example, should define this to be "\001\001\001\001" since mmdf uses 4 control-A's to separate messages. This message separator assumes that there is a carriage return at the end of the string. Systems that use sendmail need not concern themselves with this define. System V: New functions: lock_file() /* returns -1 if can't lock */ close_lock() /* unlocks and calls fclose */ These functions also support BSD, xenix and sys-v. Support for termio functionality. Macros in mush.h have been modified to provide for echo/cbreak modes to depending on the compiler flags: CURSES and SYSV/BSD/USG. There are 6 different possible cases here. Problem with xenix/sys-v getting the "name" from a "From:" field since char pointer and char arrays are different sizes. (hdrs.c, compose_hdr()) Misc: Mush now understands 'well-formed' addresses. A well-formed address consists of tokens of the form: $path $path (Name or comment here) Name or comment <$path> "Name or comment" $path Each well formed address must be separated by commas. Without a separating comma, addresses may be considered as comments of other addresses. A common mistake: Dan Heller <island!argv@sun.com> user@foo.com user@foo.com will be considered as part of the comment in the first address since comments can be separated: Dan <island!argv@sun.com> Heller Mush will attempt to separated commas for you if it can figure it out: Dan Heller <island!argv@sun.com>, user@foo.bar user2@where.ever root Here, it's clear that after the first address (separated by a comma), there are no more "comment" fields because there are no comment chars. So, any whitespace will have commas inserted: Dan Heller <island!argv@sun.com>, user@foo.bar, user2@where.ever, root Of course, aliases follow the same rules. Example mush commands: alias dan Dan Heller <island!argv@sun.com> alias frank Frank <frank@frankensun.com> mail dan frank <- user command. To: dan, frank <- note comma inserted automatically. Subject: If there is an error in an address (unbalanced brackets, parenthesis, quotes), parsing stops immediately and unpredictable results may occur. Usually, there is no change in the address, but not guaranteed. Tokens which expand to aliases may not have comments accompanying them: alias group fred, wilma, barney, betty To: group (The Flintstone Gang) This is illegal -- An alias may reference other aliases or addresses which have comments in them, but the alias expressed in a header field may not contain comments. See the man page for more information. Add right justification in hdr_format format string field similar to printf style formatting. Example: set hdr_format = '%S %-25n %7d (%l) "%s"' will produce a header format such that the name of the author is right justified 25 positions, 7 chars of the date is printed, the number of lines in the message and the subject surrounded by quotes. (hdrs.c) Saveopts now warns if file already exists; you must confirm overwrite. New variable called "wrap" has been added. When the last message is deleted, next "current" message is usually the next undeleted message. If wrap is not set, then the curent message remains at the end of the list of messages. Similarly, if "next" ('n', CR) is specified, wrapping to the beginning of the list only happens if the variable is set. "cdpath" added. This is like csh's but note you can't use ()'s to set the path -- use quotes: ("). When the cd command is issued, if there is no cdpath set, then the directory mentioned is cd'ed to. If there is a cdpath and the pathname given is not a full pathname, then each element in the cdpath is searched for the directory specified. Recommend putting "." first in cdpath if one is used. "varargs" now used in print.c to provide support for machine that do not stack arguments compatible with vax/68000/etc... These machines are Pyramids, Sun4's and more... (print.c) "sendmail" -- if set, this program is used instead of the default Mail Transfer Agent defined as MAIL_DELIVERY in config.h ... If used, the default flags -i and -m are not passed along to the MTA, so any flags which are necessary for the MTA should be included in the sendmail variable's string value. The temporary file used to type in messages is now _closed_ before invoking an editor or pager. This is for gnuemacs users or users of other editors which insist on no other references to that file be open. New date format added (dates.c). Using job control (^Z/fg) which in the headers portion of a message (e.g. "To: ") would cause mush to be confused about what state the program is in and would inadvertently show a prompt (user's $prompt) even tho it was executing the right code (prompting for the To: line). This has been fixed so that the prompt isn't given, but the To: line will not be reprompted. Mailing to users from the command line and ^C-ing while in the To: or Subject: prompt would just report an interrupt and not abort the message; it now exits.(hdrs.c, set_header()) If the user's home dir isn't writeable, or permissions changed during runtime, mush changes to ALTERNATE_HOME and tries again rather than just returning an error message. If the alternate home also fails, an error is printed and the function aborted. (main.c, mail.c, start_file()) When updating a folder, ignored headers are now copied back regardless of the variable, "alwaysignore". This is necessary because the user may ignore headers that are required to be read when reading in a folder. (msgs.c, copy_msg()) New command line argument: -u [user] /usr/spool/mail/user is used as the current folder. If "user" isn't specified, /usr/spool/mail/root is used. If -r (readonly) flag is given on the command line or to the folder/update commands, the folder (or spoolfile) is opened readonly and the mail is *not* copied into a temporary buffer. This speeds up IO dramatically in systems with slow drives. The variable fixaddr has been removed and the auto_route feature has been modified to route uucp mail thru the host of the author of the message being replied to as well as removing redundant hostnames such as: host1!host2!host1!user -> host1!user Curses: In curses mode, line-mode commands which contain pipes, :pick -s pattern | save folder segmentation fault on the command that follows such commands. The next command to execute thinks that piping is on causing a segmentation fault trying to reference the non-existent message list. Fixed by resetting the DO_PIPE/IS_PIPE flags to off in the cmd_line() routine. (misc.c, cmd_line()) Quitting now goes to the bottom of the screen rather than moving down one line [as well as other quit-related update bugs] (curses.c, case C_QUIT:) Updating (^U) now redraws the screen right if you weren't on the first "screenful" of messages. (curses.c, case C_UPDATE) 's' (save) command wasn't saving to mbox on no input (CR). It tried to save to "" which maps to "." which is a directory. (curses.c) The bug causing the GOTO command to inifinite loop if there were 0 or 1 messages in the folder if invoked by selecting a digit key has been fixed. The manual entry for how the goto command works has a more detailed description and sites an example for effective usage. Due to its versatility, there can be some screen updating problems if the user specifies a message list which contains a command that produces any "stdout" type output. Normally, this shouldn't happen, because most commands which are used to "search for messages" will not output anything if they are being "piped". If the user wishes to specify a command that produces output (like echo) then the screen will not be updated correctly (use ^L to redraw). See the updated man page entry for deatils on the above. Tool mode: Trying to start tool in icon mode sometimes aborts with segementation fault. This is caused by the window size being 0 and the message trying to be written to the empty window. The routine which tries to output each line of the message to the window is recursive. If the line wraps because of the window's width being less than the length of the line, Addstr() finds the position in the line which wraps and calls itself recursively passing the remainder of the string. The size of 0 means that Addstr is calling itself at the the beginning of the string all the time. The fix is in copy_msg where it checks to see if the window is large enough to attempt printing the message.(msgs.c, copy_msg()) When changing folders, if there are no messages in the new folder, the last read message was still displayed leaving the user somewhat confused. If there are no messages, the window is cleared. (folders.c) To be consistent with the other two interfaces, both delete and backspace will backspace if in type-in mode. (rite.c) When returning from using the editor, the window displaying the letter being composed would contain what the letter looked like before the editor was invoked. This has been fixed by printing out the last part of the letter up to the size of the window available. ...dan