Annotation of researchv10no/cmd/udemon/udemon1.c, revision 1.1

1.1     ! root        1: #
        !             2: #define ERROR  0
        !             3: #define GOOD 1
        !             4: 
        !             5: /*
        !             6:  * fdemon tiu txt msiz [trace]
        !             7:  * file store demon to handle commands from (tiu).
        !             8:  * the txt arg is not used.
        !             9:  * The maximum message size sent to the user is (msiz).
        !            10:  * If (trace) is present the demon will trace on the specified file.
        !            11:  *     the current output is used if '-' is specified.
        !            12:  */
        !            13: #include <stdio.h>
        !            14: #include "udemon.h"
        !            15: 
        !            16: 
        !            17: char unixid[128];
        !            18: char   *uidp   &unixid;
        !            19: char nbuf[NSIZ] {
        !            20: };
        !            21: char *mkdir "/bin/mkdir";
        !            22: char *rmdir "/bin/rmdir";
        !            23: char *minishell "/bin/sh";
        !            24: char   *netpwd "/usr/lib/spidernet";
        !            25: int zero[2] {
        !            26:        0,0};
        !            27: 
        !            28: 
        !            29: 
        !            30: 
        !            31: int    *tp;
        !            32: int    parent;
        !            33: int    pid;
        !            34: char   *uniqs  "prXXXXXX";
        !            35: int    kk[50];
        !            36: #define CHILD  0
        !            37: #define INPUT  0
        !            38: #define OUTPUT 1
        !            39: #define RPIPE  0
        !            40: #define WPIPE  1
        !            41: main(argc,argv) 
        !            42: int    argc;
        !            43: char *argv[];
        !            44: {
        !            45:        int code;               /*status to/from tiu*/
        !            46:        int fil;                /*file code for active file*/
        !            47:        int     mode;
        !            48:        int rpfil[2], wpfil[2]; /*pipes for shell execution*/
        !            49:        int op;                 /*op code*/
        !            50:        char *cp, *ap;
        !            51:        int  k, n, s, t;
        !            52:        register i;
        !            53:        int     rlength,rsum;
        !            54:        int     nchar;
        !            55:        char *rbp;
        !            56:        char    *p;
        !            57: 
        !            58: 
        !            59:        signal(1,1); 
        !            60:        signal(2,1); 
        !            61:        signal(3,1);
        !            62:        if (argc == 4) 
        !            63:                trace = 0;
        !            64:        else
        !            65:         if (argc == 5){
        !            66:                trace = 1;
        !            67:                if (*argv[4] != '-'){
        !            68:                        close(OUTPUT); 
        !            69:                        close(INPUT);
        !            70:                        close(2);
        !            71:                        if (creat(argv[4],0666) < 0) {
        !            72:                                mesg("debug creat failed");
        !            73:                                exit(EGOOD);
        !            74:                        }
        !            75:                        dup(INPUT);
        !            76:                        dup(INPUT);
        !            77:                }
        !            78:        }else {
        !            79:                mesg("Incorrect number of arguments");
        !            80:                exit(EGOOD);
        !            81:        }
        !            82:        msiz = decimal(argv[3]);
        !            83:        prt("msiz = %d\n",msiz);
        !            84:        parent = 1;
        !            85: rstart:
        !            86:        prt("got to res");
        !            87:        panic = 0;
        !            88:        if ((fn = open(tiu = argv[1],2)) < 0) {
        !            89:                mesg("Can't open tiu channel");
        !            90:                exit(EGOOD);
        !            91:        }
        !            92:        snstat(fn,&chan,2); 
        !            93:        utmp.u_tty = chan + 'A';
        !            94:        for (i=0; i<OPENS; i++) 
        !            95:                openf[i] = 0;
        !            96:        rp = resp;
        !            97:        logout();
        !            98:        prt("logout done");
        !            99: trouble:
        !           100:        snstat(fn,&code,3);
        !           101:        prt("check trob code");
        !           102:        if (code) 
        !           103:                prt("trouble %d\n",code);
        !           104:        closeall();
        !           105:        setexit();
        !           106: nextmes:
        !           107:        prt("nextmes");
        !           108:        if (panic){
        !           109:                prt("nextmes panic\n");
        !           110:                closeall();
        !           111:                close(fn);
        !           112:                if(!parent)
        !           113:                        exit(EBAD);
        !           114:                goto rstart;
        !           115: 
        !           116:        }
        !           117:        prt("start recv");
        !           118:        if ((n=recv(mbuf,&code)) < 0) 
        !           119:                goto trouble;
        !           120:        prt("mesg received");
        !           121:        if (code != 3) 
        !           122:                error(ESIG,code);
        !           123:        if ((login == 0) && (filstat("/tmp/ulock",&statbuf) >= 0)) 
        !           124:                error(EUNAV,1);
        !           125:        mlast = &mbuf[n];
        !           126:        lp = mlink;
        !           127:        mp = mbuf;
        !           128:        sp = stack;
        !           129:        rp = resp;
        !           130:        ig = 0;
        !           131:        (sp++)->s_type = NULL;
        !           132:        prt("sp = %o %o\n",stack,sp);
        !           133:        if ((*mp <= '~') && (*mp >= '!')) 
        !           134:                goto escape;
        !           135: 
        !           136: nextcmd:
        !           137:        prt("next sp %o %o\n",sp,sp->s_type);
        !           138:        if ((lp == mlink) && (mp >= mlast)){
        !           139:                if (mp == mlast) 
        !           140:                        goto stop;
        !           141:                error(EEOM,1);
        !           142:        }
        !           143:        if (*mp > 0) 
        !           144:                goto data;
        !           145: 
        !           146:        if ((op = *mp++ & 0377) == 0) 
        !           147:                goto nextcmd;
        !           148:        prt("op = %o\n",op);
        !           149: 
        !           150:        if (ig){
        !           151:                if (op == EOM) 
        !           152:                        error(EEOM,2);
        !           153:                if ((op == FI) & (ig < 0)) ig = 0;
        !           154:                goto nextcmd;
        !           155: 
        !           156:        }
        !           157:        op =& 0177;
        !           158:        if (op >= OPNUM) 
        !           159:                error(EOP,1);
        !           160:        if ((login == 0) && (op != (LOGIN-128)) && (argspec[op][0] != 0))
        !           161:                error(ELOG,1);
        !           162:        asp = sp;
        !           163:        prt("for sp = %o %o\n",sp,sp->s_type);
        !           164:        for (i=0; i<3; i++){
        !           165:                s = argspec[op][i];
        !           166:                if (s==0) 
        !           167:                        break;
        !           168: la:
        !           169:                t = asp->s_type;
        !           170:                prt("la %o %o %o %o\n",s,t,asp,sp);
        !           171:                if (t==s) 
        !           172:                        goto cont;
        !           173: 
        !           174:                if ((t==NTYPE) || (t==WTYPE)){
        !           175:                        deref(asp);
        !           176:                        prt("deref %o\n",asp); 
        !           177:                        goto la;
        !           178: 
        !           179:                }
        !           180:                if (s < 0) 
        !           181:                        goto cont;
        !           182: 
        !           183:                prt("swit s = %o\n",s);
        !           184:                switch (s){
        !           185:                case XTYPE:
        !           186:                        if (t == IITYPE) 
        !           187:                                goto cont;
        !           188: 
        !           189:                case IITYPE:
        !           190:                        tp = zero; 
        !           191:                        break;
        !           192:                case RTYPE:
        !           193:                        if (wstore[1].s_type != RTYPE) 
        !           194:                                error(EARGT,2);
        !           195:                        tp = &wstore[1].s_val; 
        !           196:                        break;
        !           197:                case DTYPE:
        !           198:                        if (wstore[0].s_type != DTYPE) 
        !           199:                                error(EARGT,8);
        !           200:                        tp = &wstore[0].s_val; 
        !           201:                        break;
        !           202:                default:
        !           203:                        error(EARGT,1);
        !           204:                }
        !           205:                argpush(&asp);
        !           206:                prt("argpush %o %o\n",asp,sp);
        !           207:                asp->s_type = s;
        !           208:                asp->s_val = *tp++;
        !           209:                asp->s_val1 = *tp;
        !           210: prt("arg %o %o %o %o %o\n",asp->s_val,asp->s_val1,tp,zero);
        !           211: cont:
        !           212:                asp--;
        !           213:        }
        !           214:        switch(op+128){
        !           215:        case UNLESS:
        !           216:                if (dstat(ncopy(sp),&entry) >= 0) 
        !           217:                        ig = -1;
        !           218:        case FI:
        !           219:                prt("FI");
        !           220:                goto nextcmd;
        !           221: 
        !           222:        case IF:
        !           223:                prt("IF %o %o\n",sp,sp->s_type);
        !           224:                if (dstat(ncopy(sp),&entry) < 0){ 
        !           225:                        ig = -1;
        !           226:                        prt("IF ig = -1\n");
        !           227:                }
        !           228:                prt("end IF %o\n",sp->s_type);
        !           229:                goto nextcmd;
        !           230: 
        !           231:        case SKIP:
        !           232:                ig = ((sp--)->s_val1&0377) | 0400;
        !           233:                mp = lp->l_ms;
        !           234:                goto nextcmd;
        !           235: 
        !           236:        case EOM:
        !           237: stop:
        !           238:                if (respond(OK)) {
        !           239:                        prt("respond = 1\n");
        !           240:                        if(!parent){
        !           241:                                exit(EBAD);
        !           242:                        }
        !           243:                        goto trouble;
        !           244:                }
        !           245:                goto nextmes;
        !           246: 
        !           247:        case ASSIGN:
        !           248:                t = (sp--)->s_val1;
        !           249:                if ((t<0) || (t>=VARNO)) 
        !           250:                        error(EWADDR,1);
        !           251: assign:
        !           252:                asp = &wstore[t];
        !           253:                asp->s_type = sp->s_type;
        !           254:                asp->s_val = sp->s_val;
        !           255:                asp->s_val1 = sp->s_val1;
        !           256:                goto nextcmd;
        !           257: 
        !           258:        case FCREATE:
        !           259:                cp = ncopy(sp--);
        !           260:                asp = sp--;
        !           261:                if (asp->s_type == XTYPE) {
        !           262:                        asp->s_val1 = 0666;
        !           263: prt("made it 0666\n");
        !           264:                }
        !           265: prt("creat mode %o\n",asp->s_val1);
        !           266:                fil = creat(cp, asp->s_val1);
        !           267:                goto opn;
        !           268: 
        !           269:        case DCREATE:
        !           270:                cp = ncopy(sp--);
        !           271:                asp = sp--;
        !           272:                tp = mkdir;
        !           273:                if (dstat(cp,&entry) >= 0) 
        !           274:                        error(EEXIST,1);
        !           275: execute:
        !           276:        callsys(cp);
        !           277:                goto nextcmd;
        !           278: 
        !           279:        case REDEFINE:
        !           280:                t = 0; 
        !           281:                goto df;
        !           282: 
        !           283:        case DEFINE:
        !           284:                t = 1;
        !           285: df:
        !           286:                if (nodef[sp->s_type]==0) 
        !           287:                        error(EARGT,3);
        !           288:                asp = sp--;
        !           289:                if (sp->s_type != NTYPE) 
        !           290:                        error(EARGT,4);
        !           291:                ncopy(asp);
        !           292:                cp = ncopy(sp);
        !           293:                if (asp->s_type != FTYPE)
        !           294:                        unixid[1].d_type = asp->s_type | 0200;
        !           295:                if (dstat(cp, &entry) >= 0){
        !           296:                        if (t) 
        !           297:                                error(EEXIST,2);
        !           298:                        unlink(cp);
        !           299:                }
        !           300:                if (mklink(unixid,cp) < 0) 
        !           301:                        error(0,1);
        !           302:                goto nextcmd;
        !           303: 
        !           304:        case DELETE:
        !           305:                i = dcheck(sp);
        !           306:                prt("delete dcheck finished\n");
        !           307:                if (i == DTYPE) {
        !           308:                        tp = rmdir; 
        !           309:                        cp = ncopy(sp);
        !           310:                        goto execute;
        !           311:                }
        !           312:                if (i == ATYPE) 
        !           313:                        error(EISACC,1);
        !           314:                prt("delete copy %s\n",ncopy(sp));
        !           315:                cp = ncopy(sp--);
        !           316:                if (unlink(cp) < 0) 
        !           317:                        error(EUNDEF,1);
        !           318:                prt("delete unlink\n");
        !           319:                goto nextcmd;
        !           320: 
        !           321:        case OPEN:
        !           322:                prt("OP %o %o \n",*mp,READ);
        !           323:                if (sp->s_type == XTYPE) sp->s_val1 = 02;
        !           324:                asp = sp--;
        !           325: prt("OPEN %o \n",asp->s_val1);
        !           326:                if((*mp&0377) == READ){
        !           327:                        asp->s_val1 = 0;
        !           328:                }else
        !           329:                if((*mp&0377) == WRITE){
        !           330:                        asp->s_val1 = 1;
        !           331:                }else
        !           332:                        asp->s_val1 = 2;
        !           333:                fil = open(ncopy(sp),asp->s_val1);
        !           334: opn:
        !           335:                if (fil < 0) 
        !           336:                        error(0,2);
        !           337:                sp++;
        !           338:                sp->s_type = RTYPE;
        !           339:                sp->s_val = 0;
        !           340:                sp->s_val1 = fil;
        !           341:                openf[fil] = 1;
        !           342:                t = 1; 
        !           343:                goto assign;
        !           344: 
        !           345:        case CLOSE:
        !           346:                t = (sp--)->s_val1;
        !           347:                if (openf[t] == 0) 
        !           348:                        error(EFREF,1);
        !           349:                close(t);
        !           350:                goto nextcmd;
        !           351: 
        !           352: /*
        !           353:        case SEEK:
        !           354:                asp = sp--;
        !           355:                t = sp->s_val1;
        !           356:                if (openf[t] == 0) 
        !           357: error(EFREF,2);
        !           358:                seek(t,asp->s_val1,0);
        !           359:                seek(t,asp->s_val,7);
        !           360:                goto nextcmd;
        !           361: 
        !           362:        case APPEND:
        !           363:                t = sp->s_val1;
        !           364:                if (openf[t] == 0) 
        !           365: error(EFREF,7);
        !           366:                seek(t,0,2);
        !           367:                goto nextcmd;
        !           368: 
        !           369:        case TRUNCATE:
        !           370:                asp = sp--;
        !           371:                t = sp->s_val1;
        !           372:                if (openf[t] == 0) 
        !           373: error(EFREF,3);
        !           374:                if (asp->s_type != XTYPE){
        !           375:                        seek(t,asp->s_val1,0);
        !           376:                        seek(t,asp->s_val,7);
        !           377:                        }
        !           378:                trunc(t);
        !           379:                goto nextcmd;
        !           380: 
        !           381: */
        !           382:        case READ:
        !           383:                asp = sp--;
        !           384:                fil = sp->s_val1;
        !           385:                if (openf[fil] == 0) 
        !           386:                        error(EFREF,4);
        !           387:                k = (asp->s_type ==XTYPE) ? 0 : 1;
        !           388:                cp = asp->s_val1;
        !           389:                if (rcopy(fil,k,cp)) 
        !           390:                        goto trouble;
        !           391:                goto nextcmd;
        !           392: 
        !           393:        case WRITE:
        !           394:                asp = sp--;
        !           395:                fil = sp->s_val1;
        !           396:                if (openf[fil] == 0) 
        !           397:                        error(EFREF,5);
        !           398:                if (respond(WRITE)) 
        !           399:                        goto trouble;
        !           400: 
        !           401:                k = (asp->s_type == XTYPE) ? 0 : 1;
        !           402:                cp = asp->s_val1;
        !           403:                length = 0;
        !           404:                sum = 0;
        !           405:                i = 0;
        !           406:                for (;;){
        !           407:                        if ((n=recv(buf,&code)) < 0) 
        !           408:                                goto trouble;
        !           409: 
        !           410:                        length =+ n;
        !           411:                        sum =+ addup(buf,n);
        !           412:                        if (code==3) 
        !           413:                                error(ESIG,code);
        !           414:                        if (code > 4) 
        !           415:                                error(ESIG,code);
        !           416:                        if ((k) && (n>cp)) n=cp;
        !           417:                        if ((n!=0) && (i == 0))
        !           418:                                if (write(fil,buf,n) < 0)
        !           419:                                        i = 1;
        !           420:                        if (code > 1) 
        !           421:                                break;
        !           422:                        cp =- n;
        !           423:                }
        !           424:                if((nchar = recv(buf,&code)) < 0)
        !           425:                        prt("bad read\n");
        !           426:                if(code != 3)
        !           427:                        prt("Bad cheksum message\n");
        !           428:                prt("snstat after %o\n",code);
        !           429:                prt("code %o %o %o %o\n",sum,length,code,buf[0]);
        !           430:                rbp = buf;
        !           431:                rbp++;
        !           432:                rsum.hibyte = *rbp++;
        !           433:                rsum.lobyte = *rbp++;
        !           434:                rlength.hibyte = *rbp++;
        !           435:                rlength.lobyte = *rbp++;
        !           436:                prt("received %o %o %o %o\n",buf[1],buf[2],buf[3],buf[4]);
        !           437:                prt("%o %o\n",rsum,rlength);
        !           438:                if(sum != rsum){
        !           439:                        prt("Checksum error\n");
        !           440:                }
        !           441:                if(length != rlength){
        !           442:                        prt("Byte count error\n");
        !           443:                }
        !           444:                if (i) 
        !           445:                        error(0,3);
        !           446:                goto nextcmd;
        !           447: 
        !           448:        case XMT:
        !           449:                goto nextcmd;
        !           450: 
        !           451:        case CMODE:
        !           452:                k = (sp--)->s_val1;
        !           453:                t = (sp--)->s_val1;
        !           454:                cp = ncopy(sp);
        !           455:                if (filstat(cp,&statbuf) < 0) 
        !           456:                        error(EUNDEF,4);
        !           457:                k = (k & t) | (statbuf->mode & (~t));
        !           458:                if (chmod(cp,k) < 0) 
        !           459:                        error(0,10);
        !           460:                goto nextcmd;
        !           461: 
        !           462:        case STATUS:
        !           463:                prt("STAT %o %d\n",sp,sp->s_type);
        !           464:                switch(sp->s_type){
        !           465:                case RTYPE:
        !           466:                        fil = sp->s_val1;
        !           467:                        if (openf[fil] == 0) 
        !           468:                                error(EFREF,6);
        !           469:                        if (desstat(fil,&statbuf) < 0) 
        !           470:                                error(0,7);
        !           471:                        goto stdun;
        !           472: 
        !           473:                case NTYPE:
        !           474:                case FTYPE:
        !           475:                case DTYPE:
        !           476:                case ATYPE:
        !           477:                        if (filstat(ncopy(sp),&statbuf) < 0) 
        !           478:                                error(EUNDEF,3);
        !           479: stdun:
        !           480:                        *rp++ = STYPE;
        !           481:                        *rp++ = sp->s_type;
        !           482: prt("stat rp = %o\n",rp);
        !           483:                        rp =+ copy(rp,&statbuf,sizeof(us));
        !           484: prt("rp +34. = %o\n",rp);
        !           485:                        prt("STATUS to be sent %d\n",sp->s_type);
        !           486:                        goto nextcmd;
        !           487: 
        !           488:                default:
        !           489:                        error(EARGT,7);
        !           490:                }
        !           491:        case LIST:
        !           492:                asp = sp--;
        !           493:                prt("list  %o %o\n",asp->s_type,unixid);
        !           494:                prt("list %s %s %o\n",asp->s_val1,ncopy(asp),ncopy(asp));
        !           495:                if ((fil = open(ncopy(asp),0)) < 0) 
        !           496:                        error(0,8);
        !           497:                n = rcopy(fil,2,16);
        !           498:                close(fil);
        !           499:                if (n) 
        !           500:                        goto trouble;
        !           501: 
        !           502:                goto nextcmd;
        !           503: 
        !           504:        case POP:
        !           505:                sp--;
        !           506:                goto nextcmd;
        !           507: 
        !           508:        case CDIR:
        !           509:                if (chdir(ncopy(sp)) < 0) 
        !           510:                        error(0,4);
        !           511:                wstore[0].s_type = sp->s_type;
        !           512:                wstore[0].s_val = sp->s_val;
        !           513:                wstore[0].s_val1 = (sp--)->s_val1;
        !           514:                goto nextcmd;
        !           515: 
        !           516:        case LOGIN:
        !           517:                closeall();
        !           518:                if (getpwentry(sp->s_val1,buf)) 
        !           519:                        error(EPWD,1);
        !           520:                login = 1;
        !           521:                if(parent){
        !           522:                        parent = 0;
        !           523:                        if((pid = fork())!= -1){
        !           524:                                if(pid != CHILD){
        !           525:                                        parent = 1;
        !           526:                                        while(pid != wait(&status));
        !           527:                                        if(((status>>8)&0377) == EBAD)
        !           528:                                                prt("Daemon error\n");
        !           529:                                        logout();
        !           530:                                        goto nextmes;
        !           531:                                }else{
        !           532:                                        setuid(uid);
        !           533:                                }
        !           534:        
        !           535:                        }else{
        !           536:                                prt("Can't fork\n");
        !           537:                        }
        !           538:                }
        !           539:                goto stop;
        !           540: 
        !           541:        case QUIT:
        !           542:                closeall();
        !           543:                if(respond(OK))
        !           544:                        if(!parent){
        !           545:                                prt("going to exit\n");
        !           546:                                exit(EBAD);
        !           547:                        }
        !           548:                if(!parent){
        !           549:                        prt("going to exit - good\n");
        !           550:                        exit(EGOOD);
        !           551:                }
        !           552: 
        !           553:                logout();
        !           554:                goto nextmes;
        !           555:        case UNIQUE:
        !           556: prt("asp = %o\n",asp);
        !           557: /*
        !           558: */
        !           559: prt("asp = %o %o\n",asp,sp);
        !           560:                up = uniqb;
        !           561:                cp = ncopy(sp--);
        !           562:                asp = sp--;
        !           563:                if(asp->s_type == XTYPE){
        !           564:                        asp->s_val1 = 0666;
        !           565:                }
        !           566: prt("saved %s\n",cp);
        !           567:                up =+ copy(uniqb,cp,size(cp));
        !           568: prt("copied %s\n",uniqb);
        !           569:                *up++ = '/';
        !           570:                copy(up,uniqs,size(uniqs));
        !           571:                prt("unique name %s\n",uniqb);
        !           572:                up = mktemp(uniqb);
        !           573:        prt("mktmp name %s\n",up);
        !           574:                *rp++ = UNIQUE;
        !           575:                rp =+ copy(rp,uniqb,size(uniqb));
        !           576:                *rp++ = '\0';
        !           577: prt("resp name %s\n",resp);
        !           578:                close(creat(up,asp->s_val1));
        !           579:                fil = open(up,2);
        !           580:                goto opn;
        !           581:        default:
        !           582:                error(EOP,2);
        !           583:        }
        !           584: data:
        !           585:        prt("data %d\n",ig);
        !           586:        if (ig){
        !           587:                switch (*mp++){
        !           588:                case LTYPE:
        !           589:                        if (((*mp++ & 0377) + 0400) == ig) 
        !           590:                                ig = 0;
        !           591:                        goto nextcmd;
        !           592: 
        !           593:                case NTYPE:
        !           594:                        while (*mp++);
        !           595:                        goto nextcmd;
        !           596: 
        !           597:                default:
        !           598:                        mp =+ 2;
        !           599:                case ITYPE:
        !           600:                case WTYPE:
        !           601:                case RTYPE:
        !           602:                        mp =+ 2;
        !           603:                        goto nextcmd;
        !           604: 
        !           605:                }
        !           606:        }
        !           607:        sp++;
        !           608:        sp->s_type = *mp++;
        !           609:        prt("data2 %o %o %o\n",sp,sp->s_type,*mp);
        !           610:        switch (sp->s_type){
        !           611:        case NTYPE:
        !           612:                sp->s_val1 = mp;
        !           613:                if (*mp == 0) 
        !           614:                        error(EARGT,9);
        !           615:                while (*mp++);
        !           616:                prt("NTYPE %o\n",sp->s_type);
        !           617:                goto nextcmd;
        !           618: 
        !           619:        case ITYPE:
        !           620:                sp->s_type = IITYPE;
        !           621:        case WTYPE:
        !           622: prt("mp = %o\n",mp);
        !           623:                mp =+ copy(&sp->s_val1,mp,2);
        !           624: prt("mp = %o\n",mp);
        !           625:                sp->s_val = (sp->s_val1 < 0) ? -1 : 0;
        !           626:                goto nextcmd;
        !           627: 
        !           628:        case RTYPE:
        !           629:                error(EARGT,5);
        !           630:        case LTYPE:
        !           631:                sp--;
        !           632:                mp++;
        !           633:                goto nextcmd;
        !           634: 
        !           635:        case ETYPE:
        !           636:                sp--;
        !           637:                mp =+ 2;
        !           638:                error(*mp++, *mp++);
        !           639:        }
        !           640:        mp =+ copy(&sp->s_val,mp,4);
        !           641:        goto nextcmd;
        !           642: 
        !           643: escape:
        !           644:        if (login == 0) 
        !           645:                error(ELOG, 2);
        !           646:        if ((pipe(rpfil) < 0) || (pipe(wpfil) < 0))
        !           647:                error(0,11);
        !           648:        mbuf[n++] = '\n';
        !           649:        write(rpfil[WPIPE],mbuf,n);
        !           650:        close(rpfil[WPIPE]);
        !           651:        while((i = fork()) == -1) 
        !           652:                sleep(1);
        !           653:        if (i == CHILD){
        !           654:                if (rpfil[RPIPE] != 0) {
        !           655:                        close(INPUT); 
        !           656:                        dup(rpfil[RPIPE]);
        !           657:                }
        !           658:                if (wpfil[WPIPE] != 1) {
        !           659:                        close(OUTPUT); 
        !           660:                        dup(wpfil[WPIPE]);
        !           661:                }
        !           662:                for (i=2; i<15; i++) 
        !           663:                        close(i);
        !           664:                dup(OUTPUT);
        !           665:                execl(minishell,minishell,"-t",0);
        !           666:                mesg("Can't execute shell");
        !           667:                exit(EBAD);
        !           668:        }
        !           669:        close(wpfil[WPIPE]); 
        !           670:        close(rpfil[RPIPE]);
        !           671: /*
        !           672:        if(desstat(wpfil[RPIPE],kk) < 0){
        !           673:                prt("stat failed of pipe file\n");
        !           674:        }else{
        !           675:                prt("stat %o %o %o\n",kk[0],kk[1],kk[5]);
        !           676:        }
        !           677: */
        !           678:        if (n = rcopy(wpfil[RPIPE],-1,0)){
        !           679:                kill(i,9);
        !           680:        }
        !           681:        while(wait(&status) != i);
        !           682:        close(wpfil[RPIPE]);
        !           683:        if (n) 
        !           684:                goto trouble; 
        !           685:        else
        !           686:                 goto stop;
        !           687: 
        !           688: }
        !           689: mklink(p,q)
        !           690: char   *p,*q;
        !           691: {
        !           692:        return(link(p,q));
        !           693: }
        !           694: callsys(cp)
        !           695: char   *cp;
        !           696: {
        !           697:        register i;
        !           698: 
        !           699:                while ((i=fork()) == -1) 
        !           700:                        sleep(1);
        !           701:                if (i==CHILD){
        !           702:                        for (i=0; i<15; i++) close(i);
        !           703:                        execl(tp,tp,cp,0);
        !           704:                        execl(&tp[4],&tp[4],cp,0);
        !           705:                        mesg("Can't exec");
        !           706:                        mesg(cp);
        !           707:                        exit(EBAD);
        !           708:                }
        !           709:                while (i != wait(&pstat));
        !           710:                if (pstat.w_stat == EBAD) 
        !           711:                        error(EFAIL,1);
        !           712: }

unix.superglobalmegacorp.com

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