Bourne shell history + tilde + job control + more (Part 5 of 9)

sources-request at genrad.UUCP sources-request at genrad.UUCP
Wed Jun 12 01:46:38 AEST 1985


From: Arnold Robbins <gatech!arnold>

This is part 5 of 9.  It contains the first set of code diffs for the System V
Release 2 Bourne shell.

BSD users who happen to also have source for System V Release 2 will probably
want to use this version of the shell, since it has many bug fixes and
improvements over the (much) earlier version that comes with Berkeley Unix.

Arnold Robbins
arnold at gatech.{UUCP, CSNET}
----------- pretend your screen is really a paper towel ------------
:::::::: :fix :::::::
No differences encountered
:::::::: args.c :::::::
*** ../orig.u/args.c	Wed May 15 17:08:06 1985
--- args.c	Mon May 20 15:20:33 1985
***************
*** 13,19
  extern struct dolnod *freeargs();
  static struct dolnod *dolh;
  
! char	flagadr[14];
  
  char	flagchar[] =
  {

--- 13,23 -----
  extern struct dolnod *freeargs();
  static struct dolnod *dolh;
  
! #if JOBS
! char	flagadr[19];
! #else
! char	flagadr[17];
! #endif
  
  char	flagchar[] =
  {
***************
*** 30,35
  	'h',
  	'f',
  	'a',
  	 0
  };
  

--- 34,46 -----
  	'h',
  	'f',
  	'a',
+ #if JOBS
+ 	'J',
+ 	'I',
+ #endif
+ 	'E',
+ 	'q',	/* ADR --- -q to not read ~/.shrc */
+ 	'H',	/* ADR --- -H to turn off history mechanism */
  	 0
  };
  
***************
*** 48,53
  	hashflg,
  	nofngflg,
  	exportflg,
  	  0
  };
  

--- 59,71 -----
  	hashflg,
  	nofngflg,
  	exportflg,
+ #if JOBS
+ 	jobflg,
+ 	infoflg,
+ #endif
+ 	noeotflg,
+ 	quickflg,
+ 	nohistflg,
  	  0
  };
  
***************
*** 83,89
  
  		/*
  		 * Step along 'flagchar[]' looking for matches.
! 		 * 'sicr' are not legal with 'set' command.
  		 */
  
  		while (*++cp)

--- 101,107 -----
  
  		/*
  		 * Step along 'flagchar[]' looking for matches.
! 		 * 'sicrq' are not legal with 'set' command.
  		 */
  
  		while (*++cp)
