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