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

1.1     ! root        1: #
        !             2: 
        !             3: #include <stdio.h>
        !             4: #include "udemon.h"
        !             5: 
        !             6: char argspec[OPNUM][3]         /* required arg types (reverse order) */
        !             7: {                      /* negative entry = any non-name type */
        !             8:        0, 0, 0,                /*OK*/
        !             9:        -1, NTYPE, 0,           /*DEFINE*/
        !            10:        -1, NTYPE, 0,           /*REDEFINE*/
        !            11:        NTYPE, 0, 0,            /*DELETE*/
        !            12:        0, 0, 0,                /*spare*/
        !            13:        0, 0, 0,                /*EOM*/
        !            14:        0, 0, 0,                /*unu   gd*/
        !            15:        0, 0, 0,                /*XMT*/
        !            16:        0, 0, 0,                /*spare*/
        !            17:        0, 0, 0,                /*POP*/
        !            18:        DTYPE, 0, 0,            /*CDIR*/
        !            19:        IITYPE, IITYPE, FTYPE,  /*CMODE*/
        !            20:        XTYPE, FTYPE, 0,        /*OPEN*/
        !            21:        RTYPE, 0, 0,            /*CLOSE*/
        !            22:        IITYPE, RTYPE, 0,       /*SEEK*/
        !            23:        XTYPE, RTYPE, 0,        /*READ*/
        !            24:        XTYPE, RTYPE, 0,        /*WRITE*/
        !            25:        XTYPE, RTYPE, 0,        /*TRUNCATE*/
        !            26:        NTYPE, 0, 0,            /*LOGIN*/
        !            27:        0, 0, 0,                /*QUIT*/
        !            28:        DTYPE, 0, 0,            /*LIST*/
        !            29:        -1, 0, 0,               /*STATUS*/
        !            30:        0, 0, 0,                /*TIME*/
        !            31:        NTYPE, XTYPE, 0,                /*UNIQUE*/
        !            32:        RTYPE, 0, 0,            /*APPEND*/
        !            33:        0, 0, 0,                /*spare*/
        !            34:        WTYPE, -1, 0,           /*ASSIGN*/
        !            35:        NTYPE, XTYPE, 0,        /*FCREATE*/
        !            36:        NTYPE, 0, 0,            /*IF*/
        !            37:        0, 0, 0,                /*FI*/
        !            38:        IITYPE, 0, 0,           /*SKIP*/
        !            39:        NTYPE, XTYPE, 0,        /*DCREATE*/
        !            40:        0, 0, 0,                /*spare*/
        !            41:        NTYPE, 0, 0             /*UNLESS*/
        !            42: };
        !            43: 
        !            44: char nodef[MAXTYPE] {          /*non-zero if type can be used in definition*/
        !            45:        0, 0, 0, 0, 0, 0, 0, 0,
        !            46:        1, 1, 1, 0, 0, 0, 0, 0};
        !            47: 
        !            48: 
        !            49: 
        !            50: deref(xsp)
        !            51: struct sentry *xsp;
        !            52: {
        !            53:        register i, r;
        !            54:        switch (xsp->s_type){
        !            55:        case NTYPE:
        !            56:                if (dstat(ncopy(xsp),&entry) < 0) 
        !            57:                        error(EUNDEF,2);
        !            58:                xsp->s_type = dcheck(xsp);
        !            59:                prt("deref ret %o\n",xsp->s_type);
        !            60:                break;
        !            61:        case WTYPE:
        !            62:                i = xsp->s_val1;
        !            63:                if ((i < 0) || (i >= VARNO)) 
        !            64:                        error(EWADDR,2);
        !            65:                xsp->s_type = wstore[i].s_type;
        !            66:                xsp->s_val = wstore[i].s_val;
        !            67:                xsp->s_val1 = wstore[i].s_val1;
        !            68:                break;
        !            69:        case NULL:
        !            70:                error(EARGT,6);
        !            71:        }
        !            72: }
        !            73: 
        !            74: 
        !            75: argpush(xsp)
        !            76: struct sentry **xsp;
        !            77: {
        !            78:        register struct sentry *pp, *ss;
        !            79: 
        !            80:        ss = sp++;
        !            81:        pp = sp;
        !            82:        while (ss != *xsp){
        !            83:                pp->s_type = ss->s_type;
        !            84:                pp->s_val = ss->s_val;
        !            85:                (pp--)->s_val1 = (ss--)->s_val1;
        !            86:        }
        !            87:        *xsp = pp;
        !            88: }
        !            89: 
        !            90: 
        !            91: 
        !            92: respond(t)
        !            93: char t;
        !            94: {
        !            95:        if (t) *rp++ = t;
        !            96:        if (send(resp,rp-resp,3)) 
        !            97:                return(1);
        !            98:        rp = resp;
        !            99:        return(0);
        !           100: }
        !           101: 
        !           102: 
        !           103: 
        !           104: addup(b,n)
        !           105: int n; 
        !           106: char *b;
        !           107: {
        !           108:        register k,s; 
        !           109:        register char *p;
        !           110: 
        !           111:        s=0;
        !           112:        p = b;
        !           113:        if (n>0){
        !           114:                for (k=0; k<n; k++)
        !           115:                         s =+ p[k];
        !           116:        }
        !           117:        return(s);
        !           118: }
        !           119: 
        !           120: 
        !           121: send(p,n,c)
        !           122: char *p; 
        !           123: int n,c;
        !           124: {
        !           125:        extern timeout();
        !           126:        register r;
        !           127: 
        !           128:        if (c==3) {
        !           129:                prt("send "); 
        !           130:                tprint(p,n);
        !           131:        }else
        !           132:            prt("send data %d,%d\n",n,c);
        !           133:        signal(14,timeout); 
        !           134:        alarm(30);
        !           135:        snstat(fn,&c,0);
        !           136:        r = write(fn,p,n);
        !           137:        alarm(0);
        !           138:        if (r < 0 || panic) 
        !           139:                return(1);
        !           140:        return(0);
        !           141: }
        !           142: 
        !           143: 
        !           144: timeout()
        !           145: {
        !           146:        prt("timeout\n");
        !           147:        panic = 1;
        !           148: }
        !           149: 
        !           150: 
        !           151: recv(b,c)
        !           152: int *c; 
        !           153: char *b;
        !           154: {
        !           155:        register n;
        !           156:        register i;
        !           157:        if ((n = read(fn,b,512)) < 0) 
        !           158:                return(-1);
        !           159:        snstat(fn,c,1);
        !           160:        if (*c==3) {
        !           161:                prt("received "); 
        !           162:                tprint(b,n);
        !           163:        }else
        !           164:            prt("received data %d,%d\n",n,*c);
        !           165:        if (trace){
        !           166: /*
        !           167:                for (i=0; i<n; i++){
        !           168:                        printf("%3.1o ",b[i]&0377);
        !           169:                        if ((i&7) == 7 || i == (n-1))
        !           170:                                printf("\n");
        !           171:                }
        !           172: */
        !           173:        }
        !           174:        return(n);
        !           175: }
        !           176: 
        !           177: 
        !           178: 
        !           179: closeall(){
        !           180:        register i;
        !           181: 
        !           182:        for (i=0; i<OPENS; i++)
        !           183:                if (openf[i]) {
        !           184:                        close(i); 
        !           185:                        openf[i] = 0;
        !           186:                }
        !           187:        for (i=0; i<VARNO; i++)
        !           188:                wstore[i].s_type = 0;
        !           189: }
        !           190: 
        !           191: 
        !           192: logout()
        !           193: {
        !           194:        register g,t;
        !           195:        static struct utmp z;
        !           196:        long    l;
        !           197: 
        !           198:        login = 0;
        !           199:        utmp.u_name[0] = 0;
        !           200: #ifdef ACCT
        !           201:        if ((g = open("/tmp/utmp",1)) >= 0){
        !           202:                t = utmp.u_tty;
        !           203:                if(t >= 'a')
        !           204:                        t =- 'a' - (10+'0');
        !           205:                if((t >= 'A')&&(t<= 'Z'))
        !           206:                        t = 10 + 'z' - 'a' + 1 + '0' + (t - 'A');
        !           207:                l = (t-'0')*16;
        !           208:                seek(g, l, 0);
        !           209:                if(write(g,&utmp,16)<0){
        !           210:                        prt("write in utmp failed\n");
        !           211:                }
        !           212:                close(g);
        !           213:        }
        !           214:        if((g = open("/usr/adm/wtmp",1)) >= 0){
        !           215:                z.u_tty = utmp.u_tty;
        !           216:                time(&z.u_time[0]);
        !           217:                seek(g,0L,2);
        !           218:                write(g,&z,16);
        !           219:                close(g);
        !           220:        }
        !           221: #endif
        !           222: }
        !           223: 
        !           224: 
        !           225: /*
        !           226:  *  data from (fil) , block size (cp).
        !           227:  * k = 0 if (cp) not set, = 1 normal, = 2 if directory entry
        !           228:  */
        !           229: 
        !           230: rcopy(fil,k,cp) 
        !           231: {
        !           232:        register n, code;
        !           233:        long    tell();
        !           234:        register char *bp;
        !           235: 
        !           236:        if (respond(READ)) return(1);
        !           237:        length = 0;
        !           238:        sum = 0;
        !           239:        for (;;){
        !           240:                n = ((k>0)&&(cp<msiz)) ? cp : msiz;
        !           241:                if(trace)
        !           242:                        printf("com %d %d %d %d\n",n,k,cp,msiz);
        !           243:                if(trace)
        !           244:                        printf("posit %d %O\n",fil,tell(fil));
        !           245:                n = read(fil,buf,n);
        !           246:                if(trace)
        !           247:                        printf("read %o %o %o\n",fil,buf,n);
        !           248:                if(trace&&((n == 0) || (n<0))){
        !           249:                        perror("read");
        !           250:                        printf("n = %d %d %d\n",fil,n,k);
        !           251:                }
        !           252:                if (n < 0) 
        !           253:                        error(0,6);
        !           254:                if (k == 2){
        !           255:                        if (n != cp) {
        !           256:                                n=0; 
        !           257:                                code = 4;
        !           258:                        }else
        !           259:                        if (buf[0] == 0) 
        !           260:                                continue;
        !           261:                        else{
        !           262:                                code = 1;
        !           263:                        }
        !           264:                }else
        !           265:                        if (k>0){
        !           266:                                cp =- n;
        !           267:                                code = (cp==0) ? 2 : ((n==msiz) ? 1 : 4);
        !           268:                        }else
        !           269:                                if (k<0) code = (n==0) ? 4 : 1;
        !           270:                                else
        !           271:                                        code = (n==msiz) ? 1 : 4;
        !           272:                length =+ n;
        !           273:                sum =+ addup(buf,n);
        !           274:                prt("part sum %o %o\n",sum , n);
        !           275:                if (send(buf,n,code)) 
        !           276:                        return(1);
        !           277:                if (code > 1) 
        !           278:                        break;
        !           279:        }
        !           280:        bp = buf;
        !           281:        *bp++ = 'K';
        !           282:        *bp++ = (sum >> 8); *bp++ = (sum &0377);
        !           283:        *bp++ = (length >> 8); *bp++ = (length&0377);
        !           284:        prt("send checksum %o %o\n",sum, length);
        !           285:        if(send(buf,5,3) < 0)
        !           286:                return(1);
        !           287:        prt("checksum ok\n");
        !           288:        return(0);
        !           289: }
        !           290: 
        !           291: ncopy(p)
        !           292: struct sentry *p;
        !           293: {
        !           294:        register i;
        !           295:        register char *np;
        !           296: 
        !           297:        prt("ncopy %o\n",p->s_type);
        !           298:        if (p->s_type == NTYPE){
        !           299:                np = p->s_val1;
        !           300:                prt("Ntype %s\n",np);
        !           301:                for (i=0; i<(NSIZ-1); i++){
        !           302:                        if (*np == 0) break;
        !           303:                        nbuf[i] = *np++;
        !           304:                }
        !           305:                nbuf[i] = 0;
        !           306:                return(nbuf);
        !           307:        }
        !           308:        prt("ncopy ret %o\n",p->s_val1);
        !           309:        return(p->s_val1);
        !           310: }
        !           311: 
        !           312: 
        !           313: decimal(v)
        !           314: char *v;
        !           315: {
        !           316:        register n, negative;
        !           317:        char c;
        !           318: 
        !           319:        n=0; 
        !           320:        negative=0;
        !           321:        while (c = *v++){
        !           322:                if ((n==0) && (c=='-')) {
        !           323:                        negative=1; 
        !           324:                        continue;
        !           325:                }
        !           326:                if ((c < '0') || (c > '9')) {
        !           327:                        mesg("Bad buffer size");
        !           328:                        exit(EBAD);
        !           329:                }
        !           330:                n = (n*10) + (c-'0');
        !           331:        }
        !           332:        if (negative) 
        !           333:                n = -n;
        !           334:        return(n);
        !           335: }
        !           336: 
        !           337: 
        !           338: dcheck(p){
        !           339:        register i;
        !           340: 
        !           341:        prt("dcheck on %s\n",ncopy(p));
        !           342:        if (filstat(ncopy(p),&statbuf) < 0) 
        !           343:                return(NULL);
        !           344:        if (statbuf->type == FFILE) 
        !           345:                return(FTYPE);
        !           346:        if (statbuf->type == DIR) 
        !           347:                return(DTYPE);
        !           348:        return(NULL);
        !           349: }
        !           350: char   pbuf[128];
        !           351: getpwentry(uname)
        !           352: char *uname;
        !           353: {
        !           354:        char    *np,*namep;
        !           355:        extern char *copy();
        !           356:        int     t,f;
        !           357:        long    l;
        !           358:        int     i;
        !           359: 
        !           360:        utmp.u_tty = 'A' + chan;
        !           361:        if(getent(uname,pbuf))
        !           362:                return(1);
        !           363:        np = colon(pbuf);
        !           364: #ifdef ROOT
        !           365:        if(*np != ':')
        !           366:                return(1);
        !           367: #endif
        !           368:        for(i=0;i<8;i++)
        !           369:                utmp.u_name[i] = 0;
        !           370:        copy(utmp.u_name,pbuf,t = (size(pbuf)>8)?8:size(pbuf));
        !           371:        np = colon(np);
        !           372:        uid = 0;
        !           373:        while (*np != ':')
        !           374:                uid = uid*10 + *np++ - '0';
        !           375: #ifndef ROOT
        !           376:        if(uid == ROOTUSR)              /* disallow root */
        !           377:                return(1);      /* */
        !           378: #endif
        !           379:        np++;
        !           380:        np = colon(np);         /* skip group id */
        !           381:        np = colon(np);
        !           382:        namep = np;
        !           383:        np = colon(np);
        !           384:        prt("dir = %s\n",namep);
        !           385:        copy(unixid,namep,  t = (size(namep)>8)?8:size(namep));
        !           386:        if (chdir(namep)<0) {
        !           387:                error(0,9);
        !           388:        }
        !           389:        time(&utmp.u_time[0]);
        !           390: #ifdef ACCT
        !           391:        if ((f = open("/tmp/utmp", 1)) >= 0) {
        !           392:                t = utmp.u_tty;
        !           393:                if (t>='a')
        !           394:                        t =- 'a' - (10+'0');
        !           395:                if((t >= 'A')&&(t<= 'Z'))
        !           396:                        t = 10 + 'z' - 'a' + 1 + '0' + (t - 'A');
        !           397:                l = (t-'0')*16;
        !           398:                seek(f, l, 0);
        !           399:                write(f, &utmp, 16);
        !           400:                close(f);
        !           401:        }
        !           402:        if ((f = open("/usr/adm/wtmp", 1)) >= 0) {
        !           403:                seek(f, 0L, 2);
        !           404:                write(f, &utmp, 16);
        !           405:                close(f);
        !           406:        }
        !           407: #endif
        !           408:        return(0);
        !           409: }
        !           410: char   ab[BUFSIZ];
        !           411: getent(name, rbuf)
        !           412: char *name, *rbuf;
        !           413: {
        !           414:        int fi, r, c;
        !           415:        FILE *ffin;
        !           416:        register char *gnp, *rnp;
        !           417: 
        !           418:        r = 1;
        !           419:        if((ffin = fopen(netpwd, "r")) == NULL){
        !           420:                prt("Can't open passwd");
        !           421:                goto ret;
        !           422: 
        !           423:        }
        !           424:        setbuf(ffin,&ab);
        !           425: loop:
        !           426:        gnp = name;
        !           427:        rnp = rbuf;
        !           428:        while((c=getc(ffin)) != '\n') {
        !           429:                if(c == EOF)
        !           430:                        goto ret;
        !           431: 
        !           432:                *rnp++ = c;
        !           433:        }
        !           434:        *rnp++ = '\0';
        !           435:        rnp = rbuf;
        !           436:        while (*gnp++ == *rnp++);
        !           437:        if ((*--gnp!='\0')  || *--rnp!=':')
        !           438:                goto loop;
        !           439: 
        !           440:        r = 0;
        !           441: ret:
        !           442:        fclose(ffin);
        !           443:        return(r);
        !           444: }
        !           445: 
        !           446: colon(p)
        !           447: register char *p;
        !           448: {
        !           449: 
        !           450:        while (*p != ':') {
        !           451:                if (*p++ == '\0') {
        !           452:                        error(EPWD,2);
        !           453:                }
        !           454:        }
        !           455:        *p++ = '\0';
        !           456:        return(p);
        !           457: }
        !           458: dstat(p,bp)
        !           459: struct dentry  *bp;
        !           460: char   *p;
        !           461: {
        !           462:        int     f;
        !           463: 
        !           464:        prt("dstat on %s\n",p);
        !           465:        bp->d_type = NULL;
        !           466:        if((f = open(p,0)) < 0)
        !           467:                return(-1);
        !           468:        close(f);
        !           469:        bp->d_type = NTYPE;
        !           470:        return(1);
        !           471: }
        !           472: /*
        !           473:  * Copy c characters of q into p
        !           474:  */
        !           475: char *copy(p,q,c)
        !           476: register char  *p,*q;
        !           477: int    c;
        !           478: {
        !           479:        register i;
        !           480: 
        !           481:        for(i=0;i<c;i++){
        !           482:                *p++ = *q++;
        !           483:        }
        !           484:        return(c);
        !           485: }
        !           486: /*
        !           487:  * Length of string
        !           488:  */
        !           489: size(s)
        !           490: register char *s;
        !           491: {
        !           492:        register i;
        !           493: 
        !           494:        i = 0;
        !           495:        while(*s++ != '\0')
        !           496:                i++;
        !           497:        return(i);
        !           498: }

unix.superglobalmegacorp.com

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