xref: /csrg-svn/old/sh/main.c (revision 6696)
1*6696Smckusick /*	main.c	4.1	82/05/07	*/
2*6696Smckusick 
3*6696Smckusick #
4*6696Smckusick /*
5*6696Smckusick  * UNIX shell
6*6696Smckusick  *
7*6696Smckusick  * S. R. Bourne
8*6696Smckusick  * Bell Telephone Laboratories
9*6696Smckusick  *
10*6696Smckusick  */
11*6696Smckusick 
12*6696Smckusick #include	"defs.h"
13*6696Smckusick #include	"dup.h"
14*6696Smckusick #include	"sym.h"
15*6696Smckusick #include	"timeout.h"
16*6696Smckusick #include	<sys/types.h>
17*6696Smckusick #include	<sys/stat.h>
18*6696Smckusick #include	<sgtty.h>
19*6696Smckusick 
20*6696Smckusick UFD		output = 2;
21*6696Smckusick LOCAL BOOL	beenhere = FALSE;
22*6696Smckusick CHAR		tmpout[20] = "/tmp/sh-";
23*6696Smckusick FILEBLK		stdfile;
24*6696Smckusick FILE		standin = &stdfile;
25*6696Smckusick #ifdef stupid
26*6696Smckusick #include	<execargs.h>
27*6696Smckusick #endif
28*6696Smckusick 
29*6696Smckusick PROC VOID	exfile();
30*6696Smckusick 
31*6696Smckusick 
32*6696Smckusick 
33*6696Smckusick 
34*6696Smckusick main(c, v)
35*6696Smckusick 	INT		c;
36*6696Smckusick 	STRING		v[];
37*6696Smckusick {
38*6696Smckusick 	REG INT		rflag=ttyflg;
39*6696Smckusick 
40*6696Smckusick 	/* initialise storage allocation */
41*6696Smckusick 	stdsigs();
42*6696Smckusick 	setbrk(BRKINCR);
43*6696Smckusick 	addblok((POS)0);
44*6696Smckusick 
45*6696Smckusick 	/* set names from userenv */
46*6696Smckusick 	getenv();
47*6696Smckusick 
48*6696Smckusick 	/* look for restricted */
49*6696Smckusick /*	IF c>0 ANDF any('r', *v) THEN rflag=0 FI */
50*6696Smckusick 
51*6696Smckusick 	/* look for options */
52*6696Smckusick 	dolc=options(c,v);
53*6696Smckusick 	IF dolc<2 THEN flags |= stdflg FI
54*6696Smckusick 	IF (flags&stdflg)==0
55*6696Smckusick 	THEN	dolc--;
56*6696Smckusick 	FI
57*6696Smckusick 	dolv=v+c-dolc; dolc--;
58*6696Smckusick 
59*6696Smckusick 	/* return here for shell file execution */
60*6696Smckusick 	setjmp(subshell);
61*6696Smckusick 
62*6696Smckusick 	/* number of positional parameters */
63*6696Smckusick 	assnum(&dolladr,dolc);
64*6696Smckusick 	cmdadr=dolv[0];
65*6696Smckusick 
66*6696Smckusick 	/* set pidname */
67*6696Smckusick 	assnum(&pidadr, getpid());
68*6696Smckusick 
69*6696Smckusick 	/* set up temp file names */
70*6696Smckusick 	settmp();
71*6696Smckusick 
72*6696Smckusick 	/* default ifs */
73*6696Smckusick 	dfault(&ifsnod, sptbnl);
74*6696Smckusick 
75*6696Smckusick 	IF (beenhere++)==FALSE
76*6696Smckusick 	THEN	/* ? profile */
77*6696Smckusick 		IF *cmdadr=='-'
78*6696Smckusick 		    ANDF (input=pathopen(nullstr, profile))>=0
79*6696Smckusick 		THEN	exfile(rflag); flags &= ~ttyflg;
80*6696Smckusick 		FI
81*6696Smckusick 		IF rflag==0 THEN flags |= rshflg FI
82*6696Smckusick 
83*6696Smckusick 		/* open input file if specified */
84*6696Smckusick 		IF comdiv
85*6696Smckusick 		THEN	estabf(comdiv); input = -1;
86*6696Smckusick 		ELSE	input=((flags&stdflg) ? 0 : chkopen(cmdadr));
87*6696Smckusick 			comdiv--;
88*6696Smckusick 		FI
89*6696Smckusick #ifdef stupid
90*6696Smckusick 	ELSE	*execargs=dolv;	/* for `ps' cmd */
91*6696Smckusick #endif
92*6696Smckusick 	FI
93*6696Smckusick 
94*6696Smckusick 	exfile(0);
95*6696Smckusick 	done();
96*6696Smckusick }
97*6696Smckusick 
98*6696Smckusick LOCAL VOID	exfile(prof)
99*6696Smckusick BOOL		prof;
100*6696Smckusick {
101*6696Smckusick 	REG L_INT	mailtime = 0;
102*6696Smckusick 	REG INT		userid;
103*6696Smckusick 	struct stat	statb;
104*6696Smckusick 
105*6696Smckusick 	/* move input */
106*6696Smckusick 	IF input>0
107*6696Smckusick 	THEN	Ldup(input,INIO);
108*6696Smckusick 		input=INIO;
109*6696Smckusick 	FI
110*6696Smckusick 
111*6696Smckusick 	/* move output to safe place */
112*6696Smckusick 	IF output==2
113*6696Smckusick 	THEN	Ldup(dup(2),OTIO);
114*6696Smckusick 		output=OTIO;
115*6696Smckusick 	FI
116*6696Smckusick 
117*6696Smckusick 	userid=getuid();
118*6696Smckusick 
119*6696Smckusick 	/* decide whether interactive */
120*6696Smckusick 	IF (flags&intflg) ORF ((flags&oneflg)==0 ANDF gtty(output,&statb)==0 ANDF gtty(input,&statb)==0)
121*6696Smckusick 	THEN	dfault(&ps1nod, (userid?stdprompt:supprompt));
122*6696Smckusick 		dfault(&ps2nod, readmsg);
123*6696Smckusick 		flags |= ttyflg|prompt; ignsig(KILL);
124*6696Smckusick /*
125*6696Smckusick 		{
126*6696Smckusick 	#include <signal.h>
127*6696Smckusick 		signal(SIGTTIN, SIG_IGN);
128*6696Smckusick 		signal(SIGTTOU, SIG_IGN);
129*6696Smckusick 		signal(SIGTSTP, SIG_IGN);
130*6696Smckusick 		}
131*6696Smckusick */
132*6696Smckusick 	ELSE	flags |= prof; flags &= ~prompt;
133*6696Smckusick 	FI
134*6696Smckusick 
135*6696Smckusick 	IF setjmp(errshell) ANDF prof
136*6696Smckusick 	THEN	close(input); return;
137*6696Smckusick 	FI
138*6696Smckusick 
139*6696Smckusick 	/* error return here */
140*6696Smckusick 	loopcnt=breakcnt=peekc=0; iopend=0;
141*6696Smckusick 	IF input>=0 THEN initf(input) FI
142*6696Smckusick 
143*6696Smckusick 	/* command loop */
144*6696Smckusick 	LOOP	tdystak(0);
145*6696Smckusick 		stakchk(); /* may reduce sbrk */
146*6696Smckusick 		exitset();
147*6696Smckusick 		IF (flags&prompt) ANDF standin->fstak==0 ANDF !eof
148*6696Smckusick 		THEN	IF mailnod.namval
149*6696Smckusick 			    ANDF stat(mailnod.namval,&statb)>=0 ANDF statb.st_size
150*6696Smckusick 			    ANDF (statb.st_mtime != mailtime)
151*6696Smckusick 			    ANDF mailtime
152*6696Smckusick 			THEN	prs(mailmsg)
153*6696Smckusick 			FI
154*6696Smckusick 			mailtime=statb.st_mtime;
155*6696Smckusick 			prs(ps1nod.namval);
156*6696Smckusick 		FI
157*6696Smckusick 
158*6696Smckusick 		trapnote=0; peekc=readc();
159*6696Smckusick 		IF eof
160*6696Smckusick 		THEN	return;
161*6696Smckusick 		FI
162*6696Smckusick 		execute(cmd(NL,MTFLG),0);
163*6696Smckusick 		eof |= (flags&oneflg);
164*6696Smckusick 	POOL
165*6696Smckusick }
166*6696Smckusick 
167*6696Smckusick chkpr(eor)
168*6696Smckusick char eor;
169*6696Smckusick {
170*6696Smckusick 	IF (flags&prompt) ANDF standin->fstak==0 ANDF eor==NL
171*6696Smckusick 	THEN	prs(ps2nod.namval);
172*6696Smckusick 	FI
173*6696Smckusick }
174*6696Smckusick 
175*6696Smckusick settmp()
176*6696Smckusick {
177*6696Smckusick 	itos(getpid()); serial=0;
178*6696Smckusick 	tmpnam=movstr(numbuf,&tmpout[TMPNAM]);
179*6696Smckusick }
180*6696Smckusick 
181*6696Smckusick Ldup(fa, fb)
182*6696Smckusick 	REG INT		fa, fb;
183*6696Smckusick {
184*6696Smckusick 	dup(fa|DUPFLG, fb);
185*6696Smckusick 	close(fa);
186*6696Smckusick 	ioctl(fb, FIOCLEX, 0);
187*6696Smckusick }
188