Annotation of 42BSD/bin/sh/main.c, revision 1.1.1.1

1.1       root        1: #ifndef lint
                      2: static char sccsid[] = "@(#)main.c     4.2 8/11/83";
                      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       "dup.h"
                     16: #include       "sym.h"
                     17: #include       "timeout.h"
                     18: #include       <sys/types.h>
                     19: #include       <sys/stat.h>
                     20: #include       <sgtty.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:        getenv();
                     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:        dup(fa|DUPFLG, fb);
                    187:        close(fa);
                    188:        ioctl(fb, FIOCLEX, 0);
                    189: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.