***************
*** 93,99
  				flagc++;
  			if (*cp == *flagc)
  			{
! 				if (eq(argv[0], "set") && any(*cp, "sicr"))
  					failed(argv[1], badopt);
  				else
  				{

--- 111,117 -----
  				flagc++;
  			if (*cp == *flagc)
  			{
! 				if (eq(argv[0], "set") && any(*cp, "sicrq"))
  					failed(argv[1], badopt);
  				else
  				{
***************
*** 97,102
  					failed(argv[1], badopt);
  				else
  				{
  					flags |= flagval[flagc-flagchar];
  					if (flags & errflg)
  						eflag = errflg;

--- 115,124 -----
  					failed(argv[1], badopt);
  				else
  				{
+ #if JOBS
+ 					if (*cp == 'J')
+ 						j_init();
+ #endif
  					flags |= flagval[flagc-flagchar];
  					if (flags & errflg)
  						eflag = errflg;
***************
*** 116,121
  		argc--;
  	}
  	else if (argc > 1 && *argp[1] == '+')	/* unset flags x, k, t, n, v, e, u */
  	{
  		cp = argp[1];
  		while (*++cp)

--- 138,144 -----
  		argc--;
  	}
  	else if (argc > 1 && *argp[1] == '+')	/* unset flags x, k, t, n, v, e, u */
+ 						/* or jobs or history flag */
  	{
  		cp = argp[1];
  		while (*++cp)
***************
*** 126,132
  			/*
  			 * step through flags
  			 */
! 			if (!any(*cp, "sicr") && *cp == *flagc)
  			{
  				/*
  				 * only turn off if already on

--- 149,155 -----
  			/*
  			 * step through flags
  			 */
! 			if (!any(*cp, "sicrq") && *cp == *flagc)
  			{
  				/*
  				 * only turn off if already on
***************
*** 133,139
  				 */
  				if ((flags & flagval[flagc-flagchar]))
  				{
! 					flags &= ~(flagval[flagc-flagchar]);
  					if (*cp == 'e')
  						eflag = 0;
  				}

--- 156,165 -----
  				 */
  				if ((flags & flagval[flagc-flagchar]))
  				{
! #if JOBS
! 					if (*cp != 'J' || !j_finish(FALSE))
! #endif
! 						flags &= ~(flagval[flagc-flagchar]);
  					if (*cp == 'e')
  						eflag = 0;
  				}
:::::::: blok.c :::::::
*** ../orig.u/blok.c	Wed May 15 17:08:06 1985
--- blok.c	Thu May 16 16:56:01 1985
***************
*** 102,107
  {
  	register struct blk *p;
  
  	if ((p = ap) && p < bloktop)
  	{
  #ifdef DEBUG

--- 102,116 -----
  {
  	register struct blk *p;
  
+ #if gould
+ /*
+  *	On Vax, <bloktop skips things on stack, doesn't on Gould
+  *	where stack is below text.
+  */
+ 	int csrt();
+ 
+ 	if ((p = ap) && p < bloktop && p > (struct blk *)csrt)
+ #else
  	if ((p = ap) && p < bloktop)
  #endif
  	{
***************
*** 103,108
  	register struct blk *p;
  
  	if ((p = ap) && p < bloktop)
  	{
  #ifdef DEBUG
  		chkbptr(p);

--- 112,118 -----
  	if ((p = ap) && p < bloktop && p > (struct blk *)csrt)
  #else
  	if ((p = ap) && p < bloktop)
+ #endif
  	{
  #ifdef DEBUG
  		chkbptr(p);
:::::::: brkincr.h :::::::
*** ../orig.u/brkincr.h	Wed May 15 17:08:07 1985
--- brkincr.h	Thu May 16 16:57:06 1985
***************
*** 1,4
  /*	@(#)brkincr.h	1.2	*/
  /*	3.0 SID #	1.1	*/
  #define BRKINCR 01000
  #define BRKMAX 04000

--- 1,9 -----
  /*	@(#)brkincr.h	1.2	*/
  /*	3.0 SID #	1.1	*/
+ #if gould
+ #define BRKINCR 0x1000
+ #define BRKMAX 0x2000
+ #else
  #define BRKINCR 01000
  #define BRKMAX 04000
  #endif
***************
*** 2,4
  /*	3.0 SID #	1.1	*/
  #define BRKINCR 01000
  #define BRKMAX 04000

--- 6,9 -----
  #else
  #define BRKINCR 01000
  #define BRKMAX 04000
+ #endif
:::::::: cmd.c :::::::
No differences encountered
:::::::: ctype.c :::::::
*** ../orig.u/ctype.c	Wed May 15 17:08:09 1985
--- ctype.c	Mon May 20 16:14:46 1985
***************
*** 21,26
  	0,	0,	0,	0,	0,	0,	0,	0,
  
  /*	sp	!	"	#	$	%	&	'	*/
  	_SPC,	0,	_DQU,	0,	_DOL1,	0,	_AMP,	0,
  
  /*	(	)	*	+	,	-	.	/	*/

--- 21,29 -----
  	0,	0,	0,	0,	0,	0,	0,	0,
  
  /*	sp	!	"	#	$	%	&	'	*/
+ #if JOBS
+ 	_SPC,	0,	_DQU,	0,	_DOL1,	_PCT,	_AMP,	0,
+ #else
  	_SPC,	0,	_DQU,	0,	_DOL1,	0,	_AMP,	0,
  #endif
  
***************
*** 22,27
  
  /*	sp	!	"	#	$	%	&	'	*/
  	_SPC,	0,	_DQU,	0,	_DOL1,	0,	_AMP,	0,
  
  /*	(	)	*	+	,	-	.	/	*/
  	_BRA,	_KET,	0,	0,	0,	0,	0,	0,

--- 25,31 -----
  	_SPC,	0,	_DQU,	0,	_DOL1,	_PCT,	_AMP,	0,
  #else
  	_SPC,	0,	_DQU,	0,	_DOL1,	0,	_AMP,	0,
+ #endif
  
  /*	(	)	*	+	,	-	.	/	*/
  	_BRA,	_KET,	0,	0,	0,	0,	0,	0,
:::::::: ctype.h :::::::
*** ../orig.u/ctype.h	Wed May 15 17:08:09 1985
--- ctype.h	Thu May 16 16:59:28 1985
***************
*** 46,51
  #define _BSL	(T_ESC)
  #define _DQU	(T_QOT)
  #define _DOL1	(T_SUB|T_ESC)
  
  #define _CBR	T_BRC
  #define _CKT	T_DEF

--- 46,54 -----
  #define _BSL	(T_ESC)
  #define _DQU	(T_QOT)
  #define _DOL1	(T_SUB|T_ESC)
+ #if JOBS
+ #define _PCT	(T_SUB|T_ESC)
+ #endif
  
  #define _CBR	T_BRC
  #define _CKT	T_DEF
***************
*** 77,83
  extern char	_ctype2[];
  
  #define	digit(c)	(((c)&QUOTE)==0 && _ctype2[c]&(T_DIG))
! #define dolchar(c)	(((c)&QUOTE)==0 && _ctype2[c]&(T_AST|T_BRC|T_DIG|T_IDC|T_SHN))
  #define defchar(c)	(((c)&QUOTE)==0 && _ctype2[c]&(T_DEF))
  #define setchar(c)	(((c)&QUOTE)==0 && _ctype2[c]&(T_SET))
  #define digchar(c)	(((c)&QUOTE)==0 && _ctype2[c]&(T_AST|T_DIG))

--- 80,86 -----
  extern char	_ctype2[];
  
  #define	digit(c)	(((c)&QUOTE)==0 && _ctype2[c]&(T_DIG))
! #define dolchar(c)	(((c)&QUOTE)==0 && _ctype2[c]&(T_AST|T_BRC|T_DIG|T_IDC|T_SHN|_PLS))
  #define defchar(c)	(((c)&QUOTE)==0 && _ctype2[c]&(T_DEF))
  #define setchar(c)	(((c)&QUOTE)==0 && _ctype2[c]&(T_SET))
  #define digchar(c)	(((c)&QUOTE)==0 && _ctype2[c]&(T_AST|T_DIG))
:::::::: defs.c :::::::
*** ../orig.u/defs.c	Wed May 15 17:08:10 1985
--- defs.c	Mon May 20 15:56:37 1985
***************
*** 17,22
  struct ionod	*iopend;	/* documents waiting to be read at NL */
  struct fdsave	fdmap[NOFILE];
  
  /* substitution */
  int				dolc;
  char			**dolv;

--- 17,34 -----
  struct ionod	*iopend;	/* documents waiting to be read at NL */
  struct fdsave	fdmap[NOFILE];
  
+ /* history stuff */
+ int	event_count = 1;	/* event counting for the prompt */
+ int	expanded;		/* did a history expansion occur */
+ 
+ /* keep track of the parent pid */
+ int	ppid;
+ 
+ #if pyr
+ /* keep track of the current universe */
+ int	cur_univ;
+ #endif
+ 
  /* substitution */
  int				dolc;
  char			**dolv;
***************
*** 36,41
  /* special names */
  char			*pcsadr;
  char			*pidadr;
  char			*cmdadr;
  
  /* transput */ 

--- 48,54 -----
  /* special names */
  char			*pcsadr;
  char			*pidadr;
+ char			*ppidadr;
  char			*cmdadr;
  
  /* transput */ 
***************
*** 58,63
  /* execflgs */
  int				exitval;
  int				retval;
  BOOL			execbrk;
  int				loopcnt;
  int				breakcnt;

--- 71,79 -----
  /* execflgs */
  int				exitval;
  int				retval;
+ #if gould
+ int			execbrk;
+ #else
  BOOL			execbrk;
  #endif
  int				loopcnt;
***************
*** 59,64
  int				exitval;
  int				retval;
  BOOL			execbrk;
  int				loopcnt;
  int				breakcnt;
  int 			funcnt;

--- 75,81 -----
  int			execbrk;
  #else
  BOOL			execbrk;
+ #endif
  int				loopcnt;
  int				breakcnt;
  int 			funcnt;
:::::::: defs.h :::::::
*** ../orig.u/defs.h	Wed May 15 17:08:11 1985
--- defs.h	Wed Jun  5 15:20:27 1985
***************
*** 3,8
   *	UNIX shell
   */
  
  
  /* error exits from various parts of shell */
  #define 	ERROR		1

--- 3,11 -----
   *	UNIX shell
   */
  
+ #if JOBS || gould || pyr
+ #define		void	int	/* avoid compiler bug */
+ #endif
  
  /* error exits from various parts of shell */
  #define 	ERROR		1
***************
*** 74,79
  #define		SYSMEM		27
  #define		SYSTYPE  	28
  
  /* used for input and output of shell */
  #define 	INIO 		19
  

--- 77,99 -----
  #define		SYSMEM		27
  #define		SYSTYPE  	28
  
+ #if JOBS
+ #define		SYSJOBS		29
+ #define		SYSFG		30
+ #define		SYSBG		31
+ #define		SYSSUSPEND	32
+ #endif
+ 
+ #if pyr
+ #define		SYSATT		33
+ #define		SYSUCB		34
+ #define		SYSUNIVERSE	35
+ #define		U_ATT		1	/* ATT is Universe number 1 */
+ #define		U_UCB		2	/* UCB is Universe number 2 */
+ #endif
+ 
+ #define		SYSHISTORY	36
+ 
  /* used for input and output of shell */
  #define 	INIO 		19
  
***************
*** 96,101
  #include	"mode.h"
  #include	"name.h"
  #include	<signal.h>
  
  
  /*	error catching */

--- 116,133 -----
  #include	"mode.h"
  #include	"name.h"
  #include	<signal.h>
+ #if defined(JOBS) && ! defined (pyr)	/* avoid dual universe problems */
+ #define		SIGUSR1 16
+ #define		SIGUSR2	17
+ #else
+ #if ! defined (pyr)	/* avoid dual universe problems */
+ #define		SIGSTOP	17
+ #define		SIGTSTP	18
+ #define		SIGCONT	19
+ #define		SIGTTIN	21
+ #define		SIGTTOU	22
+ #endif
+ #endif
  
  #define		HISTSIZE	4096
  
***************
*** 97,102
  #include	"name.h"
  #include	<signal.h>
  
  
  /*	error catching */
  extern int 		errno;

--- 129,135 -----
  #endif
  #endif
  
+ #define		HISTSIZE	4096
  
  /*	error catching */
  extern int 		errno;
***************
*** 122,127
  extern char				*mactrim();
  extern char				*macro();
  extern char				*execs();
  extern char				*copyto();
  extern int				exname();
  extern char				*staknam();

--- 155,163 -----
  extern char				*mactrim();
  extern char				*macro();
  extern char				*execs();
+ extern char				*homedir();
+ extern char				*username();
+ extern char				*retcwd();
  extern char				*copyto();
  extern int				exname();
  extern char				*staknam();
***************
*** 130,135
  extern int				printexp();
  extern char				**setenv();
  extern long				time();
  
  #define 	attrib(n,f)		(n->namflg |= f)
  #define 	round(a,b)		(((int)(((char *)(a)+b)-1))&~((b)-1))

--- 166,178 -----
  extern int				printexp();
  extern char				**setenv();
  extern long				time();
+ #if JOBS
+ extern int				cwdir();	/* chdir() interface */
+ extern BOOL				unpost();
+ extern BOOL				j_finish();
+ extern char				*j_macro();
+ #endif
+ extern int				history();
  
  #define 	attrib(n,f)		(n->namflg |= f)
  #define 	round(a,b)		(((int)(((char *)(a)+b)-1))&~((b)-1))
***************
*** 146,151
  extern struct ionod		*iopend;	/* documents waiting to be read at NL */
  extern struct fdsave	fdmap[];
  
  
  /* substitution */
  extern int				dolc;

--- 189,197 -----
  extern struct ionod		*iopend;	/* documents waiting to be read at NL */
  extern struct fdsave	fdmap[];
  
+ /* history stuff */
+ extern int	event_count;	/* event counting for the prompt */
+ extern int	expanded;	/* did a history expansion occur? */
  
  /* keep track of the parent pid */
  extern int	ppid;
***************
*** 147,152
  extern struct fdsave	fdmap[];
  
  
  /* substitution */
  extern int				dolc;
  extern char				**dolv;

--- 193,208 -----
  extern int	event_count;	/* event counting for the prompt */
  extern int	expanded;	/* did a history expansion occur? */
  
+ /* keep track of the parent pid */
+ extern int	ppid;
+ 
+ #if pyr
+ /* keep track of the current universe */
+ extern int	cur_univ;
+ extern char	*univ_name[];		/* from <universe.h> */
+ extern char	*univ_longname[];
+ #endif
+ 
  /* substitution */
  extern int				dolc;
  extern char				**dolv;
***************
*** 166,171
  extern char				unexpected[];
  extern char				endoffile[];
  extern char				synmsg[];
  
  /* name tree and words */
  extern struct sysnod	reserved[];

--- 222,274 -----
  extern char				unexpected[];
  extern char				endoffile[];
  extern char				synmsg[];
+ extern char				dashi[];	/* ADR -- for history */
+ extern char				dashr[];	/* ADR */
+ extern char				dashs[];	/* ADR */
+ extern char				rdwstr[];	/* ADR */
+ #if JOBS
+ extern char				rsqbrk[];
+ extern char				spspstr[];
+ extern char				fgdstr[];
+ extern char				stpdstr[];
+ extern char				lotspstr[];
+ extern char				psgpstr[];
+ extern char				ptinstr[];
+ extern char				ptoustr[];
+ extern char				bgdstr[];
+ extern char				spcstr[];
+ extern char				rdinstr[];
+ extern char				appdstr[];
+ extern char				inlnstr[];
+ extern char				sfnstr[];
+ extern char				efnstr[];
+ extern char				semspstr[];
+ extern char				lpnstr[];
+ extern char				rpnstr[];
+ extern char				insstr[];
+ extern char				sdostr[];
+ extern char				sdonstr[];
+ extern char				sthnstr[];
+ extern char				selsstr[];
+ extern char				sfistr[];
+ extern char				iesacstr[];
+ extern char				casestr[];
+ extern char				pipestr[];
+ extern char				toastr[];
+ extern char				fromastr[];
+ extern char				andstr[];
+ extern char				orstr[];
+ extern char				forstr[];
+ extern char				amperstr[];
+ extern char				forstr[];
+ extern char				whilestr[];
+ extern char				untilstr[];
+ extern char				ifstr[];
+ extern char				casestr[];
+ #endif
+ #if SYMLINK
+ extern char				nolstat[];
+ #endif
  
  /* name tree and words */
  extern struct sysnod	reserved[];
***************
*** 186,191
  extern char				supprompt[];
  extern char				profile[];
  extern char				sysprofile[];
  
  /* built in names */
  extern struct namnod	fngnod;

--- 289,296 -----
  extern char				supprompt[];
  extern char				profile[];
  extern char				sysprofile[];
+ extern char				shrc[];
+ extern char				savehist[];
  
  /* built in names */
  extern struct namnod	fngnod;
***************
*** 199,204
  extern struct namnod	mchknod;
  extern struct namnod	acctnod;
  extern struct namnod	mailpnod;
  
  /* special names */
  extern char				flagadr[];

--- 304,313 -----
  extern struct namnod	mchknod;
  extern struct namnod	acctnod;
  extern struct namnod	mailpnod;
+ #if pyr
+ extern struct namnod	univnod;
+ #endif
+ extern struct namnod	histfnod;
  
  /* special names */
  extern char				flagadr[];
***************
*** 204,209
  extern char				flagadr[];
  extern char				*pcsadr;
  extern char				*pidadr;
  extern char				*cmdadr;
  
  extern char				defpath[];

--- 313,319 -----
  extern char				flagadr[];
  extern char				*pcsadr;
  extern char				*pidadr;
+ extern char				*ppidadr;
  extern char				*cmdadr;
  
  extern char				defpath[];
***************
*** 219,224
  extern char				mchkname[];
  extern char				acctname[];
  extern char				mailpname[];
  
  /* transput */
  extern char				tmpout[];

--- 329,338 -----
  extern char				mchkname[];
  extern char				acctname[];
  extern char				mailpname[];
+ #if pyr
+ extern char				univname[];	/* UNIVERSE */
+ #endif
+ extern char				histfilename[];	/* HISTFILE */
  
  /* transput */
  extern char				tmpout[];
***************
*** 236,241
  extern int				peekn;
  extern char				*comdiv;
  extern char				devnull[];
  
  /* flags */
  #define		noexec		01

--- 350,361 -----
  extern int				peekn;
  extern char				*comdiv;
  extern char				devnull[];
+ extern BOOL		catcheof;	/* set to catch EOF in readc() */
+ #if JOBS
+ extern int		j_original_pg;
+ extern int		j_default_pg;
+ extern BOOL		j_top_level;
+ #endif
  
  /* flags */
  #define		noexec		01
***************
*** 257,262
  #define		hashflg		040000
  #define		nofngflg	0200000
  #define		exportflg	0400000
  
  extern long				flags;
  extern int				rwait;	/* flags read waiting */

--- 377,390 -----
  #define		hashflg		040000
  #define		nofngflg	0200000
  #define		exportflg	0400000
+ #if JOBS
+ #define		jobflg		01000000
+ #define		infoflg		02000000
+ #endif
+ #define		dotflg		04000000
+ #define		noeotflg	010000000
+ #define		quickflg	020000000
+ #define		nohistflg	040000000
  
  extern long				flags;
  extern int				rwait;	/* flags read waiting */
***************
*** 265,270
  #include	<setjmp.h>
  extern jmp_buf			subshell;
  extern jmp_buf			errshell;
  
  /* fault handling */
  #include	"brkincr.h"

--- 393,402 -----
  #include	<setjmp.h>
  extern jmp_buf			subshell;
  extern jmp_buf			errshell;
+ #if defined(JOBS) && !defined(pyr)
+ #define setjmp(env)	_setjmp(env)
+ #define longjmp(env, val)	_longjmp(env, val)
+ #endif
  
  /* fault handling */
  #include	"brkincr.h"
***************
*** 271,276
  
  extern unsigned			brkincr;
  #define 	MINTRAP		0
  #define 	MAXTRAP		20
  
  #define 	TRAPSET		2

--- 403,411 -----
  
  extern unsigned			brkincr;
  #define 	MINTRAP		0
+ #if defined (JOBS)
+ #define		MAXTRAP		32
+ #else
  #define 	MAXTRAP		20
  #endif
  
***************
*** 272,277
  extern unsigned			brkincr;
  #define 	MINTRAP		0
  #define 	MAXTRAP		20
  
  #define 	TRAPSET		2
  #define 	SIGSET		4

--- 407,413 -----
  #define		MAXTRAP		32
  #else
  #define 	MAXTRAP		20
+ #endif
  
  #define 	TRAPSET		2
  #define 	SIGSET		4
***************
*** 278,284
  #define 	SIGMOD		8
  #define 	SIGCAUGHT	16
  
! extern int				fault();
  extern BOOL				trapnote;
  extern char				*trapcom[];
  extern BOOL				trapflg[];

--- 414,421 -----
  #define 	SIGMOD		8
  #define 	SIGCAUGHT	16
  
! extern void				fault();
! extern void				done();
  extern BOOL				trapnote;
  extern char				*trapcom[];
  extern BOOL				trapflg[];
***************
*** 293,298
  /* execflgs */
  extern int				exitval;
  extern int				retval;
  extern BOOL				execbrk;
  extern int				loopcnt;
  extern int				breakcnt;

--- 430,438 -----
  /* execflgs */
  extern int				exitval;
  extern int				retval;
+ #if gould
+ extern int				execbrk;
+ #else
  extern BOOL				execbrk;
  #endif
  extern int				loopcnt;
***************
*** 294,299
  extern int				exitval;
  extern int				retval;
  extern BOOL				execbrk;
  extern int				loopcnt;
  extern int				breakcnt;
  extern int				funcnt;

--- 434,440 -----
  extern int				execbrk;
  #else
  extern BOOL				execbrk;
+ #endif
  extern int				loopcnt;
  extern int				breakcnt;
  extern int				funcnt;
***************
*** 332,337
  extern char				badunset[];
  extern char				nohome[];
  extern char				badperm[];
  
  /*	'builtin' error messages	*/
  

--- 473,487 -----
  extern char				badunset[];
  extern char				nohome[];
  extern char				badperm[];
+ #if JOBS
+ extern char				cjpostr[];
+ extern char				jcoffstr[];
+ extern char				jpanstr[];
+ extern char				jinvstr[];
+ extern char				ncjstr[];
+ extern char				nstpstr[];
+ extern char				tasjstr[];
+ #endif
  
  /*	'builtin' error messages	*/
  
:::::::: dup.h :::::::
No differences encountered
:::::::: echo.c :::::::
*** ../orig.u/echo.c	Wed May 15 17:08:12 1985
--- echo.c	Tue May 21 18:05:45 1985
***************
*** 4,9
   *
   *	Bell Telephone Laboratories
   *
   */
  #include	"defs.h"
  

--- 4,11 -----
   *
   *	Bell Telephone Laboratories
   *
+  *	DAG -- changed to support 7th Edition "-n" option;
+  *	still not fully compatible since \ escapes are interpreted
   */
  #include	"defs.h"
  
***************
*** 17,22
  	register char	*cp;
  	register int	i, wd;
  	int	j;
  	
  	if(--argc == 0) {
  		prc_buff('\n');

--- 19,27 -----
  	register char	*cp;
  	register int	i, wd;
  	int	j;
+ #if JOBS
+ 	int	no_nl;
+ #endif
  	
  	if(--argc == 0) {
  		prc_buff('\n');
***************
*** 23,28
  		exit(0);
  	}
  
  	for(i = 1; i <= argc; i++) 
  	{
  		sigchk();

--- 28,40 -----
  		exit(0);
  	}
  
+ #if JOBS
+ 	if (no_nl = eq(argv[1], "-n"))	/* old-style no-newline flag */
+ 	{
+ 		--argc;			/* skip over "-n" argument */
+ 		++argv;
+ 	}
+ #endif
  	for(i = 1; i <= argc; i++) 
  	{
  		sigchk();
***************
*** 76,82
  			}
  			prc_buff(*cp);
  		}
! 		prc_buff(i == argc? '\n': ' ');
  	}
  	exit(0);
  }

--- 88,95 -----
  			}
  			prc_buff(*cp);
  		}
! 		if (i != argc)
! 			prc_buff(' ');
  	}
  #if JOBS
  	if (!no_nl)
***************
*** 78,83
  		}
  		prc_buff(i == argc? '\n': ' ');
  	}
  	exit(0);
  }
  

--- 91,100 -----
  		if (i != argc)
  			prc_buff(' ');
  	}
+ #if JOBS
+ 	if (!no_nl)
+ #endif
+ 		prc_buff ('\n');
  	exit(0);
  }
  
:::::::: error.c :::::::
*** ../orig.u/error.c	Wed May 15 17:08:12 1985
--- error.c	Tue May 21 18:04:08 1985
***************
*** 56,61
  	}
  }
  
  done()
  {
  	register char	*t;

--- 56,62 -----
  	}
  }
  
+ void
  done()
  {
  	register char	*t;
***************
*** 75,80
  #ifdef ACCT
  	doacct();
  #endif
  	exit(exitval);
  }
  

--- 76,82 -----
  #ifdef ACCT
  	doacct();
  #endif
+ 	histsave (histfnod.namval);
  	exit(exitval);
  }
  
