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