xref: /csrg-svn/old/sh/main.c (revision 18426)
114478Ssam #ifndef lint
2*18426Smckusick static char sccsid[] = "@(#)main.c	4.3 03/19/85";
314478Ssam #endif
46696Smckusick 
56696Smckusick #
66696Smckusick /*
76696Smckusick  * UNIX shell
86696Smckusick  *
96696Smckusick  * S. R. Bourne
106696Smckusick  * Bell Telephone Laboratories
116696Smckusick  *
126696Smckusick  */
136696Smckusick 
146696Smckusick #include	"defs.h"
156696Smckusick #include	"sym.h"
166696Smckusick #include	"timeout.h"
176696Smckusick #include	<sys/types.h>
186696Smckusick #include	<sys/stat.h>
196696Smckusick #include	<sgtty.h>
20*18426Smckusick #include	<signal.h>
216696Smckusick 
226696Smckusick UFD		output = 2;
236696Smckusick LOCAL BOOL	beenhere = FALSE;
246696Smckusick CHAR		tmpout[20] = "/tmp/sh-";
256696Smckusick FILEBLK		stdfile;
266696Smckusick FILE		standin = &stdfile;
276696Smckusick #ifdef stupid
286696Smckusick #include	<execargs.h>
296696Smckusick #endif
306696Smckusick 
316696Smckusick PROC VOID	exfile();
326696Smckusick 
336696Smckusick 
346696Smckusick 
356696Smckusick 
366696Smckusick main(c, v)
376696Smckusick 	INT		c;
386696Smckusick 	STRING		v[];
396696Smckusick {
406696Smckusick 	REG INT		rflag=ttyflg;
416696Smckusick 
426696Smckusick 	/* initialise storage allocation */
436696Smckusick 	stdsigs();
446696Smckusick 	setbrk(BRKINCR);
456696Smckusick 	addblok((POS)0);
466696Smckusick 
476696Smckusick 	/* set names from userenv */
48*18426Smckusick 	setupenv();
496696Smckusick 
506696Smckusick 	/* look for restricted */
516696Smckusick /*	IF c>0 ANDF any('r', *v) THEN rflag=0 FI */
526696Smckusick 
536696Smckusick 	/* look for options */
546696Smckusick 	dolc=options(c,v);
556696Smckusick 	IF dolc<2 THEN flags |= stdflg FI
566696Smckusick 	IF (flags&stdflg)==0
576696Smckusick 	THEN	dolc--;
586696Smckusick 	FI
596696Smckusick 	dolv=v+c-dolc; dolc--;
606696Smckusick 
616696Smckusick 	/* return here for shell file execution */
626696Smckusick 	setjmp(subshell);
636696Smckusick 
646696Smckusick 	/* number of positional parameters */
656696Smckusick 	assnum(&dolladr,dolc);
666696Smckusick 	cmdadr=dolv[0];
676696Smckusick 
686696Smckusick 	/* set pidname */
696696Smckusick 	assnum(&pidadr, getpid());
706696Smckusick 
716696Smckusick 	/* set up temp file names */
726696Smckusick 	settmp();
736696Smckusick 
746696Smckusick 	/* default ifs */
756696Smckusick 	dfault(&ifsnod, sptbnl);
766696Smckusick 
776696Smckusick 	IF (beenhere++)==FALSE
786696Smckusick 	THEN	/* ? profile */
796696Smckusick 		IF *cmdadr=='-'
806696Smckusick 		    ANDF (input=pathopen(nullstr, profile))>=0
816696Smckusick 		THEN	exfile(rflag); flags &= ~ttyflg;
826696Smckusick 		FI
836696Smckusick 		IF rflag==0 THEN flags |= rshflg FI
846696Smckusick 
856696Smckusick 		/* open input file if specified */
866696Smckusick 		IF comdiv
876696Smckusick 		THEN	estabf(comdiv); input = -1;
886696Smckusick 		ELSE	input=((flags&stdflg) ? 0 : chkopen(cmdadr));
896696Smckusick 			comdiv--;
906696Smckusick 		FI
916696Smckusick #ifdef stupid
926696Smckusick 	ELSE	*execargs=dolv;	/* for `ps' cmd */
936696Smckusick #endif
946696Smckusick 	FI
956696Smckusick 
966696Smckusick 	exfile(0);
976696Smckusick 	done();
986696Smckusick }
996696Smckusick 
1006696Smckusick LOCAL VOID	exfile(prof)
1016696Smckusick BOOL		prof;
1026696Smckusick {
1036696Smckusick 	REG L_INT	mailtime = 0;
1046696Smckusick 	REG INT		userid;
1056696Smckusick 	struct stat	statb;
1066696Smckusick 
1076696Smckusick 	/* move input */
1086696Smckusick 	IF input>0
1096696Smckusick 	THEN	Ldup(input,INIO);
1106696Smckusick 		input=INIO;
1116696Smckusick 	FI
1126696Smckusick 
1136696Smckusick 	/* move output to safe place */
1146696Smckusick 	IF output==2
1156696Smckusick 	THEN	Ldup(dup(2),OTIO);
1166696Smckusick 		output=OTIO;
1176696Smckusick 	FI
1186696Smckusick 
1196696Smckusick 	userid=getuid();
1206696Smckusick 
1216696Smckusick 	/* decide whether interactive */
1226696Smckusick 	IF (flags&intflg) ORF ((flags&oneflg)==0 ANDF gtty(output,&statb)==0 ANDF gtty(input,&statb)==0)
1236696Smckusick 	THEN	dfault(&ps1nod, (userid?stdprompt:supprompt));
1246696Smckusick 		dfault(&ps2nod, readmsg);
1256696Smckusick 		flags |= ttyflg|prompt; ignsig(KILL);
1266696Smckusick /*
1276696Smckusick 		{
1286696Smckusick 	#include <signal.h>
1296696Smckusick 		signal(SIGTTIN, SIG_IGN);
1306696Smckusick 		signal(SIGTTOU, SIG_IGN);
1316696Smckusick 		signal(SIGTSTP, SIG_IGN);
1326696Smckusick 		}
1336696Smckusick */
1346696Smckusick 	ELSE	flags |= prof; flags &= ~prompt;
1356696Smckusick 	FI
1366696Smckusick 
1376696Smckusick 	IF setjmp(errshell) ANDF prof
1386696Smckusick 	THEN	close(input); return;
1396696Smckusick 	FI
1406696Smckusick 
1416696Smckusick 	/* error return here */
1426696Smckusick 	loopcnt=breakcnt=peekc=0; iopend=0;
1436696Smckusick 	IF input>=0 THEN initf(input) FI
1446696Smckusick 
1456696Smckusick 	/* command loop */
1466696Smckusick 	LOOP	tdystak(0);
1476696Smckusick 		stakchk(); /* may reduce sbrk */
1486696Smckusick 		exitset();
1496696Smckusick 		IF (flags&prompt) ANDF standin->fstak==0 ANDF !eof
1506696Smckusick 		THEN	IF mailnod.namval
1516696Smckusick 			    ANDF stat(mailnod.namval,&statb)>=0 ANDF statb.st_size
1526696Smckusick 			    ANDF (statb.st_mtime != mailtime)
1536696Smckusick 			    ANDF mailtime
1546696Smckusick 			THEN	prs(mailmsg)
1556696Smckusick 			FI
1566696Smckusick 			mailtime=statb.st_mtime;
1576696Smckusick 			prs(ps1nod.namval);
1586696Smckusick 		FI
1596696Smckusick 
1606696Smckusick 		trapnote=0; peekc=readc();
1616696Smckusick 		IF eof
1626696Smckusick 		THEN	return;
1636696Smckusick 		FI
1646696Smckusick 		execute(cmd(NL,MTFLG),0);
1656696Smckusick 		eof |= (flags&oneflg);
1666696Smckusick 	POOL
1676696Smckusick }
1686696Smckusick 
1696696Smckusick chkpr(eor)
1706696Smckusick char eor;
1716696Smckusick {
1726696Smckusick 	IF (flags&prompt) ANDF standin->fstak==0 ANDF eor==NL
1736696Smckusick 	THEN	prs(ps2nod.namval);
1746696Smckusick 	FI
1756696Smckusick }
1766696Smckusick 
1776696Smckusick settmp()
1786696Smckusick {
1796696Smckusick 	itos(getpid()); serial=0;
1806696Smckusick 	tmpnam=movstr(numbuf,&tmpout[TMPNAM]);
1816696Smckusick }
1826696Smckusick 
1836696Smckusick Ldup(fa, fb)
1846696Smckusick 	REG INT		fa, fb;
1856696Smckusick {
186*18426Smckusick 	dup2(fa, fb);
1876696Smckusick 	close(fa);
1886696Smckusick 	ioctl(fb, FIOCLEX, 0);
1896696Smckusick }
190