:::::::: expand.c :::::::
*** ../orig.u/expand.c	Wed May 15 17:08:13 1985
--- expand.c	Thu May 16 17:46:53 1985
***************
*** 9,14
  #include	"defs.h"
  #include	<sys/types.h>
  #include	<sys/stat.h>
  #include	<sys/dir.h>
  
  #define MAXDIR	64

--- 9,17 -----
  #include	"defs.h"
  #include	<sys/types.h>
  #include	<sys/stat.h>
+ #if JOBS
+ #include	<dir.h>
+ #else
  #include	<sys/dir.h>
  #endif
  
***************
*** 10,15
  #include	<sys/types.h>
  #include	<sys/stat.h>
  #include	<sys/dir.h>
  
  #define MAXDIR	64
  struct direct		*getdir();

--- 13,19 -----
  #include	<dir.h>
  #else
  #include	<sys/dir.h>
+ #endif
  
  #if JOBS
  #define		getdir(dirf)	readdir(dirf)
***************
*** 11,16
  #include	<sys/stat.h>
  #include	<sys/dir.h>
  
  #define MAXDIR	64
  struct direct		*getdir();
  

--- 15,24 -----
  #include	<sys/dir.h>
  #endif
  
+ #if JOBS
+ #define		getdir(dirf)	readdir(dirf)
+ #define		entry		e->d_name
+ #else
  #define MAXDIR	64
  struct direct		*getdir();
  
