Annotation of 43BSDReno/bin/sh/main.c, revision 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.