Annotation of coherent/d/bin/sh/main.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  * sh/main.c
                      3:  * The Bourne shell.
                      4:  * Main program, initialization and miscellaneous routines.
                      5:  */
                      6: 
                      7: #include <sys/param.h>
                      8: #include "sh.h"
                      9: 
                     10: main(argc, argv, envp)
                     11: char *argv[];
                     12: char *envp[];
                     13: {
                     14:        sarg0 = argc>0 ? argv[0] : "";
                     15:        fakearg(0, argc, argv, envp);
                     16:        if (argc>0 && argv[0][0]=='-') {
                     17:                lgnflag = 1;
                     18:                umask(ufmask=022);
                     19:        } else if (argc>0 && argv[0][0]=='+') {
                     20:                dflttrp(IBACK);         /* for security, no <Ctrl-C> out of /etc/profile */
                     21:                lgnflag = 2;
                     22:                umask(ufmask=022);
                     23:        } else {
                     24:                umask(ufmask=umask(ufmask));
                     25:        }
                     26: 
                     27:        if (setjmp(restart) != 0) {
                     28:                /* reentry for shell command file execution */
                     29:                fakearg(1, nargc, nargv, nenvp);
                     30:                argc = nargc;
                     31:                argv = nargv;
                     32:                envp = nenvp;
                     33:                cmdflag++;
                     34:                nllflag = 0;
                     35:        }
                     36: 
                     37:        shpid = getpid();
                     38:        initvar(envp);
                     39:        cleanup(1, NULL);
                     40:        if (set(argc, argv, 1))
                     41:                return(1);
                     42:        if (cflag) {
                     43:                if (sargp[0]==NULL) {
                     44:                        printe("No string for -c?");
                     45:                        return(1);
                     46:                }
                     47:                --sargc;
                     48:                session(SARGS, *sargp++);
                     49:        } else if (!sflag && !iflag && sargc!=0) {
                     50:                sarg0 = *sargp++;
                     51:                --sargc;
                     52:                if (scmdp == NULL)
                     53:                        scmdp = sarg0;
                     54:                session(SFILE, scmdp);
                     55:        } else {
                     56:                session(SSTR, stdin);
                     57:        }
                     58:        cleanup(2, NULL);
                     59:        return (slret);
                     60: }
                     61: 
                     62: /*
                     63:  * Make the arg listing of ps come out right.
                     64:  *     f == 0, first entry, determine buffer limits.
                     65:  *     f != 0, later entry, fill buffer with lies.
                     66:  */
                     67: fakearg(f, argc, argv, envp)
                     68: int f, argc;
                     69: char **argv, **envp;
                     70: {
                     71:        static char *fbuf;
                     72:        static int nbuf;
                     73:        register int n;
                     74: 
                     75:        if (f == 0) {
                     76:                fbuf = argv[0];
                     77:                nbuf = 0;
                     78:                if (envp != NULL && envp[0] != NULL) {
                     79:                        while (envp[1] != NULL)
                     80:                                envp += 1;
                     81:                        nbuf = envp[0] - fbuf + strlen(envp[0]) - 1;
                     82:                } else if (argc > 0)
                     83:                        nbuf = argv[argc-1] - fbuf + strlen(argv[argc-1]) - 1;
                     84:        } else {
                     85:                if (fbuf == NULL || nbuf == 0)
                     86:                        return;
                     87:                n = 0;
                     88:                fbuf[0] = 0;
                     89:                while (--argc > 0) {
                     90:                        argv += 1;
                     91:                        n += strlen(argv[0]) + 1;
                     92:                        if (n >= nbuf)
                     93:                                break;
                     94:                        strcat(fbuf, argv[0]);
                     95:                        strcat(fbuf, " ");
                     96:                }
                     97:                strcat(fbuf, "\1");     /* non-ascii terminator */
                     98:        }
                     99: }
                    100: 
                    101: /*
                    102:  * Loop on input.
                    103:  */
                    104: session(t, p)
                    105: register char *p;
                    106: {
                    107:        SES s;
                    108:        register int rcode;
                    109: 
                    110:        s.s_next = sesp;
                    111:        sesp = &s;
                    112:        s.s_bpp = savebuf();
                    113: 
                    114:        switch (s.s_type = t) {
                    115:        case SARGS:
                    116:                s.s_strp = p;
                    117:                s.s_flag = 0;
                    118:                break;
                    119:        case SARGV:
                    120:                s.s_argv = (char **) p;
                    121:                if ((s.s_strp = s.s_argv[0]) == NULL)
                    122:                        return (0);
                    123:                s.s_flag = 0;
                    124:                break;
                    125:        case SFILE:
                    126:                s.s_strp = p;
                    127:                if ((s.s_ifp = fopen(s.s_strp, "r")) == NULL) {
                    128:                        ecantopen(s.s_strp);
                    129:                        return (1);
                    130:                }
                    131:                s.s_flag = isatty(fileno(s.s_ifp)) && isatty(2);
                    132:                break;
                    133:        case SSTR:
                    134:                s.s_strp = NULL;
                    135:                s.s_ifp = (FILE *) p;
                    136:                s.s_flag = isatty(fileno(s.s_ifp)) && isatty(2);
                    137:                break;
                    138:        }
                    139: 
                    140:        if (s.s_next == NULL) {         /* Initial entry */
                    141:                if (iflag)
                    142:                        s.s_flag = iflag;
                    143:                else
                    144:                        iflag = s.s_flag;
                    145:                if (lgnflag != 2)
                    146:                        dflttrp(IRDY);  /* allow <Ctrl-C> unless "+sh" */
                    147:        }
                    148: 
                    149:        /* Loop on input */
                    150:        for (;;) {
                    151:                rcode = setjmp(s.s_envl);
                    152:                switch (rcode) {
                    153:                case RSET:      /* initial setjmp call */
                    154:                        switch (lgnflag) {
                    155:                        case 1:         /* - sign invocation */
                    156:                                lgnflag = 0;
                    157:                                if (ffind("/etc", "profile", 4))
                    158:                                        session(SFILE, duplstr(strt, 0));
                    159:                                recover(IPROF);
                    160:                                if (*vhome && ffind(vhome, ".profile", 4))
                    161:                                        session(SFILE, duplstr(strt, 0));
                    162:                                break;
                    163:                        case 2:         /* + sign invocation */
                    164:                                lgnflag = 0;
                    165:                                if (ffind("/etc", "profile", 4))
                    166:                                        session(SFILE, duplstr(strt, 0));
                    167:                                recover(IPROF);
                    168:                                dflttrp(IRDY);  /* allow <Ctrl-C> in SHELL */
                    169:                                return exshell( findvar("SHELL") );
                    170:                        }
                    171:                        checkmail();
                    172:                        comflag = 1;
                    173:                        errflag = 0;
                    174:                        recover(IRDY);
                    175:                        freebuf(s.s_bpp);
                    176:                        s.s_bpp = savebuf();
                    177:                        if (yyparse() != 0)
                    178:                                syntax();
                    179:                case REOF:
                    180:                        recover(IRDY);
                    181:                        break;
                    182:                case RCMD:
                    183:                        recover(IRDY);
                    184:                        s.s_con = NULL;
                    185:                        command(s.s_node);
                    186:                        if ((tflag && tflag++ >= 2))
                    187:                                break;
                    188:                        continue;
                    189:                case RERR:
                    190:                        recover(IRDY);
                    191:                        if ( ! errflag)
                    192:                                syntax();
                    193:                        if ( ! iflag || (tflag && tflag++ >= 2))
                    194:                                break;
                    195:                        continue;
                    196:                case RINT:
                    197:                        if (s.s_next != NULL) {
                    198:                                sesp = s.s_next;
                    199:                                reset(RINT);
                    200:                                NOTREACHED;
                    201:                        }
                    202:                        prpflag = 2;
                    203:                        if ( ! iflag || (tflag && tflag++ >= 2))
                    204:                                break;
                    205:                        continue;
                    206:                case RUEXITS:
                    207:                case RUABORT:
                    208:                        if (s.s_next != NULL) {
                    209:                                sesp = s.s_next;
                    210:                                reset(rcode);
                    211:                                NOTREACHED;
                    212:                        }
                    213:                        if (rcode == RUEXITS || !iflag || (tflag && tflag++ >= 2))
                    214:                                break;
                    215:                        continue;
                    216:                case RNOSBRK:
                    217:                case RSYSER:
                    218:                case RBRKCON:
                    219:                case RNOWAY:
                    220:                default:
                    221:                        if (s.s_next!=NULL)
                    222:                                break;
                    223:                        if ( ! iflag || (tflag && tflag++ >= 2))
                    224:                                break;
                    225:                        continue;
                    226:                }
                    227:                break;
                    228:        }
                    229:        freebuf(s.s_bpp);
                    230:        if (s.s_type == SFILE)
                    231:                fclose(s.s_ifp);
                    232:        if (s.s_next == NULL) {
                    233:                sigintr(0);
                    234:                recover(IRDY);
                    235:        }
                    236:        sesp = s.s_next;
                    237:        return (slret);
                    238: }
                    239: 
                    240: reset(f)
                    241: {
                    242:        longjmp(sesp->s_envl, f);
                    243:        NOTREACHED;
                    244: }
                    245: 
                    246: /*
                    247:  * Kludge cleanup.
                    248:  */
                    249: cleanup(flag, file)
                    250: char *file;
                    251: {
                    252:        static char *files[8];
                    253:        static int nfiles = 0;
                    254:        register char **pp;
                    255: 
                    256:        if (flag) {
                    257:                for (pp=files; pp<files+8; pp+=1)
                    258:                        if (*pp != NULL) {
                    259:                                if (flag==2)
                    260:                                        unlink(*pp);
                    261:                                sfree(*pp);
                    262:                                *pp = NULL;
                    263:                        }
                    264:                nfiles = 0;
                    265:        } else {
                    266:                pp = files + nfiles;
                    267:                if (*pp != NULL) {
                    268:                        unlink(*pp);
                    269:                        sfree(*pp);
                    270:                }
                    271:                *pp = duplstr(file, 1);
                    272:                nfiles = (nfiles + 1) & 7;
                    273:        }
                    274: }
                    275: 
                    276: /*
                    277:  * Make a temp file name.
                    278:  */
                    279: char *
                    280: shtmp()
                    281: {
                    282:        static char tmpfile[] = "/tmp/shXXXXXX";
                    283:        static int tmpflag = 0;
                    284: 
                    285:        sprintf(tmpfile+6, "%05d%c", shpid, (tmpflag++%26) + 'a');
                    286:        return (tmpfile);
                    287: }
                    288: 
                    289: /*
                    290:  * Print formatted.
                    291:  */
                    292: /*
                    293: printv(av)
                    294: register char **av;
                    295: {
                    296:        while (*av) prints("\t%s\n", *av++);
                    297: }
                    298: */
                    299: 
                    300: prints(a1)
                    301: char *a1;
                    302: {
                    303:        fprintf(stderr, "%r", &a1);
                    304: }
                    305: 
                    306: /*
                    307:  * Make a core dump in /tmp and longjmp back to session -
                    308:  *     there's a possibility we'll die horribly.
                    309:  */
                    310: panic(i) register int i;
                    311: {
                    312: #ifdef PARANOID
                    313:        register int f;
                    314: 
                    315:        if ((f=fork())==0) {
                    316:                abort();
                    317:                NOTREACHED;
                    318:        }
                    319:        waitc(f);
                    320: #endif
                    321:        printe("Internal shell assertion %d failed", i);
                    322:        reset(RNOWAY);
                    323:        NOTREACHED;
                    324: }
                    325: 
                    326: /*
                    327:  * Print out an error message.
                    328:  */
                    329: printe(a1)
                    330: char *a1;
                    331: {
                    332:        errflag += 1;
                    333:        if (! noeflag)
                    334:                fprintf(stderr, "%r\n", &a1);
                    335: }
                    336: 
                    337: /*
                    338:  * Some familiar errors.
                    339:  */
                    340: ecantopen(s) char *s; { printe("Cannot open %s", s); }
                    341: ecantfind(s) char *s; { printe("Cannot find %s", s); }
                    342: e2big(s) char *s; { printe("File to big to execute: %s", s); }
                    343: ecantmake(s) char *s; { printe("Cannot create %s", s); }
                    344: emisschar(c) { printe("Missing `%c'", c); }
                    345: ecantfdop() { printe("Fdopen failed"); }
                    346: enotdef(s) char *s; { printe("Cannot find variable %s", s); }
                    347: eillvar(s) char *s; { printe("Illegal variable name: %s", s); }
                    348: eredir() { printe("Illegal redirection"); }
                    349: etoolong() { printe("Argument too long: %.*s", STRSIZE, strt); }
                    350: 
                    351: /*
                    352:  * Don't print out an error message.
                    353:  */
                    354: yyerror()
                    355: {
                    356: }
                    357: 
                    358: /*
                    359:  * print out the prompt given the prompt to write
                    360:  */
                    361: prompt(vps)
                    362: char *vps;
                    363: {
                    364:        prints("%s", vps);
                    365: #if RSX
                    366:        fflush(stdout);
                    367: #endif
                    368: }
                    369: 
                    370: /*
                    371:  * Syntax error message - print line number and file if
                    372:  *     not interactive.
                    373:  */
                    374: syntax()
                    375: {
                    376:        if (sesp->s_type == SFILE) {
                    377:                if (feof(sesp->s_ifp))
                    378:                        printe("%s: Syntax error at EOF", sesp->s_strp);
                    379:                else
                    380:                        printe("%s: Syntax error in line %d", sesp->s_strp, yyline);
                    381:        } else
                    382:                printe("Syntax error");
                    383: }
                    384: 
                    385: /* end of sh/main.c */

unix.superglobalmegacorp.com

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