rsalz@bbn.com (Rich Salz) (04/30/88)
Submitted-by: island!argv@sun.com (Dan Heller) Posting-number: Volume 14, Issue 77 Archive-name: mush6.0/patch1 The patches included here apply mostly to System V sites and Pyramids. Also included is a file called Mailrc which can be used to make Mush look very much like ucb's Mail program. It was written by Bart Schaefer (ogcvax!schaefer@sun.com). Test your new mush by sending him mail congratulating him on his upcoming wedding :-) For more details (and lists of the new features), see README-6.1. #! /bin/sh # This is a shell archive. Remove anything before this line, then unpack # it by saving it into a file and typing "sh file". To overwrite existing # files, type "sh file -c". You can also feed this as standard input via # unshar, or by typing "sh <file", e.g.. If this archive is complete, you # will see the following message at the end: # "End of shell archive." # Contents: README-6.1 Mailrc Diffs PATH=/bin:/usr/bin:/usr/ucb ; export PATH if test -f 'README-6.1' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'README-6.1'\" else echo shar: Extracting \"'README-6.1'\" \(3039 characters\) sed "s/^X//" >'README-6.1' <<'END_OF_FILE' The patches included here apply mostly to system-v sites. However, you should include them if you are going to keep up to date with future pathes. Here is a summary of the files and functions that have changed and why. X Also included with these update diffs is a file called Mailrc which can be used to make Mush look very much like ucb's Mail program. It was written by Bart Schaefer (ogcvax!schaefer@sun.com). Test your new mush by sending him mail congratulating him on his upcoming wedding :-) X mush.h -- X Truncated version ID. X X putchar() redefined fputc(c, stdout), fflush(stdout) because sys-v X isn't getting newlines when in curses mode. Isn't stdout supposed X to be line buffered? Does setting cbreak or something change this? X If this doesn't fix the problem for sys-v, add setbuf(stdout, NULL) at X the top of main.c, but that shouldn't be necessary (in fact, none of X this _should_ be necessary). X X SIGCHLD may cause infinite loop on pyramid's cpp cuz they X define SIGCHLD to be SIGCLD. SIGCHLD is now only defined if it's X not already defined. If your system has SIGCHLD and SIGCLD defined X to _different values_ and you have SYSV defined, you may need to X check into this, but I doubt your system's that weird. X X glob_flags is now u_long (helps lint) X loop.c -- X #ifdef SYSV around signal(SIGCHLD, ...) cuz sys-v doesn't really deal X with it correctly. Best just let it default and forget about it. Note X that sys-v'ers won't be able to watch processes die using "debug" anymore. X commands.c -- X Printenv() now takes an argument. "printenv _var_" will X print the varname and value rather than all env variables. X mail.c -- X OLD_MAILER and OLD_MAIL now merged to OLD_MAILER. Too confusing X to have both and if either is used, both tend to be used. Refer to X README-6.0 for details. X print.c -- X yet more fixes for varargs.h people. It seems that pyramid (sys-v/BSD) X now have va_start() defined to have an open brace ( { ) and va_end() X has the closing brace ( } ). So, you can't have a starting block X be inbetween each call. Who writes that stuff? X strings.c -- X Sprintf() now supports varargs and has #ifdef VPRINTF checks. X As it turns out, some systems don't have IOSTRG either, but I'm not X really up to date on this one. If you have a problem with it, just X remove its reference in the routine and it should work anyway. X hdrs.c -- X compose_hdr() should run faster now (thus, any display of headers: X 'h', 'z', etc...) should be faster due to the code no longer computes X the weekday name (Sun, Mon, etc..) unless specifically requested by %D X (in which it takes the same amount of time as before). X curs_io.c/signals.c -- X added new function scrn_line which reads a line of text from a line X on the curses screen for use by stdout. It seems that sys-v curses X package uses shorts instead of chars to represent each char on the X screen. I use #ifdef A_CHARTEXT to see if this applies to you. X END_OF_FILE if test 3039 -ne `wc -c <'README-6.1'`; then echo shar: \"'README-6.1'\" unpacked with wrong size! fi # end of 'README-6.1' fi if test -f 'Mailrc' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'Mailrc'\" else echo shar: Extracting \"'Mailrc'\" \(1467 characters\) sed "s/^X//" >'Mailrc' <<'END_OF_FILE' X# .mushrc to cause Mush to emulate UCB Mail X# -- Bart Schaefer (schaefer@cse.ogc.edu) X#---------------------------------------------------------------------------- X# Shortcomings: X# Mush does not support the "noisy phone line" flags of Mail X# (-i command line option or "set ignore" to ignore RUBOUT characters) X# Mush will never remove a system mailbox (no "unset keep" equivalent) X# See comments below on (lack of) command prefix recognition X# Date shown in headers ought to be date received, but instead is date sent X#---------------------------------------------------------------------------- X# X# Set up prompting, headers X# set prompt='& ' set mil_time set hdr_format='%8.80a %D %M %-2N %5T %l/%c "%.29s"' X# X# Set up mailing/replying miscellaneous X# set indent_str = " " set reply_to_hdr auto_route X# X# Set up command interface X# Note that a full emulation is difficult, because Mush does not support X# command prefix recognition (e.g., Mail interprets "Rep" as "Reply"). X# X# No cmd can use '\!*' because ignore_bang must be set. Yuck. set ignore_bang X# This stuff is fine, but really needs prefix recognition. X# cmd Reply replysender cmd R replysender cmd chdir cd cmd chd cd cmd + next cmd ch cd cmd c copy cmd file folder cmd fi folder cmd hold preserve cmd ho preserve cmd reply replyall cmd r replyall cmd se set cmd shell sh cmd so source cmd un undelete cmd unread "flags U" # "flags" is undocumented, but so is "unread" in Mail cmd uns unset X END_OF_FILE if test 1467 -ne `wc -c <'Mailrc'`; then echo shar: \"'Mailrc'\" unpacked with wrong size! fi # end of 'Mailrc' fi if test -f 'Diffs' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'Diffs'\" else echo shar: Extracting \"'Diffs'\" \(12806 characters\) sed "s/^X//" >'Diffs' <<'END_OF_FILE' X X*** OLD/commands.c Wed Apr 6 22:47:58 1988 X--- commands.c Tue Apr 26 20:08:49 1988 X*************** X*** 747,757 **** X return -1; X } X X! Printenv() X { X! char **e = environ; X! while (*e) X! wprint("%s\n", *e++); X return -1; X } X X--- 747,759 ---- X return -1; X } X X! Printenv(argc, argv) X! char **argv; X { X! char **e; X! for (e = environ; *e; e++) X! if (argc < 1 || !strncmp(*e, argv[1])) X! wprint("%s\n", *e); X return -1; X } X X*** OLD/curses.c Wed Apr 6 22:47:58 1988 X--- curses.c Wed Apr 27 21:48:35 1988 X*************** X*** 120,127 **** X if (isoff(glob_flags, CNTD_CMD)) { X (void) check_new_mail(); X curlin = max(1, current_msg - n_array[0] + 1); X! (void) strncpy(buf, stdscr->_y[curlin], COLS-1); X! buf[COLS-1] = 0; /* strncpy does not null terminate */ X if (ison(glob_flags, REV_VIDEO) && msg_cnt) X STANDOUT(curlin, 0, buf); X mail_status(0); X--- 120,126 ---- X if (isoff(glob_flags, CNTD_CMD)) { X (void) check_new_mail(); X curlin = max(1, current_msg - n_array[0] + 1); X! scrn_line(curlin, buf); X if (ison(glob_flags, REV_VIDEO) && msg_cnt) X STANDOUT(curlin, 0, buf); X mail_status(0); X*************** X*** 707,711 **** X--- 706,726 ---- X } X turnoff(glob_flags, DO_UPDATE); X return 1; /* make sure bottom line is clear and no reverse video */ X+ } X+ X+ scrn_line(line, buf) X+ char *buf; X+ { X+ #ifndef A_CHARTEXT X+ (void) strncpy(buf, stdscr->_y[line], COLS-1); X+ buf[COLS-1] = 0; /* strncpy does not null terminate */ X+ #else X+ int n; X+ X+ for (n = 0; n < COLS; n++) X+ if ((buf = mvinch(curline, n) & A_CHARTEXT) == '\0') X+ break; X+ buf[n] = '\0'; X+ #endif /* A_CHARTEXT */ X } X #endif /* CURSES */ X*** OLD/hdrs.c Wed Apr 6 22:48:00 1988 X--- hdrs.c Tue Apr 26 19:32:11 1988 X*************** X*** 253,259 **** X register char *p, *b; X char from[256], subject[256], date[17], lines[16], chars[16], line[256]; X char to[256], addr[256], name[256], status[2]; X! char Day[3], Mon[4], Tm[8], Yr[5], Wkday[4]; X X /* status of the message */ X if (ison(msg[cnt].m_flags, DELETE)) X--- 253,259 ---- X register char *p, *b; X char from[256], subject[256], date[17], lines[16], chars[16], line[256]; X char to[256], addr[256], name[256], status[2]; X! char Day[3], Mon[4], Tm[8], Yr[5], Wkday[4], *date_p; X X /* status of the message */ X if (ison(msg[cnt].m_flags, DELETE)) X*************** X*** 319,326 **** X (void) get_name_n_addr(from, name, addr); X } X X! if (p = msg_date(cnt)) X! date_to_string(p, Yr, Mon, Day, Wkday, Tm, date); X X (void) sprintf(lines, "%d", msg[cnt].m_lines); X (void) sprintf(chars, "%ld", msg[cnt].m_size); X--- 319,327 ---- X (void) get_name_n_addr(from, name, addr); X } X X! if (date_p = msg_date(cnt)) X! /* don't take weekday unless specified explicitly. See 'D' below */ X! date_to_string(date_p, Yr, Mon, Day, NULL, Tm, date); X X (void) sprintf(lines, "%d", msg[cnt].m_lines); X (void) sprintf(chars, "%ld", msg[cnt].m_size); X*************** X*** 394,400 **** X when 'M': p2 = Mon; X when 'Y': p2 = Yr; X when 'N': p2 = Day; X! when 'D': p2 = Wkday; X otherwise: continue; /* unknown formatting char */ X } X len = strlen(sprintf(b, fmt, p2)); X--- 395,409 ---- X when 'M': p2 = Mon; X when 'Y': p2 = Yr; X when 'N': p2 = Day; X! when 'D': { X! /* specifying weekday name (sun, mon, tue, etc..) can be X! * very slow due to lots of *,/, and % operators. X! */ X! char unused[16]; /* for date_to_string */ X! if (*(p2 = Wkday) == '\0') X! (void) date_to_string(date_p, NULL, NULL, NULL, X! p2, NULL, unused); X! } X otherwise: continue; /* unknown formatting char */ X } X len = strlen(sprintf(b, fmt, p2)); X*** OLD/loop.c Wed Apr 6 22:48:00 1988 X--- loop.c Tue Apr 26 18:49:13 1988 X*************** X*** 51,57 **** X (void) signal(SIGQUIT, catch); X (void) signal(SIGHUP, catch); X (void) signal(SIGTERM, catch); X! (void) signal(SIGCHLD, sigchldcatcher); X (void) signal(SIGPIPE, SIG_IGN); /* if pager is terminated before end */ X X turnoff(glob_flags, IGN_SIGS); X--- 51,63 ---- X (void) signal(SIGQUIT, catch); X (void) signal(SIGHUP, catch); X (void) signal(SIGTERM, catch); X! (void) signal(SIGCHLD, X! #ifndef SYSV X! sigchldcatcher X! #else /* SYSV */ X! SIG_DFL X! #endif /* SYSV */ X! ); X (void) signal(SIGPIPE, SIG_IGN); /* if pager is terminated before end */ X X turnoff(glob_flags, IGN_SIGS); X*************** X*** 97,103 **** X * (current message, deleted, unread, etc) are found in mail_status. X */ X mail_status(1); X! if (Getstr(line, 256, 0) > -1) X p = line; X else { X if (p = do_set(set_options, "ignoreeof")) { X--- 103,109 ---- X * (current message, deleted, unread, etc) are found in mail_status. X */ X mail_status(1); X! if (Getstr(line, sizeof(line), 0) > -1) X p = line; X else { X if (p = do_set(set_options, "ignoreeof")) { X*** OLD/mail.c Wed Apr 6 22:48:01 1988 X--- mail.c Tue Apr 26 20:09:58 1988 X*************** X*** 1137,1150 **** X X /* Make folders conform to RFC-822 by adding From: and Date: headers. X * Some older mailers (binmail, execmail, delivermail), don't add X! * these headers to the MTA, so add them for OLD_MAIL systems. X */ X for (size = 0; size < next_file; size++) { X time_t t; X! #ifndef OLD_MAIL X if (size == 0) X continue; X! #endif /* OLD_MAIL */ X (void) time(&t); X if (size > 0) { X #ifndef MSG_SEPARATOR X--- 1137,1150 ---- X X /* Make folders conform to RFC-822 by adding From: and Date: headers. X * Some older mailers (binmail, execmail, delivermail), don't add X! * these headers to the MTA, so add them for OLD_MAILER systems. X */ X for (size = 0; size < next_file; size++) { X time_t t; X! #ifndef OLD_MAILER X if (size == 0) X continue; X! #endif /* OLD_MAILER */ X (void) time(&t); X if (size > 0) { X #ifndef MSG_SEPARATOR X*** OLD/msgs.c Wed Apr 6 22:48:02 1988 X--- msgs.c Tue Apr 26 20:14:45 1988 X*************** X*** 305,310 **** X--- 307,313 ---- X (void) fclose(mail_fp); X return; X } X+ (void) fseek(tmpf, 0L, 2); /* assure we're at the end of the file */ X } else if (msg_cnt) X (void) fseek(tmpf, msg[msg_cnt-1].m_offset+msg[msg_cnt-1].m_size,L_SET); X X*** OLD/mush.h Wed Apr 6 22:48:02 1988 X--- mush.h Tue Apr 26 21:09:52 1988 X*************** X*** 1,6 **** X /* @(#)mush.h (c) copyright 1986 (Dan Heller) */ X X! #define VERSION "Mail User's Shell (Vers 6.0) Sat Apr 2 19:36:07 PST 1988" X X #include "config.h" X X--- 1,6 ---- X /* @(#)mush.h (c) copyright 1986 (Dan Heller) */ X X! #define VERSION "Mail User's Shell (6.1 4/26/88)" X X #include "config.h" X X*************** X*** 78,85 **** X #ifdef putchar X #undef putchar X #endif /* putchar */ X! #define putchar(c) fputc(c, stdout) X! #define bell() fputc('\007', stderr) X X /* For error recovery purposes, send keyboard generated signals to a special X * routine (interrupt) to set a global flag (WAS_INTR) and return to the X--- 78,85 ---- X #ifdef putchar X #undef putchar X #endif /* putchar */ X! #define putchar(c) fputc(c, stdout), fflush(stdout) X! #define bell() fputc('\007', stderr), fflush(stderr) X X /* For error recovery purposes, send keyboard generated signals to a special X * routine (interrupt) to set a global flag (WAS_INTR) and return to the X*************** X*** 181,190 **** X #endif /* F_OK */ X typedef unsigned long u_long; X #define vfork fork X! #ifdef SIGCHLD X! #undef SIGCHLD X! #endif /* SIGCHLD */ X #define SIGCHLD SIGCLD X #endif /* SYSV */ X X #if !defined(SUNTOOL) && !defined(CURSES) X--- 181,189 ---- X #endif /* F_OK */ X typedef unsigned long u_long; X #define vfork fork X! #ifndef SIGCHLD X #define SIGCHLD SIGCLD X+ #endif /* SIGCHLD */ X #endif /* SYSV */ X X #if !defined(SUNTOOL) && !defined(CURSES) X*************** X*** 277,283 **** X #define NO_FLG 0 X X /* various flags */ X! long glob_flags; /* global boolean flags thruout the whole program */ X #define DO_UPDATE 1 /* check for changes to avoid unnecessary copyback */ X #define REV_VIDEO 2 /* reverse video for curses or toolmode */ X #define CONT_PRNT 3 /* continue to print (maybe a printf) without a '\n' */ X--- 276,282 ---- X #define NO_FLG 0 X X /* various flags */ X! u_long glob_flags; /* global boolean flags thruout the whole program */ X #define DO_UPDATE 1 /* check for changes to avoid unnecessary copyback */ X #define REV_VIDEO 2 /* reverse video for curses or toolmode */ X #define CONT_PRNT 3 /* continue to print (maybe a printf) without a '\n' */ X*** OLD/signals.c Wed Apr 6 22:48:03 1988 X--- signals.c Wed Apr 27 21:36:43 1988 X*************** X*** 179,186 **** X msg_cnt) { X int curlin = max(1, current_msg - n_array[0] + 1); X char buf[256]; X! (void) strncpy(buf, stdscr->_y[curlin], COLS-1); X! buf[COLS-1] = 0; /* strncpy does not null terminate */ X STANDOUT(curlin, 0, buf); X } X print("Stopping..."); X--- 179,185 ---- X msg_cnt) { X int curlin = max(1, current_msg - n_array[0] + 1); X char buf[256]; X! scrn_line(curlin, buf); X STANDOUT(curlin, 0, buf); X } X print("Stopping..."); X X*** OLD/print.c Thu Apr 28 22:45:28 1988 X--- print.c Thu Apr 28 22:45:59 1988 X*************** X*** 1,3 **** X--- 1,4 ---- X+ X /* @(#)print.c 2.4 (c) copyright 10/15/86 (Dan Heller) */ X X #include "mush.h" X*************** X*** 36,43 **** X static int x; /* position on line saved for continued prints */ X char *p; /* same type as struct file _ptr,_buf in stdio.h */ X X- va_start(args); /* have args point to the beginning of argument stack */ X- X #ifdef CURSES X if (iscurses) { X if (isoff(glob_flags, CONT_PRNT)) X--- 37,42 ---- X*************** X*** 45,72 **** X } else X #endif /* CURSES */ X if (istool < 2) { X #ifdef VPRINTF X vprintf(fmt, args); X #else /* VPRINTF */ X _doprnt(fmt, args, stdout); X #endif /* VPRINTF */ X- fflush(stdout); X va_end(args); X return; X } X #ifdef VPRINTF X! if (fmt) X! vsprintf(msgbuf, fmt, args); /* NULL in fmt reprints last msg */ X #else /* VPRINTF */ X! foo._cnt = BUFSIZ; X! foo._base = foo._ptr = msgbuf; /* may have to be cast(unsigned char *) */ X! foo._flag = _IOWRT+_IOSTRG; X! if (fmt) { /* passing NULL (not "") reprints last message */ X! (void) _doprnt(fmt, args, &foo); X! *foo._ptr = '\0'; /* plant terminating null character */ X } X- #endif /* VPIRNTF */ X- va_end(args); X p = msgbuf; X if (iscurses || istool) X while (p = index(p, '\n')) X--- 44,72 ---- X } else X #endif /* CURSES */ X if (istool < 2) { X+ va_start(args); X #ifdef VPRINTF X vprintf(fmt, args); X #else /* VPRINTF */ X _doprnt(fmt, args, stdout); X #endif /* VPRINTF */ X va_end(args); X+ fflush(stdout); X return; X } X+ if (fmt) { X+ va_start(args); X #ifdef VPRINTF X! vsprintf(msgbuf, fmt, args); /* NULL in fmt reprints last msg */ X #else /* VPRINTF */ X! foo._cnt = BUFSIZ; X! foo._base = foo._ptr = msgbuf; /* may have to be cast(unsigned char *) */ X! foo._flag = _IOWRT+_IOSTRG; X! (void) _doprnt(fmt, args, &foo); X! *foo._ptr = '\0'; /* plant terminating null character */ X! #endif /* VPRINTF */ X! va_end(args); X } X p = msgbuf; X if (iscurses || istool) X while (p = index(p, '\n')) X*************** X*** 88,93 **** X--- 88,94 ---- X turnon(glob_flags, CNTD_CMD); /* display ...continue... prompt */ X } X turnoff(glob_flags, CONT_PRNT); X+ fflush(stdout); /* some sys-v's aren't fflushing \n's */ X return; X } X #endif /* CURSES */ X*************** X*** 117,125 **** X char msgbuf[BUFSIZ]; /* we're not getting huge strings */ X va_list args; X X- va_start(args); X- X if (istool < 2) { X #ifdef VPRINTF X vprintf(fmt, args); X #else /* VPRINTF */ X--- 118,125 ---- X char msgbuf[BUFSIZ]; /* we're not getting huge strings */ X va_list args; X X if (istool < 2) { X+ va_start(args); X #ifdef VPRINTF X vprintf(fmt, args); X #else /* VPRINTF */ X*************** X*** 131,136 **** X--- 131,137 ---- X } X if (!fmt) X return; X+ va_start(args); X #ifdef VPRINTF X vsprintf(msgbuf, fmt, args); /* NULL in fmt reprints last msg */ X #else /* VPRINTF */ X*************** X*** 140,145 **** X--- 141,147 ---- X _doprnt(fmt, args, &foo); /* format like printf into msgbuf via foo */ X *foo._ptr = '\0'; /* plant terminating null character */ X #endif /* VPRINTF */ X+ va_end(args); X Addstr(msgbuf); /* addstr() will scroll if necessary */ X } X X*************** X*** 183,185 **** X--- 185,188 ---- X { X print(""); X } X+ END_OF_FILE if test 12806 -ne `wc -c <'Diffs'`; then echo shar: \"'Diffs'\" unpacked with wrong size! fi # end of 'Diffs' fi echo shar: End of shell archive. exit 0 -- Please send comp.sources.unix-related mail to rsalz@uunet.uu.net.