***************
*** 18,23
  static int		nxtdir = -1;
  static int		maxdir = 0;
  static char		entry[DIRSIZ+1];
  
  /*
   * globals (file name generation)

--- 26,32 -----
  static int		nxtdir = -1;
  static int		maxdir = 0;
  static char		entry[DIRSIZ+1];
+ #endif
  
  /*
   * globals (file name generation)
***************
*** 34,40
  expand(as, rcnt)
  	char	*as;
  {
! 	int	count, dirf;
  	BOOL	dir = 0;
  	char	*rescan = 0;
  	register char	*s, *cs;

--- 43,54 -----
  expand(as, rcnt)
  	char	*as;
  {
! 	int	count;
! #if JOBS
! 	DIR	*dirf;
! #else
! 	int	dirf;
! #endif
  	BOOL	dir = 0;
  	char	*rescan = 0;
  	register char	*s, *cs;
***************
*** 109,114
  		}
  	}
  
  	if ((dirf = open(*s ? s : ".", 0)) > 0)
  	{
  		if (fstat(dirf, &statb) != -1 &&

--- 123,131 -----
  		}
  	}
  
+ #if JOBS
+ 	if (dirf = opendir(*s ? s : ".", 0))
+ #else
  	if ((dirf = open(*s ? s : ".", 0)) > 0)
  #endif
  	{
***************
*** 110,115
  	}
  
  	if ((dirf = open(*s ? s : ".", 0)) > 0)
  	{
  		if (fstat(dirf, &statb) != -1 &&
  		    (statb.st_mode & S_IFMT) == S_IFDIR)

--- 127,133 -----
  	if (dirf = opendir(*s ? s : ".", 0))
  #else
  	if ((dirf = open(*s ? s : ".", 0)) > 0)
+ #endif
  	{
  #if JOBS
  		if (fstat(dirf->dd_fd, &statb) != -1 &&
***************
*** 111,116
  
  	if ((dirf = open(*s ? s : ".", 0)) > 0)
  	{
  		if (fstat(dirf, &statb) != -1 &&
  		    (statb.st_mode & S_IFMT) == S_IFDIR)
  			dir++;

--- 129,137 -----
  	if ((dirf = open(*s ? s : ".", 0)) > 0)
  #endif
  	{
+ #if JOBS
+ 		if (fstat(dirf->dd_fd, &statb) != -1 &&
+ #else
  		if (fstat(dirf, &statb) != -1 &&
  #endif
  		    (statb.st_mode & S_IFMT) == S_IFDIR)
***************
*** 112,117
  	if ((dirf = open(*s ? s : ".", 0)) > 0)
  	{
  		if (fstat(dirf, &statb) != -1 &&
  		    (statb.st_mode & S_IFMT) == S_IFDIR)
  			dir++;
  		else

--- 133,139 -----
  		if (fstat(dirf->dd_fd, &statb) != -1 &&
  #else
  		if (fstat(dirf, &statb) != -1 &&
+ #endif
  		    (statb.st_mode & S_IFMT) == S_IFDIR)
  			dir++;
  		else
***************
*** 115,120
  		    (statb.st_mode & S_IFMT) == S_IFDIR)
  			dir++;
  		else
  			close(dirf);
  	}
  

--- 137,145 -----
  		    (statb.st_mode & S_IFMT) == S_IFDIR)
  			dir++;
  		else
+ #if JOBS
+ 			closedir(dirf);
+ #else
  			close(dirf);
  #endif
  	}
***************
*** 116,121
  			dir++;
  		else
  			close(dirf);
  	}
  
  	count = 0;

--- 141,147 -----
  			closedir(dirf);
  #else
  			close(dirf);
+ #endif
  	}
  
  	count = 0;
***************
*** 139,144
  
  		while ((e = getdir(dirf)) && (trapnote & SIGSET) == 0)
  		{
  			*(movstrn(e->d_name, entry, DIRSIZ)) = 0;
  
  			if (entry[0] == '.' && *cs != '.')

--- 165,171 -----
  
  		while ((e = getdir(dirf)) && (trapnote & SIGSET) == 0)
  		{
+ #if !defined (JOBS)
  			*(movstrn(e->d_name, entry, DIRSIZ)) = 0;
  #endif
  
***************
*** 140,145
  		while ((e = getdir(dirf)) && (trapnote & SIGSET) == 0)
  		{
  			*(movstrn(e->d_name, entry, DIRSIZ)) = 0;
  
  			if (entry[0] == '.' && *cs != '.')
  #ifndef BOURNE

--- 167,173 -----
  		{
  #if !defined (JOBS)
  			*(movstrn(e->d_name, entry, DIRSIZ)) = 0;
+ #endif
  
  			if (entry[0] == '.' && *cs != '.')
  #ifndef BOURNE
***************
*** 159,164
  				count++;
  			}
  		}
  		close(dirf);
  
  		if (rescan)

--- 187,195 -----
  				count++;
  			}
  		}
+ #if JOBS
+ 		closedir(dirf);
+ #else
  		close(dirf);
  #endif
  
***************
*** 160,165
  			}
  		}
  		close(dirf);
  
  		if (rescan)
  		{

--- 191,197 -----
  		closedir(dirf);
  #else
  		close(dirf);
+ #endif
  
  		if (rescan)
  		{
***************
*** 191,196
  }
  
  
  reset_dir()
  {
  	nxtdir = -1;

--- 223,229 -----
  }
  
  
+ #if !defined (JOBS)
  reset_dir()
  {
  	nxtdir = -1;
***************
*** 231,236
  		return(&dirbuf[nxtdir]);
  	}
  }
  
  
  gmatch(s, p)

--- 264,270 -----
  		return(&dirbuf[nxtdir]);
  	}
  }
+ #endif
  
  
  gmatch(s, p)
:::::::: fault.c :::::::
*** ../orig.u/fault.c	Wed May 15 17:08:14 1985
--- fault.c	Wed May 22 11:50:16 1985
***************
*** 8,14
  
  #include	"defs.h"
  
! extern int	done();
  
  char	*trapcom[MAXTRAP];
  BOOL	trapflg[MAXTRAP] =

--- 8,14 -----
  
  #include	"defs.h"
  
! extern void	done();
  
  char	*trapcom[MAXTRAP];
  BOOL	trapflg[MAXTRAP] =
***************
*** 31,37
  	0, 	/* software termination */
  	0,	/* unassigned */
  	0,	/* unassigned */
