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