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