! 	0,	/* death of child */
  	0,	/* power fail */
  };
  

--- 31,37 -----
  	0, 	/* software termination */
  	0,	/* unassigned */
  	0,	/* unassigned */
! 	0,	/* death of child (if not BSD) */
  	0,	/* power fail */
  };
  
***************
*** 35,41
  	0,	/* power fail */
  };
  
! int 	(*(sigval[]))() = 
  {
  	0,
  	done,

--- 35,41 -----
  	0,	/* power fail */
  };
  
! void 	(*(sigval[MAXTRAP]))() = 	/* DAG -- make sure ther are MAXTRAP */
  {
  	0,
  	done,
***************
*** 54,59
  	fault,
  	fault,
  	done,
  	done,
  	done,
  	done

--- 54,62 -----
  	fault,
  	fault,
  	done,
+ #if JOBS
+ 	0,	/* SIGSTOP */
+ #else
  	done,
  #endif
  	done,
***************
*** 55,60
  	fault,
  	done,
  	done,
  	done,
  	done
  };

--- 58,64 -----
  	0,	/* SIGSTOP */
  #else
  	done,
+ #endif
  	done,
  	done,
  #if JOBS
***************
*** 56,61
  	done,
  	done,
  	done,
  	done
  };
  

--- 60,78 -----
  	done,
  #endif
  	done,
+ 	done,
+ #if JOBS
+ 	done,
+ 	done,
+ 	done,
+ 	done,
+ 	done,
+ 	done,
+ 	done,
+ 	done,
+ 	done,
+ 	done,
+ 	done,
  	done
  #endif
  };
***************
*** 57,62
  	done,
  	done,
  	done
  };
  
  /* ========	fault handling routines	   ======== */

--- 74,80 -----
  	done,
  	done,
  	done
+ #endif
  };
  
  /* ========	fault handling routines	   ======== */
***************
*** 62,67
  /* ========	fault handling routines	   ======== */
  
  
  fault(sig)
  register int	sig;
  {

--- 80,86 -----
  /* ========	fault handling routines	   ======== */
  
  
+ void	/* DAG */
  fault(sig)
  register int	sig;
  {
***************
*** 105,111
  	setsig(SIGALRM);
  	setsig(SIGTERM);
  	setsig(SIGUSR1);
! 	setsig(SIGUSR2);
  }
  
  ignsig(n)

--- 124,132 -----
  	setsig(SIGALRM);
  	setsig(SIGTERM);
  	setsig(SIGUSR1);
! #ifndef JOBS
! 	setsig(SIGUSR2);	/* aka SIGSTOP */
! #endif
  }
  
  ignsig(n)
:::::::: func.c :::::::
*** ../orig.u/func.c	Wed May 15 17:08:15 1985
--- func.c	Wed Jun  5 16:04:53 1985
***************
*** 305,310
  					{
  						struct argnod	*arg = swl->regptr;
  
  						if (arg)
  						{
  							prs_buff(arg->argval);

--- 305,311 -----
  					{
  						struct argnod	*arg = swl->regptr;
  
+ 						prc_buff (NL);	/* DAG (was missing) */
  						if (arg)
  						{
  							prs_buff(arg->argval);
***************
*** 323,328
  						prs_buff(";;");
  						swl = swl->regnxt;
  					}
  				}
  				break;
  			} 

--- 324,330 -----
  						prs_buff(";;");
  						swl = swl->regnxt;
  					}
+ 					prs_buff ("\nesac");	/* DAG (was missing) */
  				}
  				break;
  			} 
***************
*** 354,360
  		iof = iop->iofile;
  		ion = iop->ioname;
  
! 		if (*ion)
  		{
  			prn_buff(iof & IOUFD);
  

--- 356,362 -----
  		iof = iop->iofile;
  		ion = iop->ioname;
  
! 		if (ion && *ion)	/* DAG -- added safety check */
  		{
  			prn_buff(iof & IOUFD);
  
***************
*** 368,373
  					prs_buff("<&");
  
  			}
  			else if ((iof & IOPUT) == 0)
  				prc_buff('<');
  			else if (iof & IOAPP)

--- 370,377 -----
  					prs_buff("<&");
  
  			}
+ 			else if (iof & IORDW)
+ 				prs_buff(rdwstr);	/* ADR */
  			else if ((iof & IOPUT) == 0)
  				prc_buff('<');
  			else if (iof & IOAPP)
