1 diff -u -x CVS -x work -x core -x *.core -x #* -x *~ -x *.orig -x *.rej -I $Id.*$ -I $.+BSD.*$ main.c.orig main.c
2 --- main.c.orig	Fri Jun  4 02:51:01 2004
3 +++ main.c	Sat Jun 19 18:42:23 2004
4 @@ -8,30 +8,43 @@
5   */
6 
7  #include	"defs.h"
8 -#include	"dup.h"
9  #include	"sym.h"
10  #include	"timeout.h"
11 -#include	<sys/types.h>
12 -#include	<sys/stat.h>
13 -#include	<sgtty.h>
14 -
15 -UFD		output = 2;
16 -LOCAL BOOL	beenhere = FALSE;
17 -CHAR		tmpout[20] = "/tmp/sh-";
18 -FILEBLK		stdfile;
19 -FILE		standin = &stdfile;
20 +#include	"pathnames.h"
21 +#ifdef stupid
22  #include	<execargs.h>
23 +#endif
24 
25 -PROC VOID	exfile();
26 +LOCAL VOID	exfile(BOOL);
27 +LOCAL VOID	Ldup(INT, INT);
28 
29 +LOCAL BOOL	beenhere = FALSE;
30 +LOCAL FILEBLK	stdfile;
31 
32 +UFD		output = 2;
33 +CHAR		tmpout[20] = _PATH_TMPOUT;
34 +STRING		tmpnam;
35 +FILEPTR		standin = &stdfile;
36 +INT		dolc;
37 +STRING		*dolv;
38 +STRING		dolladr;
39 +STRING		cmdadr;
40 +STRING		pidadr;
41 +STRING		comdiv;
42 +INT		flags;
43 +INT		serial;
44 +jmp_buf		subshell;
45 +jmp_buf		errshell;
46 
47 
48 -main(c, v)
49 +INT	main(c, v)
50  	INT		c;
51  	STRING		v[];
52  {
53  	REG INT		rflag=ttyflg;
54 +#if defined(SYSIII)
55 +	INT		rsflag=1;	/* local restricted flag */
56 +#endif
57 
58  	/* initialise storage allocation */
59  	stdsigs();
60 @@ -39,42 +52,72 @@
61  	addblok((POS)0);
62 
63  	/* set names from userenv */
64 +#if !defined(SYSIII)
65  	getenv();
66 +#else /* SYSIII */
67 +	/* 'rsflag' is non-zero if SHELL variable is
68 +	   set in environment and contains an 'r' in
69 +	   the simple file part of the value.	*/
70 +	rsflag=getenv();
71 
72  	/* look for restricted */
73 -/*	IF c>0 ANDF any('r', *v) THEN rflag=0 FI */
74 -
75 +	/* a shell is also restricted if argv(0) has
76 +	   an 'r' in its simple name	*/
77 +	IF c>0 ANDF any('r', simple(*v)) THEN rflag=0 FI
78 +#endif
79  	/* look for options */
80 +	/* dolc is $# */
81  	dolc=options(c,v);
82  	IF dolc<2 THEN flags |= stdflg FI
83 +#if defined(SYSIII)
84 +	IF dolc < 2
85 +	THEN	REG STRING flagc = flagadr;
86 +		WHILE *flagc DO flagc++ OD
87 +		*flagc = STDFLG;
88 +	FI
89 +#endif
90  	IF (flags&stdflg)==0
91  	THEN	dolc--;
92  	FI
93  	dolv=v+c-dolc; dolc--;
94 
95  	/* return here for shell file execution */
96 +	/* but not for parenthesis subshells	*/
97  	setjmp(subshell);
98 
99 -	/* number of positional parameters */
100 +	/* number of positional parameters '$#' */
101  	assnum(&dolladr,dolc);
102 +	/* comadr is $0 */
103  	cmdadr=dolv[0];
104 
105 -	/* set pidname */
106 +	/* set pidname '$$' */
107  	assnum(&pidadr, getpid());
108 
109  	/* set up temp file names */
110  	settmp();
111 
112 -	/* default ifs */
113 +	/* default internal field separators - $IFS */
114  	dfault(&ifsnod, sptbnl);
115 
116  	IF (beenhere++)==FALSE
117  	THEN	/* ? profile */
118 +#if defined(SYSIII)
119 +		IF *simple(cmdadr) == '-'
120 +		THEN	IF (input=pathopen(nullstr, sysprofile))>=0
121 +			THEN	exfile(rflag);	/* file exists */
122 +			FI
123 +			IF (input=pathopen(homenod.namenv, profile))>=0
124 +			THEN	exfile(rflag); flags &= ~ttyflg;
125 +			FI
126 +		FI
127 +		IF rsflag==0 ORF rflag==0 THEN flags |= rshflg FI
128 +#else /* V7 */
129  		IF *cmdadr=='-'
130  		    ANDF (input=pathopen(nullstr, profile))>=0
131  		THEN	exfile(rflag); flags &= ~ttyflg;
132  		FI
133  		IF rflag==0 THEN flags |= rshflg FI
134 +#endif
135 
136  		/* open input file if specified */
137  		IF comdiv
138 @@ -82,18 +125,22 @@
139  		ELSE	input=((flags&stdflg) ? 0 : chkopen(cmdadr));
140  			comdiv--;
141  		FI
142 -	ELSE	*execargs=dolv;	/* for `ps' cmd */
143 +#ifdef stupid
144 +	ELSE	*execargs=(STRING) dolv;	/* for `ps' cmd */
145 +#endif
146  	FI
147 
148  	exfile(0);
149  	done();
150 +	/*NOTREACHED*/
151 +	return(exitval);			/* GCC */
152  }
153 
154  LOCAL VOID	exfile(prof)
155 -BOOL		prof;
156 +	BOOL		prof;
157  {
158 -	REG L_INT	mailtime = 0;
159 -	REG INT		userid;
160 +	REG TIME	mailtime = 0;
161 +	REG UID		userid;
162  	struct stat	statb;
163 
164  	/* move input */
165 @@ -108,10 +155,14 @@
166  		output=OTIO;
167  	FI
168 
169 +#if defined(SYSIII)
170 +	userid=geteuid();
171 +#else /* V7 */
172  	userid=getuid();
173 +#endif
174 
175  	/* decide whether interactive */
176 -	IF (flags&intflg) ORF ((flags&oneflg)==0 ANDF gtty(output,&statb)==0 ANDF gtty(input,&statb)==0)
177 +	IF (flags&intflg) ORF ((flags&oneflg)==0 ANDF isatty(output) ANDF isatty(input))
178  	THEN	dfault(&ps1nod, (userid?stdprompt:supprompt));
179  		dfault(&ps2nod, readmsg);
180  		flags |= ttyflg|prompt; ignsig(KILL);
181 @@ -132,43 +183,63 @@
182  		exitset();
183  		IF (flags&prompt) ANDF standin->fstak==0 ANDF !eof
184  		THEN	IF mailnod.namval
185 +#if defined(SYSIII)
186 +			THEN	IF stat(mailnod.namval,&statb)>=0
187 +				THEN	IF statb.st_size
188 +					   ANDF mailtime
189 +					   ANDF (statb.st_mtime != mailtime)
190 +					THEN	prs(mailmsg)
191 +					FI
192 +					mailtime=statb.st_mtime;
193 +				ELIF mailtime==0
194 +				THEN	mailtime=1
195 +				FI
196 +			FI
197 +#else /* V7 */
198  			    ANDF stat(mailnod.namval,&statb)>=0 ANDF statb.st_size
199  			    ANDF (statb.st_mtime != mailtime)
200  			    ANDF mailtime
201  			THEN	prs(mailmsg)
202  			FI
203  			mailtime=statb.st_mtime;
204 +#endif
205 +#if TIMEOUT > 0
206  			prs(ps1nod.namval); alarm(TIMEOUT); flags |= waiting;
207 +#else /* !TIMEOUT */
208 +			prs(ps1nod.namval);
209 +#endif
210  		FI
211 
212  		trapnote=0; peekc=readc();
213  		IF eof
214  		THEN	return;
215  		FI
216 +#if TIMEOUT > 0
217  		alarm(0); flags &= ~waiting;
218 -		execute(cmd(NL,MTFLG),0);
219 +#endif
220 +		execute(cmd(NL,MTFLG),0,0,0);
221  		eof |= (flags&oneflg);
222  	POOL
223  }
224 
225 -chkpr(eor)
226 -char eor;
227 +VOID	chkpr(eor)
228 +	INT	eor;
229  {
230  	IF (flags&prompt) ANDF standin->fstak==0 ANDF eor==NL
231  	THEN	prs(ps2nod.namval);
232  	FI
233  }
234 
235 -settmp()
236 +VOID	settmp()
237  {
238  	itos(getpid()); serial=0;
239  	tmpnam=movstr(numbuf,&tmpout[TMPNAM]);
240  }
241 
242 -Ldup(fa, fb)
243 +LOCAL VOID	Ldup(fa, fb)
244  	REG INT		fa, fb;
245  {
246 -	dup(fa|DUPFLG, fb);
247 +	dup2(fa, fb);
248  	close(fa);
249 -	ioctl(fb, FIOCLEX, 0);
250 +	fcntl(fb, F_SETFD, FD_CLOEXEC);
251  }
252