Annotation of 43BSDReno/bin/sh/main.c, revision 1.1.1.1

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

unix.superglobalmegacorp.com

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