:::::::: hash.c :::::::
*** ../orig.u/hash.c	Wed May 15 17:08:16 1985
--- hash.c	Tue May 21 18:08:16 1985
***************
*** 86,91
  	int 			res;		
  
  	i = hash(str);
  
  	if(table[i] == 0)
  	{			

--- 86,94 -----
  	int 			res;		
  
  	i = hash(str);
+ #if gould
+ 	i &= ~(0x80000000 >> (shift - 1));	/* work around compiler bug */
+ #endif
  
  	if(table[i] == 0)
  	{			
:::::::: hash.h :::::::
No differences encountered
:::::::: hashserv.c :::::::
No differences encountered
:::::::: io.c :::::::
*** ../orig.u/io.c	Wed May 15 17:08:19 1985
--- io.c	Thu May 16 18:03:36 1985
***************
*** 7,12
   */
  
  #include	"defs.h"
  #include	"dup.h"
  #include	<fcntl.h>
  

--- 7,13 -----
   */
  
  #include	"defs.h"
+ #ifdef RES	/* DAG -- conditionalize */
  #include	"dup.h"
  #include	<sys/types.h>
  #include	<sys/stat.h>
***************
*** 8,13
  
  #include	"defs.h"
  #include	"dup.h"
  #include	<fcntl.h>
  
  short topfd;

--- 9,17 -----
  #include	"defs.h"
  #ifdef RES	/* DAG -- conditionalize */
  #include	"dup.h"
+ #include	<sys/types.h>
+ #include	<sys/stat.h>
+ #else
  #include	<fcntl.h>
  #endif
  
***************
*** 9,14
  #include	"defs.h"
  #include	"dup.h"
  #include	<fcntl.h>
  
  short topfd;
  

--- 13,19 -----
  #include	<sys/stat.h>
  #else
  #include	<fcntl.h>
+ #endif
  
  short topfd;
  
***************
*** 293,298
  {
  	register int	f;
  
  	f = fcntl(fd, F_DUPFD, 10);
  	return(f);
  }

--- 298,316 -----
  {
  	register int	f;
  
+ #ifdef RES	/* DAG -- bug fix */
+ 	for ( f = 10; f <= INIO; ++f )
+ 	{
+ 		struct stat	statb;
+ 
+ 		if (fstat(fd, &statb) != 0)	/* if already in use, try another */
+ 		{
+ 			dup (fd | DUPFLG, f);
+ 			return f;
+ 		}
+ 	}
+ 	return -1;	/* no free file descriptors */
+ #else
  	f = fcntl(fd, F_DUPFD, 10);
  #endif
  	return(f);
***************
*** 294,299
  	register int	f;
  
  	f = fcntl(fd, F_DUPFD, 10);
  	return(f);
  }
  

--- 312,318 -----
  	return -1;	/* no free file descriptors */
  #else
  	f = fcntl(fd, F_DUPFD, 10);
+ #endif
  	return(f);
  }
  
:::::::: mac.h :::::::
*** ../orig.u/mac.h	Wed May 15 17:08:19 1985
--- mac.h	Thu May 16 18:04:59 1985
***************
*** 19,24
  #define RQ	'\''
  #define MINUS	'-'
  #define COLON	':'
  #define TAB	'\t'
  
  

--- 19,25 -----
  #define RQ	'\''
  #define MINUS	'-'
  #define COLON	':'
+ #define SQUIGGLE	'~'	/* TILDE defined in BSD tty handler */
  #define TAB	'\t'
  
  
:::::::: macro.c :::::::
*** ../orig.u/macro.c	Wed May 15 17:08:20 1985
--- macro.c	Thu May 16 18:13:16 1985
***************
*** 67,73
  	d = readc();
  	if (!subchar(d))
  		return(d);
! 	if (d == DOLLAR)
  	{
  		register int	c;
  

--- 67,74 -----
  	d = readc();
  	if (!subchar(d))
  		return(d);
! #if JOBS
! 	if (d == PERCENT && (flags&jobflg))
  	{
  		register int	c;
  
***************
*** 71,76
  	{
  		register int	c;
  
  		if ((c = readc(), dolchar(c)))
  		{
  			struct namnod *n = (struct namnod *)NIL;

--- 72,95 -----
  	{
  		register int	c;
  
+ 		peekc = (c = readc()) | MARK;
+ 		if (digchar(c) || c == PERCENT)
+ 		{
+ 			register char *v;
+ 
+ 			if (v = j_macro())	/* %number or %% handled */
+ 				while (c = *v++)
+ 					pushstak(c | quote);
+ 			/* else expands to nothingness */
+ 			goto retry;
+ 		}
+ 	}
+ 	else
+ #endif
+ 	    if (d == DOLLAR)
+ 	    {
+ 		register int	c;
+ 
  		if ((c = readc(), dolchar(c)))
  		{
  			struct namnod *n = (struct namnod *)NIL;
***************
*** 114,119
  			}
  			else if (c == '$')
  				v = pidadr;
  			else if (c == '!')
  				v = pcsadr;
  			else if (c == '#')

--- 133,147 -----
  			}
  			else if (c == '$')
  				v = pidadr;
+ 			else if (c == '+')
+ 			{
+ 				if (ppid != getppid())	/* parent died */
+ 				{
+ 					ppid = getppid();
+ 					assnum (&ppidadr, ppid);
+ 				}
+ 				v = ppidadr;
+ 			}
  			else if (c == '!')
  				v = pcsadr;
  			else if (c == '#')
***************
*** 207,213
  		}
  		else
  			peekc = c | MARK;
! 	}
  	else if (d == endch)
  		return(d);
  	else if (d == SQUOTE)

--- 235,241 -----
  		}
  		else
  			peekc = c | MARK;
! 	    }
  	else if (d == endch)
  		return(d);
  	else if (d == SQUOTE)
***************
*** 273,278
  		push(&cb);
  		estabf(argc);
  	}
  	{
  		register struct trenod *t = makefork(FPOU, cmd(EOFSYM, MTFLG | NLFLG));
  		int		pv[2];

--- 301,309 -----
  		push(&cb);
  		estabf(argc);
  	}
