Annotation of researchv9/netb/src/input.c, revision 1.1

1.1     ! root        1: #include "share.h"
        !             2: #include "signal.h"
        !             3: /* this is the main server routine.  All the real work is in work.c, but
        !             4:  * the messages are built here, and converted from the client's types */
        !             5: 
        !             6: struct client client;
        !             7: unsigned char *inbuf, *nmbuf;
        !             8: int inlen, hisdev, proto, iamroot;
        !             9: int clienttype;
        !            10: extern char *cmdname[];
        !            11: 
        !            12: server(len)
        !            13: {      int i, n;
        !            14:        inbuf = (unsigned char *) malloc(inlen = len);
        !            15:        nmbuf = (unsigned char *) malloc(inlen);
        !            16:        error("max msg %d bytes\n", len);
        !            17:        iamroot = getuid() == 0;
        !            18:        getexcepts();   /* read the exception table */
        !            19:        getuids();
        !            20:        getgids();
        !            21:        doneexcepts();
        !            22:        /* put the root into files[] */
        !            23:        addroot();
        !            24:        signals();
        !            25: loop:
        !            26:        switch(proto) {
        !            27:        default:
        !            28:                fatal("unk protocol %d |%c|\n", proto, proto);
        !            29:        case 'd':       /* datakit, so messages */
        !            30:                n = read(cfd, inbuf, inlen);
        !            31:                if(n < 16)      /* header is known to be 16 bytes long */
        !            32:                        fatal("server read %d (<16)\n", n);
        !            33:                if(inbuf[0] != NETB)
        !            34:                        fatal("server wanted version %d, got %d\n", NETB, inbuf[0]);
        !            35:                break;
        !            36:        case 't':       /* tcp, wretched byte stream */
        !            37:                n = tcpread();
        !            38:                break;
        !            39:        }
        !            40:        /* now convert the damned structures */
        !            41:        debug("server %d bytes for %s (%d)\n", n, cmdname[inbuf[1]], inbuf[1]);
        !            42:        fromclient(n);
        !            43:        goto loop;
        !            44: }
        !            45: 
        !            46: gotsig(n)
        !            47: {
        !            48:        error("exiting on signal %d\n", n);
        !            49:        abort();
        !            50:        exit(1);
        !            51: }
        !            52: 
        !            53: signals()
        !            54: {      int i;
        !            55:        for(i = 1; i < NSIG; i++)
        !            56:                signal(i, gotsig);
        !            57: }
        !            58: 
        !            59: tcpread()
        !            60: {      unsigned char *p;
        !            61:        int cnt, n, len;
        !            62:        p = inbuf;
        !            63:        /* first read a sendb struct, which is known to be 16 bytes long */
        !            64:        cnt = 0;
        !            65: moreheader:
        !            66:        n = read(cfd, p, inlen);
        !            67:        if(n < 0)
        !            68:                fatal("tcpread -1 (%d)\n", errno);
        !            69:        if(n == 0)
        !            70:                fatal("tcp first read 0\n");
        !            71:        p += n;
        !            72:        cnt += n;
        !            73:        if(cnt < 16)
        !            74:        goto moreheader;
        !            75:        /* the first byte must be NETB */
        !            76:        if(inbuf[0] != NETB)
        !            77:                fatal("tcp read version %d, not %d\n", inbuf[0], NETB);
        !            78:        len = clientlong(inbuf + 8);    /* server knows where len is in header */
        !            79:        if(cnt > len)
        !            80:                fatal("tcp read %d (>%d)\n", cnt, len);
        !            81: more:
        !            82:        if(cnt >= len)
        !            83:                return(cnt);
        !            84:        n = read(cfd, p, len - cnt);
        !            85:        if(n <= 0)
        !            86:                fatal("tcp read loop %d after %d (%d)\n", n, cnt, errno);
        !            87:        cnt += n;
        !            88:        p += n;
        !            89:        goto more;
        !            90: }
        !            91: 
        !            92: struct client nilclient;
        !            93: /* knows what clients send.  when they're not all vaxes, change this */
        !            94: fromclient(len)
        !            95: {      unsigned char *p = inbuf;
        !            96:        client = nilclient;     /* can you remember who sets what? */
        !            97:        /* first the struct sendb */
        !            98:        p++;    /* skip version */
        !            99:        client.cmd = *p++;
        !           100:        client.flags = *p++;
        !           101:        p++;    /* skip */
        !           102:        client.trannum = clientlong(p);
        !           103:        p += 4;
        !           104:        client.len = clientlong(p);
        !           105:        p += 4;
        !           106:        client.tag = clientlong(p);
        !           107:        p += 4;
        !           108:        if(client.len != len)
        !           109:                fatal("client sent %d, claimed len was %d\n", len, client.len);
        !           110:        if(client.tag == 0) {
        !           111:                error("client sent tag 0 (cmd %d)\n", client.cmd);
        !           112:                client.errno = ENOENT;
        !           113:                goto respond;
        !           114:        }
        !           115:        /* now per individual requirement */
        !           116:        switch(client.cmd) {
        !           117:        default:
        !           118:                fatal("client send unknown command %d %d\n", client.cmd, inbuf[1]);
        !           119:        case NBPUT:
        !           120:                if(len != p - inbuf)
        !           121:                        fatal("client put size, %d (!= %d)\n", len, p - inbuf);
        !           122:                doput();
        !           123:                break;
        !           124:        case NBUPD:
        !           125:                p += 4; /* skip */
        !           126:                client.uid = clientshort(p);
        !           127:                p += 2;
        !           128:                client.gid = clientshort(p);
        !           129:                p += 2;
        !           130:                client.mode = clientshort(p);
        !           131:                p += 2;
        !           132:                client.dev = clientshort(p);
        !           133:                p += 2;
        !           134:                p += 4; /* skip */
        !           135:                client.ta = clientlong(p);
        !           136:                p += 4;
        !           137:                client.tm = clientlong(p);
        !           138:                p += 4;
        !           139:                if(len != p - inbuf)
        !           140:                        fatal("client upd size, %d (!= %d)\n", len, p - inbuf);
        !           141:                doupdate();
        !           142:                break;
        !           143:        case NBREAD:
        !           144:                client.count = clientlong(p);   /* sanity check in doread() */
        !           145:                p += 4;
        !           146:                client.offset = clientlong(p);
        !           147:                p += 4;
        !           148:                if(len != p - inbuf)
        !           149:                        fatal("client read size, %d (!= %d)\n", len, p - inbuf);
        !           150:                doread();
        !           151:                break;
        !           152:        case NBWRT:
        !           153:                client.count = clientlong(p);   /* sanity check in dowrite() */
        !           154:                p += 4;
        !           155:                client.offset = clientlong(p);
        !           156:                p += 4;
        !           157:                if(len != p - inbuf + client.count)
        !           158:                        fatal("client write size, %d (!= %d)\n", len, p - inbuf + client.count);
        !           159:                dowrite(p);
        !           160:                break;
        !           161:        case NBNAMI:
        !           162:                p += 4; /* skip */
        !           163:                client.uid = clientshort(p);
        !           164:                p += 2;
        !           165:                client.gid = clientshort(p);
        !           166:                p += 2;
        !           167:                client.mode = clientshort(p);
        !           168:                p += 2;
        !           169:                client.dev = clientshort(p);
        !           170:                p += 2;
        !           171:                client.ino = clientlong(p);
        !           172:                p += 4;
        !           173:                donami(p, len - (p - inbuf));
        !           174:                break;
        !           175:        case NBSTAT:
        !           176:                client.ta = clientlong(p);
        !           177:                p += 4;
        !           178:                p += 4; /* skip */
        !           179:                if(len != p - inbuf)
        !           180:                        fatal("client stat too long, %d (> %d)\n", len, p - inbuf);
        !           181:                dostat();
        !           182:                break;
        !           183:        case NBTRNC:
        !           184:                if(len != p - inbuf)
        !           185:                        fatal("client trunc too long, %d (> %d)\n", len, p - inbuf);
        !           186:                dotrunc();
        !           187:                break;
        !           188:        }
        !           189: respond:       
        !           190:        responce(client.cmd);
        !           191: }
        !           192: #ifdef ns32000
        !           193: #define vax 1
        !           194: #endif
        !           195: #if vax == 1
        !           196: /* clients to vax */
        !           197: clientlong(p)
        !           198: unsigned char *p;
        !           199: {
        !           200:        switch (clienttype) {
        !           201:                case 'v':
        !           202:                        return(*(long *)p);
        !           203:                case 's':
        !           204:                        return(rev4(p));
        !           205:        }
        !           206: }
        !           207: 
        !           208: clientshort(p)
        !           209: unsigned char *p;
        !           210: {
        !           211:        switch (clienttype) {
        !           212:                case 'v':
        !           213:                        return(*(short *)p);
        !           214:                case 's':
        !           215:                        return(rev2(p));
        !           216:        }
        !           217: }
        !           218: #endif
        !           219: #if cray == 1
        !           220: /* client to cray */
        !           221: clientlong(p)
        !           222: unsigned char *p;
        !           223: {      union {
        !           224:                int x;
        !           225:                unsigned char b[8];
        !           226:        } u;
        !           227:        int i;
        !           228:        u.x = 0;
        !           229:        switch (clienttype) {
        !           230:                case 'v':
        !           231:                        for(i = 0; i < 4; i++)
        !           232:                                u.b[7-i] = *p++;
        !           233:                        return(u.x);
        !           234:                case 's':
        !           235:                        for(i = 0; i < 4; i++)
        !           236:                                u.b[4+i] = *p++;
        !           237:                        return(u.x);
        !           238:        }
        !           239: }
        !           240: clientshort(p)
        !           241: unsigned char *p;
        !           242: {      union {
        !           243:                int x;
        !           244:                unsigned char b[8];
        !           245:        } u;
        !           246:        int i;
        !           247:        u.x = 0;
        !           248:        switch (clienttype) {
        !           249:                case 'v':
        !           250:                        for(i = 0; i < 2; i++)
        !           251:                                u.b[7-i] = *p++;
        !           252:                        return(u.x);
        !           253:                case 's':
        !           254:                        for(i = 0; i < 2; i++)
        !           255:                                u.b[6+i] = *p++;
        !           256:                        return(u.x);
        !           257:        }
        !           258: }
        !           259: #endif
        !           260: #if sun == 1
        !           261: /* client to sun */
        !           262: clientlong(p)
        !           263: unsigned char *p;
        !           264: {
        !           265:        switch (clienttype) {
        !           266:                case 'v':
        !           267:                        return(rev4(p));
        !           268:                case 's':
        !           269:                        return(*(long *)p);
        !           270:        }
        !           271: }
        !           272: 
        !           273: clientshort(p)
        !           274: unsigned char *p;
        !           275: {
        !           276:        switch (clienttype) {
        !           277:                case 'v':
        !           278:                        return(rev2(p));
        !           279:                case 's':
        !           280:                        return(*(short *)p);
        !           281:        }
        !           282: }
        !           283: #endif
        !           284: 
        !           285: rev4(p)
        !           286: unsigned char *p;
        !           287: {      union {
        !           288:                long x;
        !           289:                unsigned char b[4];
        !           290:        } u;
        !           291:        int i;
        !           292:        for(i = 0; i < 4; i++)
        !           293:                u.b[3-i] = *p++;
        !           294:        return(u.x);
        !           295: }
        !           296: rev2(p)
        !           297: unsigned char *p;
        !           298: {      union { /* this better work! */
        !           299:                short x;
        !           300:                unsigned char b[2];
        !           301:        } u;
        !           302:        int i;
        !           303:        u.x = 0;
        !           304:        for(i = 0; i < 2; i++)
        !           305:                u.b[1-i] = *p++;
        !           306:        return(u.x);
        !           307: }

unix.superglobalmegacorp.com

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