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

Defined functions

Ldup defined in line 183; used 2 times
chkpr defined in line 169; used 7 times
exfile defined in line 100; used 3 times
main defined in line 36; never used
settmp defined in line 177; used 2 times

Defined variables

sccsid defined in line 2; never used
Last modified: 1985-11-01
Generated: 2016-12-26
Generated by src2html V0.67
page hit count: 3947
Valid CSS Valid XHTML 1.0 Strict