+ #if JOBS
+ 	set_wfence();
+ #endif
  	{
  		register struct trenod *t = makefork(FPOU, cmd(EOFSYM, MTFLG | NLFLG));
  		int		pv[2];
:::::::: main.c :::::::
*** ../orig.u/main.c	Wed May 15 17:08:21 1985
--- main.c	Thu Jun  6 09:41:44 1985
***************
*** 11,16
  #include	"timeout.h"
  #include	<sys/types.h>
  #include	<sys/stat.h>
  #include        "dup.h"
  
  #ifdef RES

--- 11,17 -----
  #include	"timeout.h"
  #include	<sys/types.h>
  #include	<sys/stat.h>
+ #ifdef RES	/* DAG -- conditionalize */
  #include        "dup.h"
  #endif
  
***************
*** 12,17
  #include	<sys/types.h>
  #include	<sys/stat.h>
  #include        "dup.h"
  
  #ifdef RES
  #include	<sgtty.h>

--- 13,19 -----
  #include	<sys/stat.h>
  #ifdef RES	/* DAG -- conditionalize */
  #include        "dup.h"
+ #endif
  
  #ifdef RES
  #include	<sgtty.h>
***************
*** 15,20
  
  #ifdef RES
  #include	<sgtty.h>
  #endif
  
  static BOOL	beenhere = FALSE;

--- 17,24 -----
  
  #ifdef RES
  #include	<sgtty.h>
+ #else
+ #include	<fcntl.h>	/* DAG -- for defines */
  #endif
  
  BOOL		catcheof = FALSE;	/* not yet */
***************
*** 17,22
  #include	<sgtty.h>
  #endif
  
  static BOOL	beenhere = FALSE;
  char		tmpout[20] = "/tmp/sh-";
  struct fileblk	stdfile;

--- 21,27 -----
  #include	<fcntl.h>	/* DAG -- for defines */
  #endif
  
+ BOOL		catcheof = FALSE;	/* not yet */
  static BOOL	beenhere = FALSE;
  char		tmpout[20] = "/tmp/sh-";
  struct fileblk	stdfile;
***************
*** 43,48
  	register int	rflag = ttyflg;
  	int		rsflag = 1;	/* local restricted flag */
  	struct namnod	*n;
  
  	stdsigs();
  

--- 48,56 -----
  	register int	rflag = ttyflg;
  	int		rsflag = 1;	/* local restricted flag */
  	struct namnod	*n;
+ #if JOBS
+ 	char *sim;	/* BRL security, for better checking of restricted */
+ #endif
  
  	stdsigs();
  
***************
*** 77,82
  
  #ifndef RES
  
  	if (c > 0 && any('r', simple(*v)))
  		rflag = 0;
  

--- 85,94 -----
  
  #ifndef RES
  
+ #ifdef JOBS
+ 	/* smarter check for restricted shell, courtesy of BRL */
+ 	if (c > 0 && (eq(sim = simple(*v), "rsh") || eq(sim,"-rsh")))
+ #else
  	if (c > 0 && any('r', simple(*v)))
  #endif
  		rflag = 0;
***************
*** 78,83
  #ifndef RES
  
  	if (c > 0 && any('r', simple(*v)))
  		rflag = 0;
  
  #endif

--- 90,96 -----
  	if (c > 0 && (eq(sim = simple(*v), "rsh") || eq(sim,"-rsh")))
  #else
  	if (c > 0 && any('r', simple(*v)))
+ #endif
  		rflag = 0;
  
  #endif
***************
*** 108,113
  	dolv = v + c - dolc;
  	dolc--;
  
  	/*
  	 * return here for shell file execution
  	 * but not for parenthesis subshells

--- 121,147 -----
  	dolv = v + c - dolc;
  	dolc--;
  
+ #if JOBS
+ 	j_default_pg = getpid();
+ 	j_original_pg = getpgrp();
+ 
+ 	/* enable job control if argv[0] has a 'j' in its simple name */
+ 	if ((flags & jobflg) == 0 && c > 0 && any('j', simple(*v))
+ 		&& comdiv == 0 /* set by options */ && (flags & stdflg))
+ 	{
+ 		j_init();
+ 		flags |= jobflg;
+ 		{			/* append 'J' to $- string */
+ 		register char *flagc = flagadr;
+ 
+ 		while (*flagc)
+ 			flagc++;
+ 		*flagc++ = 'J';
+ 		*flagc = 0;
+ 		}
+ 	}
+ #endif
+ 
  	/*
  	 * return here for shell file execution
  	 * but not for parenthesis subshells
***************
*** 125,130
  	assnum(&pidadr, getpid());
  
  	/*
  	 * set up temp file names
  	 */
  	settmp();

--- 159,170 -----
  	assnum(&pidadr, getpid());
  
  	/*
+ 	 * set ppidname '$+'
+ 	 */
+ 	ppid = getppid();
+ 	assnum (& ppidadr, ppid);
+ 
+ 	/*
  	 * set up temp file names
  	 */
  	settmp();
***************
*** 137,143
  	dfault(&mchknod, MAILCHECK);
  	mailchk = stoi(mchknod.namval);
  
! 	if ((beenhere++) == FALSE)	/* ? profile */
  	{
  		if (*(simple(cmdadr)) == '-')
  		{			/* system profile */

--- 177,188 -----
  	dfault(&mchknod, MAILCHECK);
  	mailchk = stoi(mchknod.namval);
  
! #if pyr
! 	/*
! 	 * find out current universe, initialize $UNIVERSE
! 	 */
! 	cur_univ = setuniverse (U_UCB);	/* retrieve old and set to UCB */
! 	if (cur_univ == -1)
  	{
  		/* unknown current, default to UCB */
  		cur_univ = U_UCB;
***************
*** 139,144
  
  	if ((beenhere++) == FALSE)	/* ? profile */
  	{
  		if (*(simple(cmdadr)) == '-')
  		{			/* system profile */
  

--- 184,214 -----
  	cur_univ = setuniverse (U_UCB);	/* retrieve old and set to UCB */
  	if (cur_univ == -1)
  	{
+ 		/* unknown current, default to UCB */
+ 		cur_univ = U_UCB;
+ 		setuniverse (cur_univ);
+ 	}
+ 	else if (cur_univ != U_UCB)
+ 		setuniverse (cur_univ);	/* reset to what it was */
+ 	
+ 	/*
+ 	 * force value, ignore whatever was in environment
+ 	 */
+ 	assign (& univnod, univ_name[cur_univ - 1]);
+ 	attrib ((&univnod), N_RDONLY);	/* user can not set $UNIVERSE */
+ #endif
+ 
+ 	/*
+ 	 * assign default value of $HOME/.history to $HISTFILE
+ 	 */
+ 	(void) catpath ("~", savehist);
+ 	dfault (& histfnod, curstak());
+ 
+ 	if (beenhere == FALSE)		/* ? profile */
+ 	{
+ 		static struct statb;
+ 
+ 		++beenhere;		/* DAG */
  		if (*(simple(cmdadr)) == '-')
  		{			/* system profile */
  			struct stat statb;
***************
*** 141,147
  	{
  		if (*(simple(cmdadr)) == '-')
  		{			/* system profile */
! 
  #ifndef RES
  
  			if ((input = pathopen(nullstr, sysprofile)) >= 0)

--- 211,217 -----
  		++beenhere;		/* DAG */
  		if (*(simple(cmdadr)) == '-')
  		{			/* system profile */
! 			struct stat statb;
  #ifndef RES
  
  			if ((input = pathopen(nullstr, sysprofile)) >= 0)
***************
*** 149,155
  
  #endif
  
! 			if ((input = pathopen(nullstr, profile)) >= 0)
  			{
  				exfile(rflag);
  				flags &= ~ttyflg;

--- 219,230 -----
  
  #endif
  
! 			if ((input = pathopen(nullstr, profile)) >= 0
! 				&& geteuid() == 0
! 				&& (fstat(input, &statb) != 0
! 					|| statb.st_uid != 0))
! 				close (input);	/* protect superuser, c/o BRL */
! 			else
  			{
  				exfile(rflag);
  				flags &= ~ttyflg;
***************
*** 157,162
  		}
  		if (rsflag == 0 || rflag == 0)
  			flags |= rshflg;
  		/*
  		 * open input file if specified
  		 */

--- 232,251 -----
  		}
  		if (rsflag == 0 || rflag == 0)
  			flags |= rshflg;
+ 		
+ 		/* if all ok, process $HOME/.shrc */
+ 		if (geteuid() == getuid() && getegid() == getgid()
+ 			&& (flags & (rshflg|quickflg)) == 0
+ 			&& (input = pathopen("~", shrc)) >= 0)
+ 		{
+ 			int promptflags = flags & (ttyflg|intflg|prompt);
+ 
+ 			/* turn off anything that will cause prompting */
+ 			flags &= ~promptflags;
+ 			exfile (rflag);
+ 			flags |= promptflags;
+ 		}
+ 
  		/*
  		 * open input file if specified
  		 */
***************
*** 221,226
  			setmail(mailpnod.namval);
  		else
  			setmail(mailnod.namval);
  	}
  	else
  	{

--- 310,318 -----
  			setmail(mailpnod.namval);
  		else
  			setmail(mailnod.namval);
+ 
+ 		/* restore previous history */
+ 		histrest (histfnod.namval);
  	}
  	else
  	{
***************
*** 256,262
  		if ((flags & prompt) && standin->fstak == 0 && !eof)
  		{
  
! 			if (mailp)
  			{
  				time(&curtime);
  

--- 348,354 -----
  		if ((flags & prompt) && standin->fstak == 0 && !eof)
  		{
  
! 			if (mailp && *mailp)	/* BRL to check for *mailp */
  			{
  				time(&curtime);
  
***************
*** 267,273
  				}
  			}
  
! 			prs(ps1nod.namval);
  
  #ifdef TIME_OUT
  			alarm(TIMEOUT);

--- 359,368 -----
  				}
  			}
  
! 			/* do special handling for $PS1 */
! 			pr_prompt(ps1nod.namval);
! 			if (userid == 0 && ! eq(ps1nod.namval, supprompt))
! 				prs(supprompt);	/* append "# " */
  
  #ifdef TIME_OUT
  			alarm(TIMEOUT);
***************
*** 276,281
  			flags |= waiting;
  		}
  
  		trapnote = 0;
  		peekc = readc();
  		if (eof)

--- 371,377 -----
  			flags |= waiting;
  		}
  
+ 		catcheof = TRUE;
  		trapnote = 0;
  		peekc = readc();
  		catcheof = FALSE;
***************
*** 278,283
  
  		trapnote = 0;
  		peekc = readc();
  		if (eof)
  			return;
  

--- 374,380 -----
  		catcheof = TRUE;
  		trapnote = 0;
  		peekc = readc();
+ 		catcheof = FALSE;
  		if (eof)
  			return;
  
:::::::: mode.h :::::::
No differences encountered
:::::::: msg.c :::::::
*** ../orig.u/msg.c	Wed May 15 17:08:23 1985
--- msg.c	Wed Jun  5 15:20:45 1985
***************
*** 48,53
  char	nohome[]	= "no home directory";
  char 	badperm[]	= "execute permission denied";
  char	longpwd[]	= "sh error: pwd too long";
  /*
   * messages for 'builtin' functions
   */

--- 48,66 -----
  char	nohome[]	= "no home directory";
  char 	badperm[]	= "execute permission denied";
  char	longpwd[]	= "sh error: pwd too long";
+ #if JOBS
+ char	cjpostr[]	= ": couldn't jpost\n";
+ char	jcoffstr[]	= "job control not enabled\n";
+ char	jpanstr[]	= "sh bug: j_print_ent--no number ";
+ char	jinvstr[]	= "invalid job number\n";
+ char	ncjstr[]	= "no current job\n";
+ char	nstpstr[]	= ": not stopped\n";
+ char	tasjstr[]	= "There are stopped jobs.\n";
+ #endif
+ #if SYMLINK
+ char	nolstat[]	= ": can't lstat component";
+ #endif
+ 
  /*
   * messages for 'builtin' functions
   */
***************
*** 66,71
  char	mchkname[]	= "MAILCHECK";
  char	acctname[]  	= "SHACCT";
  char	mailpname[]	= "MAILPATH";
  
  /*
   * string constants

--- 79,88 -----
  char	mchkname[]	= "MAILCHECK";
  char	acctname[]  	= "SHACCT";
  char	mailpname[]	= "MAILPATH";
+ #if pyr
+ char	univname[]	= "UNIVERSE";
+ #endif
+ char	histfilename[]	= "HISTFILE";
  
  /*
   * string constants
***************
*** 85,90
  char	supprompt[]	= "# ";
  char	profile[]	= ".profile";
  char	sysprofile[]	= "/etc/profile";
  
  /*
   * tables

--- 102,151 -----
  char	supprompt[]	= "# ";
  char	profile[]	= ".profile";
  char	sysprofile[]	= "/etc/profile";
+ char	shrc[]		= ".shrc";
+ char	savehist[]	= ".history";
+ char	dashi[]		= "-i";		/* for history.c */
+ char	dashr[]		= "-r";
+ char	dashs[]		= "-s";
+ char	rdwstr[]	= "<> ";
+ #if JOBS
+ char	rsqbrk[]	= "] ";
+ char	spspstr[]	= " \ ";
+ char	fgdstr[]	= "foreground \ \ \ \ \ \ ";
+ char	stpdstr[]	= "stopped";
+ char	lotspstr[]	= " \ \ \ \ \ \ \ \ \ ";
+ char	psgpstr[]	= " (signal) ";
+ char	ptinstr[]	= " (tty in) ";
+ char	ptoustr[]	= " (tty out)";
+ char	bgdstr[]	= "background \ \ \ \ \ \ ";
+ char	spcstr[]	= " ";
+ char	rdinstr[]	= "< ";
+ char	appdstr[]	= ">> ";
+ char	inlnstr[]	= "<< ";
+ char	sfnstr[]	= "(){ ";
+ char	efnstr[]	= " }";
+ char	semspstr[]	= "; ";
+ char	lpnstr[]	= "(";
+ char	rpnstr[]	= ")";
+ char	insstr[]	= " in ";
+ char	sdostr[]	= "; do ";
+ char	sdonstr[]	= "; done";
+ char	sthnstr[]	= "; then ";
+ char	selsstr[]	= "; else ";
+ char	sfistr[]	= "; fi";
+ char	iesacstr[]	= " in ... esac";
+ char	casestr[]	= "case ";
+ char	pipestr[]	= " | ";
+ char	toastr[]	= ">&";
+ char	fromastr[]	= "<&";
+ char	andstr[]	= " && ";
+ char	orstr[]		= " || ";
+ char	forstr[]	= "for ";
+ char	amperstr[]	= " &";	
+ char	whilestr[]	= "while ";
+ char	untilstr[]	= "until ";
+ char	ifstr[]		= "if ";
+ #endif
  
  /*
   * tables
***************
*** 130,135
  	"Alarm call",
  	"Terminated",
  	"Signal 16",
  	"Signal 17",
  	"Child death",
  	"Power Fail"

--- 191,218 -----
  	"Alarm call",
  	"Terminated",
  	"Signal 16",
+ #if JOBS
+ 	"Stop",
+ 	"Stop from keyboard",
+ 	"Continue",
+ 	"Child status change",
+ 	"Background read",
+ 	"Background write",
+ 	"I/O possible",
+ 	"CPU time lmit",
+ 	"File size limit",
+ 	"Virtual time alarm",
+ 	"Profiling timer alarm",
+ #if gould
+ 	"Stack overflow",
+ #else
+ 	"Signal 28",
+ #endif
+ 	"Signal 29",
+ 	"Signal 30",
+ 	"Signal 31",
+ 	"Signal 32",
+ #else
  	"Signal 17",
  	"Child death",
  	"Power Fail"
***************
*** 133,138
  	"Signal 17",
  	"Child death",
  	"Power Fail"
  };
  
  char	export[] = "export";

--- 216,222 -----
  	"Signal 17",
  	"Child death",
  	"Power Fail"
+ #endif
  };
  
  char	export[] = "export";
***************
*** 149,154
  	{ "[",		SYSTST },
  #endif
  
  	{ "break",	SYSBREAK },
  	{ "cd",		SYSCD	},
  	{ "continue",	SYSCONT	},

--- 233,246 -----
  	{ "[",		SYSTST },
  #endif
  
+ #if pyr
+ 	{ "att",	SYSATT },
+ #endif
+ 
+ #if JOBS
+ 	{ "bg",		SYSBG },
+ #endif
+ 
  	{ "break",	SYSBREAK },
  	{ "cd",		SYSCD	},
  	{ "continue",	SYSCONT	},
***************
*** 157,162
  	{ "exec",	SYSEXEC	},
  	{ "exit",	SYSEXIT	},
  	{ "export",	SYSXPORT },
  	{ "hash",	SYSHASH	},
  
  #ifdef RES

--- 249,259 -----
  	{ "exec",	SYSEXEC	},
  	{ "exit",	SYSEXIT	},
  	{ "export",	SYSXPORT },
+ 
+ #if JOBS
+ 	{ "fg",		SYSFG },
+ #endif
+ 
  	{ "hash",	SYSHASH	},
  	{ "history",	SYSHISTORY },
  
***************
*** 158,163
  	{ "exit",	SYSEXIT	},
  	{ "export",	SYSXPORT },
  	{ "hash",	SYSHASH	},
  
  #ifdef RES
  	{ "login",	SYSLOGIN },

--- 255,261 -----
  #endif
  
  	{ "hash",	SYSHASH	},
+ 	{ "history",	SYSHISTORY },
  
  #if JOBS
  	{ "jobs",	SYSJOBS },
***************
*** 159,164
  	{ "export",	SYSXPORT },
  	{ "hash",	SYSHASH	},
  
  #ifdef RES
  	{ "login",	SYSLOGIN },
  	{ "newgrp",	SYSLOGIN },

--- 257,266 -----
  	{ "hash",	SYSHASH	},
  	{ "history",	SYSHISTORY },
  
+ #if JOBS
+ 	{ "jobs",	SYSJOBS },
+ #endif
+ 
  #ifdef RES
  	{ "login",	SYSLOGIN },
  	{ "newgrp",	SYSLOGIN },
***************
*** 172,177
  	{ "return",	SYSRETURN },
  	{ "set",	SYSSET	},
  	{ "shift",	SYSSHFT	},
  	{ "test",	SYSTST },
  	{ "times",	SYSTIMES },
  	{ "trap",	SYSTRAP	},

--- 274,282 -----
  	{ "return",	SYSRETURN },
  	{ "set",	SYSSET	},
  	{ "shift",	SYSSHFT	},
+ #if JOBS
+ 	{ "suspend",	SYSSUSPEND },
+ #endif
  	{ "test",	SYSTST },
  	{ "times",	SYSTIMES },
  	{ "trap",	SYSTRAP	},
***************
*** 177,182
  	{ "trap",	SYSTRAP	},
  	{ "type",	SYSTYPE },
  
  
  #ifndef RES		
  	{ "ulimit",	SYSULIMIT },

--- 282,290 -----
  	{ "trap",	SYSTRAP	},
  	{ "type",	SYSTYPE },
  
+ #if pyr
+ 	{ "ucb",	SYSUCB },
+ #endif
  
  #ifndef RES		
  	{ "ulimit",	SYSULIMIT },
***************
*** 183,188
  	{ "umask",	SYSUMASK },
  #endif
  
  	{ "unset", 	SYSUNS },
  	{ "wait",	SYSWAIT	}
  };

--- 291,300 -----
  	{ "umask",	SYSUMASK },
  #endif
  
+ #if pyr
+ 	{ "universe",	SYSUNIVERSE },
+ #endif
+ 
  	{ "unset", 	SYSUNS },
  	{ "wait",	SYSWAIT	}
  };
***************
*** 187,194
  	{ "wait",	SYSWAIT	}
  };
  
! #ifdef RES
! 	int no_commands = 26;
! #else
! 	int no_commands = 27;
  #endif

--- 299,308 -----
  	{ "wait",	SYSWAIT	}
  };
  
! int no_commands = sizeof commands / sizeof(struct sysnod);	/* DAG -- improved */
! 
! #if pyr
! #include <sys/types.h>		/* to get <sys/inode.h> to work (sigh) */
! #include <sys/inode.h>		/* NUMUNIV defined to be NUMCLNK */
! #include <universe.h>	/* gets char *univ_name[] && cha *univ_longname[] */
  #endif



More information about the Mod.sources mailing list