Annotation of researchv10no/cmd/udemon/udemon1.c, revision 1.1.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.