Annotation of coherent/b/bin/sh_B4_420/main.c, revision 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: 
        !            15:        sarg0 = argc>0 ? argv[0] : "";
        !            16:        fakearg(0, argc, argv, envp);
        !            17:        if (argc>0 && argv[0][0]=='-') {
        !            18:                lgnflag = 1;
        !            19:                umask(ufmask=022);
        !            20:        } else if (argc>0 && argv[0][0]=='+') {
        !            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: #if 0
        !            40:        cleanup(1, NULL);
        !            41: #endif
        !            42:        if (set(argc, argv, 1))
        !            43:                return(1);
        !            44:        if (cflag) {
        !            45:                if (sargp[0]==NULL) {
        !            46:                        printe("No string for -c?");
        !            47:                        return(1);
        !            48:                }
        !            49:                --sargc;
        !            50:                session(SARGS, *sargp++);
        !            51:        } else if (!sflag && !iflag && sargc!=0) {
        !            52:                sarg0 = *sargp++;
        !            53:                --sargc;
        !            54:                if (scmdp == NULL)
        !            55:                        scmdp = sarg0;
        !            56:                session(SFILE, scmdp);
        !            57:        } else {
        !            58:                session(SSTR, stdin);
        !            59:        }
        !            60:        cleanup_shell_fns ();
        !            61:        unlink_temp (capture_temp ());
        !            62:        return (slret);
        !            63: }
        !            64: 
        !            65: /*
        !            66:  * Make the arg listing of ps come out right.
        !            67:  *     f == 0, first entry, determine buffer limits.
        !            68:  *     f != 0, later entry, fill buffer with lies.
        !            69:  */
        !            70: fakearg(f, argc, argv, envp)
        !            71: int f, argc;
        !            72: char **argv, **envp;
        !            73: {
        !            74:        static char *fbuf;
        !            75:        static int nbuf;
        !            76:        register int n;
        !            77: 
        !            78:        if (f == 0) {
        !            79:                fbuf = argv[0];
        !            80:                nbuf = 0;
        !            81:                if (envp != NULL && envp[0] != NULL) {
        !            82:                        while (envp[1] != NULL)
        !            83:                                envp += 1;
        !            84:                        nbuf = envp[0] - fbuf + strlen(envp[0]) - 1;
        !            85:                } else if (argc > 0)
        !            86:                        nbuf = argv[argc-1] - fbuf + strlen(argv[argc-1]) - 1;
        !            87:        } else {
        !            88:                if (fbuf == NULL || nbuf == 0)
        !            89:                        return;
        !            90:                n = 0;
        !            91:                fbuf[0] = 0;
        !            92:                while (--argc > 0) {
        !            93:                        argv += 1;
        !            94:                        n += strlen(argv[0]) + 1;
        !            95:                        if (n >= nbuf)
        !            96:                                break;
        !            97:                        strcat(fbuf, argv[0]);
        !            98:                        strcat(fbuf, " ");
        !            99:                }
        !           100:                strcat(fbuf, "\1");     /* non-ascii terminator */
        !           101:        }
        !           102: }
        !           103: 
        !           104: /*
        !           105:  * Loop on input.
        !           106:  */
        !           107: session(t, p)
        !           108: register char *p;
        !           109: {
        !           110:        SES s;
        !           111:        register int rcode;
        !           112: 
        !           113:        s.s_next = sesp;
        !           114:        sesp = &s;
        !           115:        s.s_bpp = savebuf();
        !           116: 
        !           117:        switch (s.s_type = t) {
        !           118:        case SARGS:
        !           119:                s.s_strp = p;
        !           120:                s.s_flag = 0;
        !           121:                break;
        !           122:        case SARGV:
        !           123:                s.s_argv = (char **) p;
        !           124:                if ((s.s_strp = s.s_argv[0]) == NULL)
        !           125:                        return (0);
        !           126:                s.s_flag = 0;
        !           127:                break;
        !           128:        case SFILE:
        !           129:                s.s_strp = p;
        !           130:                if ((s.s_ifp = fopen(s.s_strp, "r")) == NULL) {
        !           131:                        ecantopen(s.s_strp);
        !           132:                        return (1);
        !           133:                }
        !           134:                s.s_flag = isatty(fileno(s.s_ifp)) && isatty(2);
        !           135:                break;
        !           136:        case SSTR:
        !           137:                s.s_strp = NULL;
        !           138:                s.s_ifp = (FILE *) p;
        !           139:                s.s_flag = isatty(fileno(s.s_ifp)) && isatty(2);
        !           140:                break;
        !           141:        }
        !           142: 
        !           143:        if (s.s_next == NULL) {         /* Initial entry */
        !           144:                if (iflag)
        !           145:                        s.s_flag = iflag;
        !           146:                else
        !           147:                        iflag = s.s_flag;
        !           148:                dflttrp(IRDY);
        !           149:        }
        !           150: 
        !           151:        /* Loop on input */
        !           152:        for (;;) {
        !           153:                unlink_temp (capture_temp ());
        !           154: 
        !           155:                rcode = setjmp(s.s_envl);
        !           156:                switch (rcode) {
        !           157:                case RSET:      /* initial setjmp call */
        !           158:                        switch (lgnflag) {
        !           159:                        case 1:         /* - sign invocation */
        !           160:                                lgnflag = 0;
        !           161:                                if (ffind("/etc", "profile", 4))
        !           162:                                        session(SFILE, duplstr(strt, 0));
        !           163:                                recover(IPROF);
        !           164:                                if (*vhome && ffind(vhome, ".profile", 4))
        !           165:                                        session(SFILE, duplstr(strt, 0));
        !           166:                                break;
        !           167:                        case 2:         /* + sign invocation */
        !           168:                                lgnflag = 0;
        !           169:                                if (ffind("/etc", "profile", 4))
        !           170:                                        session(SFILE, duplstr(strt, 0));
        !           171:                                recover(IPROF);
        !           172:                                return exshell( findvar("SHELL") );
        !           173:                        }
        !           174:                        checkmail();
        !           175:                        comflag = 1;
        !           176:                        errflag = 0;
        !           177:                        recover(IRDY);
        !           178:                        freebuf(s.s_bpp);
        !           179:                        s.s_bpp = savebuf();
        !           180:                        if (yyparse() != 0)
        !           181:                                syntax();
        !           182:                case REOF:
        !           183:                        recover(IRDY);
        !           184:                        break;
        !           185:                case RCMD:
        !           186:                        recover(IRDY);
        !           187:                        s.s_con = NULL;
        !           188:                        command(s.s_node);
        !           189:                        if ((tflag && tflag++ >= 2))
        !           190:                                break;
        !           191:                        continue;
        !           192:                case RERR:
        !           193:                        recover(IRDY);
        !           194:                        if ( ! errflag)
        !           195:                                syntax();
        !           196:                        if ( ! iflag || (tflag && tflag++ >= 2))
        !           197:                                break;
        !           198:                        continue;
        !           199:                case RINT:
        !           200:                        if (s.s_next != NULL) {
        !           201:                                sesp = s.s_next;
        !           202:                                reset(RINT);
        !           203:                                NOTREACHED;
        !           204:                        }
        !           205:                        prpflag = 2;
        !           206:                        if ( ! iflag || (tflag && tflag++ >= 2))
        !           207:                                break;
        !           208:                        continue;
        !           209:                case RUEXITS:
        !           210:                case RUABORT:
        !           211:                        if (s.s_next != NULL) {
        !           212:                                sesp = s.s_next;
        !           213:                                reset(rcode);
        !           214:                                NOTREACHED;
        !           215:                        }
        !           216:                        if (rcode == RUEXITS || !iflag || (tflag && tflag++ >= 2))
        !           217:                                break;
        !           218:                        continue;
        !           219:                case RNOSBRK:
        !           220:                case RSYSER:
        !           221:                case RBRKCON:
        !           222:                case RNOWAY:
        !           223:                default:
        !           224:                        if (s.s_next!=NULL)
        !           225:                                break;
        !           226:                        if ( ! iflag || (tflag && tflag++ >= 2))
        !           227:                                break;
        !           228:                        continue;
        !           229:                }
        !           230:                break;
        !           231:        }
        !           232:        freebuf(s.s_bpp);
        !           233:        if (s.s_type == SFILE)
        !           234:                fclose(s.s_ifp);
        !           235:        if (s.s_next == NULL) {
        !           236:                sigintr(0);
        !           237:                recover(IRDY);
        !           238:        }
        !           239:        sesp = s.s_next;
        !           240:        return (slret);
        !           241: }
        !           242: 
        !           243: reset(f)
        !           244: {
        !           245:        longjmp(sesp->s_envl, f);
        !           246:        NOTREACHED;
        !           247: }
        !           248: 
        !           249: 
        !           250: /*
        !           251:  * Global head of list of temporary files.
        !           252:  */
        !           253: 
        !           254: static TEMP_FILE      *        temp_list;
        !           255: 
        !           256: ALLOC_COUNT (temp)
        !           257: 
        !           258: /*
        !           259:  * Remember the name of a temporary file.
        !           260:  */
        !           261: 
        !           262: void remember_temp (filename)
        !           263: char * filename;
        !           264: {
        !           265:        TEMP_FILE     * temp = (TEMP_FILE *) salloc (sizeof (* temp));
        !           266: 
        !           267:        temp->tf_name = duplstr (filename, 1);
        !           268:        temp->tf_next = temp_list;
        !           269:        temp_list = temp;
        !           270: 
        !           271:        ALLOC_ALLOC (temp)
        !           272: }
        !           273: 
        !           274: 
        !           275: /*
        !           276:  * Return a pointer to the current global list of temporary files and clear
        !           277:  * the global pointer to that list.
        !           278:  */
        !           279: 
        !           280: TEMP_FILE * capture_temp ()
        !           281: {
        !           282:        TEMP_FILE     * temp = temp_list;
        !           283: 
        !           284:        temp_list = NULL;
        !           285:        return temp;
        !           286: }
        !           287: 
        !           288: 
        !           289: /*
        !           290:  * Deallocate a list of temporary files.
        !           291:  */
        !           292: 
        !           293: void forget_temp (templist)
        !           294: TEMP_FILE     *        templist;
        !           295: {
        !           296:        TEMP_FILE     * temp;
        !           297: 
        !           298:        while ((temp = templist) != NULL) {
        !           299: 
        !           300:                templist = temp->tf_next;
        !           301: 
        !           302:                ALLOC_FREE (temp);
        !           303:                sfree (temp->tf_name);
        !           304:                sfree (temp);
        !           305:        }
        !           306: }
        !           307: 
        !           308: 
        !           309: /*
        !           310:  * Walk over a list of temporary files, unlinking the files and deallocating
        !           311:  * the list nodes.
        !           312:  */
        !           313: 
        !           314: void unlink_temp (templist)
        !           315: TEMP_FILE     *        templist;
        !           316: {
        !           317:        TEMP_FILE     * temp;
        !           318: 
        !           319:        while ((temp = templist) != NULL) {
        !           320: 
        !           321:                templist = temp->tf_next;
        !           322:                unlink (temp->tf_name);
        !           323: 
        !           324:                ALLOC_FREE (temp)
        !           325:                sfree (temp->tf_name);
        !           326:                sfree (temp);
        !           327:        }
        !           328: }
        !           329: 
        !           330: 
        !           331: /*
        !           332:  * Make a temp file name.
        !           333:  */
        !           334: char *
        !           335: shtmp()
        !           336: {
        !           337:        static char tmpfile[] = "/tmp/shXXXXXX";
        !           338:        static int tmpflag = 0;
        !           339: 
        !           340:        sprintf(tmpfile+6, "%05d%c", shpid, (tmpflag++%26) + 'a');
        !           341:        return (tmpfile);
        !           342: }
        !           343: 
        !           344: /*
        !           345:  * Print formatted.
        !           346:  */
        !           347: /*
        !           348: printv(av)
        !           349: register char **av;
        !           350: {
        !           351:        while (*av) prints("\t%s\n", *av++);
        !           352: }
        !           353: */
        !           354: 
        !           355: prints(a1)
        !           356: char *a1;
        !           357: {
        !           358:        fprintf(stderr, "%r", &a1);
        !           359: }
        !           360: 
        !           361: /*
        !           362:  * Make a core dump in /tmp and longjmp back to session -
        !           363:  *     there's a possibility we'll die horribly.
        !           364:  */
        !           365: panic(i) register int i;
        !           366: {
        !           367: #ifdef PARANOID
        !           368:        register int f;
        !           369: 
        !           370:        if ((f=fork())==0) {
        !           371:                abort();
        !           372:                NOTREACHED;
        !           373:        }
        !           374:        waitc(f);
        !           375: #endif
        !           376:        printe("Internal shell assertion %d failed", i);
        !           377:        reset(RNOWAY);
        !           378:        NOTREACHED;
        !           379: }
        !           380: 
        !           381: /*
        !           382:  * Print out an error message.
        !           383:  */
        !           384: printe(a1)
        !           385: char *a1;
        !           386: {
        !           387:        errflag += 1;
        !           388:        if (! noeflag)
        !           389:                fprintf(stderr, "%r\n", &a1);
        !           390: }
        !           391: 
        !           392: /*
        !           393:  * Some familiar errors.
        !           394:  */
        !           395: ecantopen(s) char *s; { printe("Cannot open %s", s); }
        !           396: ecantfind(s) char *s; { printe("Cannot find %s", s); }
        !           397: e2big(s) char *s; { printe("File to big to execute: %s", s); }
        !           398: ecantmake(s) char *s; { printe("Cannot create %s", s); }
        !           399: emisschar(c) { printe("Missing `%c'", c); }
        !           400: ecantfdop() { printe("Fdopen failed"); }
        !           401: enotdef(s) char *s; { printe("Cannot find variable %s", s); }
        !           402: eillvar(s) char *s; { printe("Illegal variable name: %s", s); }
        !           403: eredir() { printe("Illegal redirection"); }
        !           404: etoolong() { printe("Argument too long: %.*s", STRSIZE, strt); }
        !           405: eredirundo() {
        !           406:   printe ("Unable to preserve redirection state when redirecting builtin");
        !           407: }
        !           408: 
        !           409: /*
        !           410:  * Don't print out an error message.
        !           411:  */
        !           412: yyerror()
        !           413: {
        !           414: }
        !           415: 
        !           416: /*
        !           417:  * print out the prompt given the prompt to write
        !           418:  */
        !           419: prompt(vps)
        !           420: char *vps;
        !           421: {
        !           422:        prints("%s", vps);
        !           423: #if RSX
        !           424:        fflush(stdout);
        !           425: #endif
        !           426: }
        !           427: 
        !           428: /*
        !           429:  * Syntax error message - print line number and file if
        !           430:  *     not interactive.
        !           431:  */
        !           432: syntax()
        !           433: {
        !           434:        if (sesp->s_type == SFILE) {
        !           435:                if (feof(sesp->s_ifp))
        !           436:                        printe("%s: Syntax error at EOF", sesp->s_strp);
        !           437:                else
        !           438:                        printe("%s: Syntax error in line %d", sesp->s_strp, yyline);
        !           439:        } else
        !           440:                printe("Syntax error");
        !           441: }
        !           442: 
        !           443: /* 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.