# 2.11BSD#431 - /usr/src/bin/sh/main.c

##### Functions

    Ldup              X
    chkpr             X
    exfile            X
    main              X
    settmp            X

       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

- in line 109, 115

chkpr defined in line 169; used 7 times

- in /usr/src/bin/sh/cmd.c line 79, 242, 314
- in /usr/src/bin/sh/io.c line 127
- in /usr/src/bin/sh/word.c line 40, 49, 87

exfile defined in line 100; used 3 times

- in line 31, 81, 96

main defined in line 36; never used
settmp defined in line 177; used 2 times

- in line 72
- in /usr/src/bin/sh/xec.c line 268

#### 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: 1122 |