1: #
   2: /*
   3:  * UNIX shell
   4:  *
   5:  * S. R. Bourne
   6:  * Bell Telephone Laboratories
   7:  *
   8:  */
   9: 
  10: #include    "defs.h"
  11: #include    "dup.h"
  12: #include    "sym.h"
  13: #include    "timeout.h"
  14: #include    <sys/types.h>
  15: #include    <sys/stat.h>
  16: #include    <sgtty.h>
  17: 
  18: UFD     output = 2;
  19: LOCAL BOOL  beenhere = FALSE;
  20: CHAR        tmpout[20] = "/tmp/sh-";
  21: FILEBLK     stdfile;
  22: FILE        standin = &stdfile;
  23: #include    <execargs.h>
  24: 
  25: PROC VOID   exfile();
  26: 
  27: 
  28: 
  29: 
  30: main(c, v)
  31:     INT     c;
  32:     STRING      v[];
  33: {
  34:     REG INT     rflag=ttyflg;
  35: 
  36:     /* initialise storage allocation */
  37:     stdsigs();
  38:     setbrk(BRKINCR);
  39:     addblok((POS)0);
  40: 
  41:     /* set names from userenv */
  42:     getenv();
  43: 
  44:     /* look for restricted */
  45: /*	IF c>0 ANDF any('r', *v) THEN rflag=0 FI */
  46: 
  47:     /* look for options */
  48:     dolc=options(c,v);
  49:     IF dolc<2 THEN flags |= stdflg FI
  50:     IF (flags&stdflg)==0
  51:     THEN    dolc--;
  52:     FI
  53:     dolv=v+c-dolc; dolc--;
  54: 
  55:     /* return here for shell file execution */
  56:     setjmp(subshell);
  57: 
  58:     /* number of positional parameters */
  59:     assnum(&dolladr,dolc);
  60:     cmdadr=dolv[0];
  61: 
  62:     /* set pidname */
  63:     assnum(&pidadr, getpid());
  64: 
  65:     /* set up temp file names */
  66:     settmp();
  67: 
  68:     /* default ifs */
  69:     dfault(&ifsnod, sptbnl);
  70: 
  71:     IF (beenhere++)==FALSE
  72:     THEN    /* ? profile */
  73:         IF *cmdadr=='-'
  74:             ANDF (input=pathopen(nullstr, profile))>=0
  75:         THEN    exfile(rflag); flags &= ~ttyflg;
  76:         FI
  77:         IF rflag==0 THEN flags |= rshflg FI
  78: 
  79:         /* open input file if specified */
  80:         IF comdiv
  81:         THEN    estabf(comdiv); input = -1;
  82:         ELSE    input=((flags&stdflg) ? 0 : chkopen(cmdadr));
  83:             comdiv--;
  84:         FI
  85:     ELSE    *execargs=dolv; /* for `ps' cmd */
  86:     FI
  87: 
  88:     exfile(0);
  89:     done();
  90: }
  91: 
  92: LOCAL VOID  exfile(prof)
  93: BOOL        prof;
  94: {
  95:     REG L_INT   mailtime = 0;
  96:     REG INT     userid;
  97:     struct stat statb;
  98: 
  99:     /* move input */
 100:     IF input>0
 101:     THEN    Ldup(input,INIO);
 102:         input=INIO;
 103:     FI
 104: 
 105:     /* move output to safe place */
 106:     IF output==2
 107:     THEN    Ldup(dup(2),OTIO);
 108:         output=OTIO;
 109:     FI
 110: 
 111:     userid=getuid();
 112: 
 113:     /* decide whether interactive */
 114:     IF (flags&intflg) ORF ((flags&oneflg)==0 ANDF gtty(output,&statb)==0 ANDF gtty(input,&statb)==0)
 115:     THEN    dfault(&ps1nod, (userid?stdprompt:supprompt));
 116:         dfault(&ps2nod, readmsg);
 117:         flags |= ttyflg|prompt; ignsig(KILL);
 118:     ELSE    flags |= prof; flags &= ~prompt;
 119:     FI
 120: 
 121:     IF setjmp(errshell) ANDF prof
 122:     THEN    close(input); return;
 123:     FI
 124: 
 125:     /* error return here */
 126:     loopcnt=breakcnt=peekc=0; iopend=0;
 127:     IF input>=0 THEN initf(input) FI
 128: 
 129:     /* command loop */
 130:     LOOP    tdystak(0);
 131:         stakchk(); /* may reduce sbrk */
 132:         exitset();
 133:         IF (flags&prompt) ANDF standin->fstak==0 ANDF !eof
 134:         THEN    IF mailnod.namval
 135:                 ANDF stat(mailnod.namval,&statb)>=0 ANDF statb.st_size
 136:                 ANDF (statb.st_mtime != mailtime)
 137:                 ANDF mailtime
 138:             THEN    prs(mailmsg)
 139:             FI
 140:             mailtime=statb.st_mtime;
 141:             prs(ps1nod.namval); alarm(TIMEOUT); flags |= waiting;
 142:         FI
 143: 
 144:         trapnote=0; peekc=readc();
 145:         IF eof
 146:         THEN    return;
 147:         FI
 148:         alarm(0); flags &= ~waiting;
 149:         execute(cmd(NL,MTFLG),0);
 150:         eof |= (flags&oneflg);
 151:     POOL
 152: }
 153: 
 154: chkpr(eor)
 155: char eor;
 156: {
 157:     IF (flags&prompt) ANDF standin->fstak==0 ANDF eor==NL
 158:     THEN    prs(ps2nod.namval);
 159:     FI
 160: }
 161: 
 162: settmp()
 163: {
 164:     itos(getpid()); serial=0;
 165:     tmpnam=movstr(numbuf,&tmpout[TMPNAM]);
 166: }
 167: 
 168: Ldup(fa, fb)
 169:     REG INT     fa, fb;
 170: {
 171:     dup(fa|DUPFLG, fb);
 172:     close(fa);
 173:     ioctl(fb, FIOCLEX, 0);
 174: }

Defined functions

Ldup defined in line 168; used 2 times
chkpr defined in line 154; used 7 times
exfile defined in line 92; used 3 times
main defined in line 30; never used
settmp defined in line 162; used 2 times
Last modified: 1979-01-12
Generated: 2016-12-26
Generated by src2html V0.67
page hit count: 1179
Valid CSS Valid XHTML 1.0 Strict