v14i077: Mush updates for SystemV, etc., Patch1

Rich Salz rsalz at bbn.com
Sat Apr 30 06:22:19 AEST 1988


Submitted-by: island!argv at 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 at 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 at 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 at 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 at uunet.uu.net.



More information about the Comp.sources.unix mailing list