Annotation of researchv9/cmd/sh/xec.c, revision 1.1

1.1     ! root        1: /*     @(#)xec.c       1.8     */
        !             2: /*
        !             3:  *
        !             4:  * UNIX shell
        !             5:  *
        !             6:  * Bell Telephone Laboratories
        !             7:  *
        !             8:  */
        !             9: 
        !            10: 
        !            11: #include       "defs.h"
        !            12: #include       <errno.h>
        !            13: #include       "sym.h"
        !            14: #include       <sys/types.h>
        !            15: #include       <sys/stat.h>
        !            16: 
        !            17: static int     parent;
        !            18: 
        !            19: /* ========    command execution       ========*/
        !            20: 
        !            21: 
        !            22: execute(argt, exec_link, errorflg, pf1, pf2)
        !            23: struct trenod  *argt;
        !            24: int    *pf1, *pf2;
        !            25: {
        !            26:        /*
        !            27:         * `stakbot' is preserved by this routine
        !            28:         */
        !            29:        register struct trenod  *t;
        !            30:        char            *sav = savstak();
        !            31: 
        !            32:        sigchk();
        !            33:        if (!errorflg)
        !            34:                flags &= ~errflg;
        !            35: 
        !            36:        if ((t = argt) && execbrk == 0)
        !            37:        {
        !            38:                register int    treeflgs;
        !            39:                int                     type;
        !            40:                register char   **com;
        !            41:                int                     linked;
        !            42:                int                     execflg;
        !            43: 
        !            44:                linked = exec_link >> 1;
        !            45:                execflg = exec_link & 01;
        !            46: 
        !            47:                treeflgs = t->tretyp;
        !            48:                type = treeflgs & COMMSK;
        !            49: 
        !            50:                switch (type)
        !            51:                {
        !            52:                case TFND:
        !            53:                        {
        !            54:                                struct fndnod   *f = (struct fndnod *)t;
        !            55:                                struct namnod   *n = lookup(f->fndnam);
        !            56: 
        !            57:                                exitval = 0;
        !            58: 
        !            59:                                if (special(n->namid))
        !            60:                                        failed(n->namid, badfname);
        !            61:                                if (!(n->namflg & N_ENVNAM))
        !            62:                                        free_val(&n->namval);
        !            63:        
        !            64:                                if (funcnt)
        !            65:                                        f->fndval->tretyp++;
        !            66: 
        !            67:                                n->namval.val = (char *)f->fndval;
        !            68:                                n->namval.flg = N_FUNCTN;
        !            69:                                if (flags & exportflg)
        !            70:                                        attrib(n, N_EXPORT);
        !            71:                                break;
        !            72:                        }
        !            73: 
        !            74:                case TCOM:
        !            75:                        {
        !            76:                                char    *a1;
        !            77:                                int     argn, internal;
        !            78:                                struct argnod   *schain = gchain;
        !            79:                                struct ionod    *io = t->treio;
        !            80:                                struct namnod   *n;
        !            81:                                exitval = 0;
        !            82: 
        !            83:                                gchain = 0;
        !            84:                                argn = getarg(t);
        !            85:                                com = scan(argn);
        !            86:                                a1 = com[1];
        !            87:                                gchain = schain;
        !            88: 
        !            89:                                if((n = findnam(com[0])) && !(n->namval.flg & N_FUNCTN))
        !            90:                                        n = 0;
        !            91:                                if ((internal = syslook(com[0], commands, no_commands)) || argn == 0)
        !            92:                                        setlist(comptr(t)->comset, 0);
        !            93: 
        !            94:                                if (argn && (flags&noexec) == 0)
        !            95:                                {               
        !            96:                                        /* print command if execpr */
        !            97: 
        !            98:                                        if (flags & execpr)
        !            99:                                                execprint(com);
        !           100: 
        !           101:                                        if (n)  /* function */
        !           102:                                        {
        !           103:                                                short index;
        !           104: 
        !           105:                                                funcnt++;
        !           106:                                                index = initio(io, 1);
        !           107:                                                pushargs(com);
        !           108:                                                execute((struct trenod *)(n->namval.val), exec_link, errorflg, pf1, pf2);
        !           109:                                                execbrk = 0;
        !           110:                                                restore(index);
        !           111:                                                popargs();
        !           112:                                                funcnt--;
        !           113: 
        !           114:                                                break;
        !           115:                                        }
        !           116: 
        !           117:                                        else if (internal)
        !           118:                                        {
        !           119:                                                short index;
        !           120:                                                index = initio(io, (internal != SYSEXEC));
        !           121: 
        !           122:                                            isbltin:
        !           123:                                                switch (internal)                       
        !           124:                                                {
        !           125:                                                case SYSBLTIN:
        !           126:                                                        if (--argn > 0)
        !           127:                                                        {
        !           128:                                                                com++;
        !           129:                                                                a1 = com[1];
        !           130:                                                                if (internal = syslook(com[0], commands, no_commands))
        !           131:                                                                        goto isbltin;
        !           132:                                                                failed(*com, notbltin);
        !           133:                                                        }
        !           134:                                                        break;
        !           135:        
        !           136:                                                case SYSDOT:    
        !           137:                                                        if (a1) 
        !           138:                                                        {       
        !           139:                                                                register int    f;      
        !           140:                                
        !           141:                                                                if ((f = pathopen(getpath(a1), a1)) < 0)        
        !           142:                                                                        failed(a1, notfound);   
        !           143:                                                                else    
        !           144:                                                                        execexp(0, f);  
        !           145:                                                        }       
        !           146:                                                        break;  
        !           147:                                
        !           148:                                                case SYSTIMES:  
        !           149:                                                        {       
        !           150:                                                                long int t[4];  
        !           151:                                
        !           152:                                                                times(t);       
        !           153:                                                                prt(t[2]);      
        !           154:                                                                prc_buff(SP);   
        !           155:                                                                prt(t[3]);      
        !           156:                                                                prc_buff(NL);   
        !           157:                                                        }       
        !           158:                                                        break;  
        !           159:                                
        !           160:                                                case SYSEXIT:   
        !           161:                                                        flags |= forked;        /* force exit */        
        !           162:                                                        exitsh(a1 ? stoi(a1) : retval);
        !           163:                                
        !           164:                                                case SYSNULL:   
        !           165:                                                        io = 0; 
        !           166:                                                        break;  
        !           167:                                
        !           168:                                                case SYSCONT:   
        !           169:                                                        if (loopcnt)
        !           170:                                                        {
        !           171:                                                                execbrk = breakcnt = 1;
        !           172:                                                                if (a1)
        !           173:                                                                        breakcnt = stoi(a1);
        !           174:                                                                if (breakcnt > loopcnt)
        !           175:                                                                        breakcnt = loopcnt;
        !           176:                                                                else
        !           177:                                                                        breakcnt = -breakcnt;
        !           178:                                                        }
        !           179:                                                        break;  
        !           180: 
        !           181:                                                case SYSBREAK:  
        !           182:                                                        if (loopcnt)
        !           183:                                                        {
        !           184:                                                                execbrk = breakcnt = 1;
        !           185:                                                                if (a1)
        !           186:                                                                        breakcnt = stoi(a1);
        !           187:                                                                if (breakcnt > loopcnt)
        !           188:                                                                        breakcnt = loopcnt;
        !           189:                                                        }
        !           190:                                                        break;  
        !           191: 
        !           192:                                                case SYSTRAP:   
        !           193:                                                        if (a1) 
        !           194:                                                        {       
        !           195:                                                                BOOL    clear;  
        !           196:                
        !           197:                                                                if ((clear = digit(*a1)) == 0)  
        !           198:                                                                        ++com;  
        !           199:                                                                while (*++com)  
        !           200:                                                                {       
        !           201:                                                                        int     i;      
        !           202:                
        !           203:                                                                        if ((i = stoi(*com)) >= MAXTRAP || i < MINTRAP) 
        !           204:                                                                                failed(*com, badtrap);  
        !           205:                                                                        else if (clear) 
        !           206:                                                                                clrsig(i);      
        !           207:                                                                        else    
        !           208:                                                                        {       
        !           209:                                                                                replace(&trapcom[i], a1);       
        !           210:                                                                                if (*a1)        
        !           211:                                                                                        getsig(i);      
        !           212:                                                                                else    
        !           213:                                                                                        ignsig(i);      
        !           214:                                                                        }       
        !           215:                                                                }       
        !           216:                                                        }       
        !           217:                                                        else    /* print out current traps */   
        !           218:                                                        {       
        !           219:                                                                int     i;      
        !           220:                                
        !           221:                                                                for (i = 0; i < MAXTRAP; i++)   
        !           222:                                                                {       
        !           223:                                                                        if (trapcom[i]) 
        !           224:                                                                        {       
        !           225:                                                                                prs_buff("trap ");
        !           226:                                                                                prs_buff(quotedstring(trapcom[i]));
        !           227:                                                                                prc_buff(SP);
        !           228:                                                                                prn_buff(i);    
        !           229:                                                                                prc_buff(NL);   
        !           230:                                                                        }       
        !           231:                                                                }       
        !           232:                                                        }       
        !           233:                                                        break;  
        !           234:                                
        !           235:                                                case SYSEXEC:   
        !           236:                                                        com++;  
        !           237:                                                        ioset = 0;      
        !           238:                                                        io = 0; 
        !           239:                                                        if (a1 == 0)    
        !           240:                                                        {       
        !           241:                                                                break;  
        !           242:                                                        }       
        !           243:                
        !           244:                                                case SYSNEWGRP: 
        !           245:                                                        oldsigs();      
        !           246:                                                        execa(com);
        !           247:                                                        done(); 
        !           248:                
        !           249:                                                case SYSCD:     
        !           250:                                                        if ((a1 && *a1) || (a1 == 0 && (a1 = homenod.namval.val)))      
        !           251:                                                        {       
        !           252:                                                                char *cdpath;   
        !           253:                
        !           254:                                                                if ((cdpath = cdpnod.namval.val) == 0 ||        
        !           255:                                                                     *a1 == '/' ||      
        !           256:                                                                     cf(a1, ".") == 0 ||        
        !           257:                                                                     cf(a1, "..") == 0 ||       
        !           258:                                                                     (*a1 == '.' && (*(a1+1) == '/' || *(a1+1) == '.' && *(a1+2) == '/')))      
        !           259:                                                                        cdpath = nullstr;
        !           260:                                                                dochdir(a1, cdpath);
        !           261:                                                        }       
        !           262:                                                        else 
        !           263:                                                        {
        !           264:                                                                if (a1)
        !           265:                                                                        failed(a1, baddir);     
        !           266:                                                                else
        !           267:                                                                        error(nohome);
        !           268:                                                        }
        !           269: 
        !           270:                                                        break;  
        !           271:                                
        !           272:                                                case SYSSHFT:   
        !           273:                                                        {       
        !           274:                                                                int places;     
        !           275:                
        !           276:                                                                places = a1 ? stoi(a1) : 1;     
        !           277:                
        !           278:                                                                if ((dolc -= places) < 0)
        !           279:                                                                {
        !           280:                                                                        dolc = 0;
        !           281:                                                                        error(badshift);
        !           282:                                                                }
        !           283:                                                                else
        !           284:                                                                        dolv += places;
        !           285:                                                        }                               
        !           286:                
        !           287:                                                        break;  
        !           288:                                
        !           289:                                                case SYSWAIT:   
        !           290:                                                        await(a1 ? stoi(a1) : -1, 1);   
        !           291:                                                        break;  
        !           292:                                
        !           293:                                                case SYSREAD:   
        !           294:                                                        rwait = 1;      
        !           295:                                                        exitval = a1? readvar(&com[1]) : 0;     
        !           296:                                                        rwait = 0;      
        !           297:                                                        break;  
        !           298:                        
        !           299:                                                case SYSSET:    
        !           300:                                                        if (a1) 
        !           301:                                                        {       
        !           302:                                                                int     argc;   
        !           303:                
        !           304:                                                                argc = options(argn, com);      
        !           305:                                                                if (argc > 1)   
        !           306:                                                                        setargs(com + argn - argc);     
        !           307:                                                        }       
        !           308:                                                        else if (comptr(t)->comset == 0)        
        !           309:                                                        {
        !           310:                                                                /*      
        !           311:                                                                 * scan name chain and print    
        !           312:                                                                 */     
        !           313:                                                                namscan(printnam);
        !           314:                                                        }
        !           315:                                                        break;  
        !           316:                                
        !           317:                                                case SYSXPORT:  
        !           318:                                                        {
        !           319:                                                                struct namnod   *n;
        !           320: 
        !           321:                                                                exitval = 0;
        !           322:                                                                if (a1) 
        !           323:                                                                {       
        !           324:                                                                        while (*++com)  
        !           325:                                                                        {
        !           326:                                                                                n = lookup(*com);
        !           327:                                                                                attrib(n, N_EXPORT);
        !           328:                                                                        }
        !           329:                                                                }       
        !           330:                                                                else    
        !           331:                                                                        namscan(printexp);
        !           332:                                                        }
        !           333:                                                        break;  
        !           334:                                
        !           335:                                                case SYSEVAL:   
        !           336:                                                        if (a1) 
        !           337:                                                                execexp(a1, &com[2]);   
        !           338:                                                        break;  
        !           339:                
        !           340:                                                case SYSUMASK:  
        !           341:                                                        if (a1) 
        !           342:                                                        {       
        !           343:                                                                int c, i;       
        !           344:                
        !           345:                                                                i = 0;  
        !           346:                                                                while ((c = *a1++) >= '0' && c <= '7')  
        !           347:                                                                        i = (i << 3) + c - '0'; 
        !           348:                                                                umask(i);       
        !           349:                                                        }       
        !           350:                                                        else    
        !           351:                                                        {       
        !           352:                                                                int i, j;       
        !           353:                
        !           354:                                                                umask(i = umask(0));    
        !           355:                                                                prc_buff('0');  
        !           356:                                                                for (j = 6; j >= 0; j -= 3)     
        !           357:                                                                        prc_buff(((i >> j) & 07) +'0'); 
        !           358:                                                                prc_buff(NL);   
        !           359:                                                        }       
        !           360:                                                        break;  
        !           361:                
        !           362:                                                case SYSRETURN:
        !           363:                                                        if (funcnt == 0)
        !           364:                                                                error(badreturn);
        !           365: 
        !           366:                                                        execbrk = 1;
        !           367:                                                        exitval = (a1 ? stoi(a1) : retval);
        !           368:                                                        break;
        !           369:                                                        
        !           370:                                                case SYSWHATIS:
        !           371:                                                        exitval = 0;
        !           372:                                                        if (a1)
        !           373:                                                        {
        !           374:                                                                while (*++com)
        !           375:                                                                        what_is(*com);
        !           376:                                                        }
        !           377:                                                        break;
        !           378: 
        !           379:                                                case SYSUNS:
        !           380:                                                        exitval = 0;
        !           381:                                                        if (a1)
        !           382:                                                        {
        !           383:                                                                while (*++com)
        !           384:                                                                        unset_name(*com);
        !           385:                                                        }
        !           386:                                                        break;
        !           387: 
        !           388:                                                case SYSMEM:
        !           389:                                                        exitval = 0;
        !           390:                                                        chkmem();
        !           391:                                                        break;
        !           392:                                                default:        
        !           393:                                                        prs_buff("unknown builtin\n");
        !           394:                                                }       
        !           395:                                        
        !           396: 
        !           397:                                                flushb();
        !           398:                                                restore(index);
        !           399:                                                chktrap();
        !           400:                                                break;
        !           401:                                        }
        !           402:                                }
        !           403:                                else if (t->treio == 0)
        !           404:                                {
        !           405:                                        chktrap();
        !           406:                                        break;
        !           407:                                }
        !           408: 
        !           409:                        }
        !           410: 
        !           411:                case TFORK:
        !           412:                        exitval = 0;
        !           413:                        if (execflg && (treeflgs & (FAMP | FPOU)) == 0)
        !           414:                                parent = 0;
        !           415:                        else
        !           416:                        {
        !           417:                                int forkcnt = 1;
        !           418: 
        !           419:                                if (treeflgs & (FAMP | FPOU))
        !           420:                                {
        !           421:                                        link_iodocs(iotemp);
        !           422:                                        linked = 1;
        !           423:                                }
        !           424: 
        !           425: 
        !           426:                                /*
        !           427:                                 * FORKLIM is the max period between forks -
        !           428:                                 * power of 2 usually.  Currently shell tries after
        !           429:                                 * 2,4,8,16, and 32 seconds and then quits
        !           430:                                 */
        !           431:        
        !           432:                                while ((parent = fork()) == -1)
        !           433:                                {
        !           434:                                        if ((forkcnt = (forkcnt * 2)) > FORKLIM)        /* 32 */
        !           435:                                        {
        !           436:                                                switch (errno)
        !           437:                                                {
        !           438:                                                case ENOMEM:
        !           439:                                                        error(noswap);
        !           440:                                                        break;
        !           441:                                                default:
        !           442:                                                case EAGAIN:
        !           443:                                                        error(nofork);
        !           444:                                                        break;
        !           445:                                                }
        !           446:                                        }
        !           447:                                        sigchk();
        !           448:                                        alarm(forkcnt);
        !           449:                                        pause(); 
        !           450:                                }
        !           451:                        }
        !           452:                        if (parent)
        !           453:                        {
        !           454:                                /*
        !           455:                                 * This is the parent branch of fork;
        !           456:                                 * it may or may not wait for the child
        !           457:                                 */
        !           458:                                if (treeflgs & FPRS && flags & ttyflg)
        !           459:                                {
        !           460:                                        prn(parent);
        !           461:                                        newline();
        !           462:                                }
        !           463:                                if (treeflgs & FPCL)
        !           464:                                        closepipe(pf1);
        !           465:                                if ((treeflgs & (FAMP | FPOU)) == 0)
        !           466:                                        await(parent, 0);
        !           467:                                else if ((treeflgs & FAMP) == 0)
        !           468:                                        post(parent);
        !           469:                                else
        !           470:                                        assnum(&pcsadr, parent);
        !           471:                                chktrap();
        !           472:                                break;
        !           473:                        }
        !           474:                        else    /* this is the forked branch (child) of execute */
        !           475:                        {
        !           476:                                flags |= forked;
        !           477:                                fiotemp  = 0;
        !           478: 
        !           479:                                if (linked == 1)
        !           480:                                {
        !           481:                                        swap_iodoc_nm(iotemp);
        !           482:                                        exec_link |= 06;
        !           483:                                }
        !           484:                                else if (linked == 0)
        !           485:                                        iotemp = 0;
        !           486: 
        !           487:                                postclr();
        !           488:                                settmp();
        !           489:                                /*
        !           490:                                 * Turn off INTR and QUIT if `FINT'
        !           491:                                 * Reset ramaining signals to parent
        !           492:                                 * except for those `lost' by trap
        !           493:                                 */
        !           494:                                oldsigs();
        !           495:                                if (treeflgs & FINT)
        !           496:                                {
        !           497:                                        signal(SIGINT, 1);
        !           498:                                        signal(SIGQUIT, 1);
        !           499: 
        !           500: #ifdef NICE
        !           501:                                        nice(NICEVAL);
        !           502: #endif
        !           503: 
        !           504:                                }
        !           505:                                /*
        !           506:                                 * pipe in or out
        !           507:                                 */
        !           508:                                if (treeflgs & FPIN)
        !           509:                                {
        !           510:                                        rename(pf1[INPIPE], 0);
        !           511:                                        close(pf1[OTPIPE]);
        !           512:                                }
        !           513:                                if (treeflgs & FPOU)
        !           514:                                {
        !           515:                                        close(pf2[INPIPE]);
        !           516:                                        rename(pf2[OTPIPE], 1);
        !           517:                                }
        !           518:                                /*
        !           519:                                 * default std input for &
        !           520:                                 */
        !           521:                                if (treeflgs & FINT && ioset == 0)
        !           522:                                        rename(chkopen(devnull), 0);
        !           523:                                /*
        !           524:                                 * io redirection
        !           525:                                 */
        !           526:                                initio(t->treio, 0);
        !           527: 
        !           528:                                if (type != TCOM)
        !           529:                                {
        !           530:                                        execute(forkptr(t)->forktre, exec_link | 01, errorflg);
        !           531:                                }
        !           532:                                else if (com[0] != ENDARGS)
        !           533:                                {
        !           534:                                        eflag = 0;
        !           535:                                        setlist(comptr(t)->comset, N_EXPORT);
        !           536:                                        rmtemp(0);
        !           537:                                        execa(com);
        !           538:                                }
        !           539:                                done();
        !           540:                        }
        !           541: 
        !           542:                case TPAR:
        !           543:                        execute(parptr(t)->partre, exec_link, errorflg);
        !           544:                        done();
        !           545: 
        !           546:                case TFIL:
        !           547:                        {
        !           548:                                int pv[2];
        !           549: 
        !           550:                                chkpipe(pv);
        !           551:                                if (execute(lstptr(t)->lstlef, 0, errorflg, pf1, pv) == 0)
        !           552:                                        execute(lstptr(t)->lstrit, exec_link, errorflg, pv, pf2);
        !           553:                                else
        !           554:                                        closepipe(pv);
        !           555:                        }
        !           556:                        break;
        !           557: 
        !           558:                case TLST:
        !           559:                        execute(lstptr(t)->lstlef, 0, errorflg);
        !           560:                        execute(lstptr(t)->lstrit, exec_link, errorflg);
        !           561:                        break;
        !           562: 
        !           563:                case TAND:
        !           564:                        if (execute(lstptr(t)->lstlef, 0, 0) == 0)
        !           565:                                execute(lstptr(t)->lstrit, exec_link, errorflg);
        !           566:                        break;
        !           567: 
        !           568:                case TORF:
        !           569:                        if (execute(lstptr(t)->lstlef, 0, 0) != 0)
        !           570:                                execute(lstptr(t)->lstrit, exec_link, errorflg);
        !           571:                        break;
        !           572: 
        !           573:                case TFOR:
        !           574:                        {
        !           575:                                struct namnod *n = lookup(forptr(t)->fornam);
        !           576:                                char    **args;
        !           577:                                struct dolnod *argsav = 0;
        !           578: 
        !           579:                                if (forptr(t)->forlst == 0)
        !           580:                                {
        !           581:                                        args = dolv + 1;
        !           582:                                        argsav = useargs();
        !           583:                                }
        !           584:                                else
        !           585:                                {
        !           586:                                        struct argnod *schain = gchain;
        !           587: 
        !           588:                                        gchain = 0;
        !           589:                                        trim((args = scan(getarg(forptr(t)->forlst)))[0]);
        !           590:                                        gchain = schain;
        !           591:                                }
        !           592:                                loopcnt++;
        !           593:                                while (*args != ENDARGS && execbrk == 0)
        !           594:                                {
        !           595:                                        assign(n, *args++);
        !           596:                                        execute(forptr(t)->fortre, 0, errorflg);
        !           597:                                        if (breakcnt < 0)
        !           598:                                                execbrk = (++breakcnt != 0);
        !           599:                                }
        !           600:                                if (breakcnt > 0)
        !           601:                                                execbrk = (--breakcnt != 0);
        !           602: 
        !           603:                                loopcnt--;
        !           604:                                argfor = (struct dolnod *)freeargs(argsav);
        !           605:                        }
        !           606:                        break;
        !           607: 
        !           608:                case TWH:
        !           609:                case TUN:
        !           610:                        {
        !           611:                                int     i = 0;
        !           612: 
        !           613:                                loopcnt++;
        !           614:                                while (execbrk == 0 && (execute(whptr(t)->whtre, 0, 0) == 0) == (type == TWH))
        !           615:                                {
        !           616:                                        i = execute(whptr(t)->dotre, 0, errorflg);
        !           617:                                        if (breakcnt < 0)
        !           618:                                                execbrk = (++breakcnt != 0);
        !           619:                                }
        !           620:                                if (breakcnt > 0)
        !           621:                                                execbrk = (--breakcnt != 0);
        !           622: 
        !           623:                                loopcnt--;
        !           624:                                exitval = i;
        !           625:                        }
        !           626:                        break;
        !           627: 
        !           628:                case TIF:
        !           629:                        if (execute(ifptr(t)->iftre, 0, 0) == 0)
        !           630:                                execute(ifptr(t)->thtre, exec_link, errorflg);
        !           631:                        else if (ifptr(t)->eltre)
        !           632:                                execute(ifptr(t)->eltre, exec_link, errorflg);
        !           633:                        else
        !           634:                                exitval = 0;    /* force zero exit for if-then-fi */
        !           635:                        break;
        !           636: 
        !           637:                case TSW:
        !           638:                        {
        !           639:                                register char   *r = mactrim(swptr(t)->swarg);
        !           640:                                register struct regnod *regp;
        !           641: 
        !           642:                                regp = swptr(t)->swlst;
        !           643:                                while (regp)
        !           644:                                {
        !           645:                                        struct argnod *rex = regp->regptr;
        !           646: 
        !           647:                                        while (rex)
        !           648:                                        {
        !           649:                                                register char   *s;
        !           650: 
        !           651:                                                if (gmatch(r, s = macro(rex->argval)) || (trim(s), eq(r, s)))
        !           652:                                                {
        !           653:                                                        execute(regp->regcom, 0, errorflg);
        !           654:                                                        regp = 0;
        !           655:                                                        break;
        !           656:                                                }
        !           657:                                                else
        !           658:                                                        rex = rex->argnxt;
        !           659:                                        }
        !           660:                                        if (regp)
        !           661:                                                regp = regp->regnxt;
        !           662:                                }
        !           663:                        }
        !           664:                        break;
        !           665:                }
        !           666:                exitset();
        !           667:        }
        !           668:        sigchk();
        !           669:        tdystak(sav);
        !           670:        flags |= eflag;
        !           671:        return(exitval);
        !           672: }
        !           673: 
        !           674: dochdir(place, cdpath)
        !           675: char *place, *cdpath;
        !           676: {
        !           677:        char *dir;      
        !           678:        char bestplace[256];
        !           679:        char tempdir[256];
        !           680:        int score, bestscore=1000;
        !           681:        char *spname();
        !           682:        struct stat sb;
        !           683:        
        !           684:        do      
        !           685:        {       
        !           686:                dir = cdpath;   
        !           687:                cdpath = catpath(cdpath,place);
        !           688:                /* kludge: will call opendir, so must lock down the string */
        !           689:                movstr(curstak(), tempdir);
        !           690:                if (chdir(tempdir) < 0)
        !           691:                {
        !           692:                        char *dir1;
        !           693: 
        !           694:                        if (flags&ttyflg && (dir1=spname(tempdir, &score))
        !           695:                          && stat(dir1, &sb)==0
        !           696:                          && (sb.st_mode&S_IFMT)==S_IFDIR
        !           697:                          && access(dir1, 1)==0)
        !           698:                        {
        !           699:                                if (score < bestscore)
        !           700:                                {
        !           701:                                        movstr(dir1, bestplace);
        !           702:                                        bestscore = score;
        !           703:                                }
        !           704:                        }
        !           705:                }
        !           706:                else
        !           707:                {
        !           708:                        if (cf(nullstr, dir) && 
        !           709:                                *dir != ':' &&  
        !           710:                                any('/', tempdir) &&    
        !           711:                                flags & prompt) 
        !           712:                        {       
        !           713:                                prs_buff(tempdir);      
        !           714:                                prc_buff(NL);
        !           715:                        }
        !           716:                        return; 
        !           717:                }
        !           718:        } while (cdpath);
        !           719:        if (bestscore < 1000 && chdir(bestplace) >= 0) {
        !           720:                prs_buff(bestplace);    
        !           721:                prc_buff(NL);
        !           722:                return;
        !           723:        }
        !           724:        failed(place, baddir);
        !           725: }
        !           726: 
        !           727: execexp(s, f)
        !           728: char   *s;
        !           729: int    f;
        !           730: {
        !           731:        struct fileblk  fb;
        !           732: 
        !           733:        push(&fb);
        !           734:        if (s)
        !           735:        {
        !           736:                estabf(s);
        !           737:                fb.feval = (char **)(f);
        !           738:        }
        !           739:        else if (f >= 0)
        !           740:                initf(f);
        !           741:        execute(cmd(NL, NLFLG | MTFLG), 0, (int)(flags & errflg));
        !           742:        pop();
        !           743: }
        !           744: 
        !           745: execprint(com)
        !           746:        char **com;
        !           747: {
        !           748:        register int    argn = 0;
        !           749: 
        !           750:        prs(execpmsg);
        !           751:        
        !           752:        while(com[argn] != ENDARGS)
        !           753:        {
        !           754:                prs(quotedstring(com[argn++]));
        !           755:                blank();
        !           756:        }
        !           757: 
        !           758:        newline();
        !           759: }

unix.superglobalmegacorp.com

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