|
|
1.1 ! root 1: #include "netb.h" ! 2: #include "nberrno.h" ! 3: #include "rf.h" ! 4: ! 5: /* ! 6: * netb functions ! 7: */ ! 8: ! 9: static int illcmd(); ! 10: int _rfput(), _rfupdate(), _rfread(), _rfwrite(); ! 11: int _rfnamei(), _rfstat(), _rfdir(), _rftrunc(); ! 12: ! 13: static (*functab[])() = { ! 14: illcmd, /* (0) illegal */ ! 15: _rfput, /* (1) put */ ! 16: illcmd, /* (2) get */ ! 17: _rfupdate, /* (3) update */ ! 18: _rfread, /* (4) read */ ! 19: _rfwrite, /* (5) write */ ! 20: _rfnamei, /* (6) namei */ ! 21: _rfstat, /* (7) stat */ ! 22: illcmd, /* (8) ioctl */ ! 23: _rftrunc, /* (9) trunc */ ! 24: _rfdir, /* (10) dirread */ ! 25: }; ! 26: ! 27: #define MAXCMD 10 ! 28: ! 29: /* ! 30: * names only for debugging output ! 31: */ ! 32: static char *funcnames[] = { ! 33: "ill", "put", "get", "upd", "read", ! 34: "write", "namei", "stat", "ioctl", "trunc", "dir" ! 35: }; ! 36: ! 37: static char *ninames[] = { ! 38: "reg", "del", "creat", "xcreat", "link", "mkdir", "rmdir" ! 39: }; ! 40: #define MAXNI 6 ! 41: ! 42: extern int cuid, cgid; ! 43: ! 44: static slide(); ! 45: ! 46: _rfscan(fd, buf, size) ! 47: int fd; ! 48: char *buf; ! 49: int size; ! 50: { ! 51: register unsigned char *sp; ! 52: register int blen, mlen; ! 53: register int n, c; ! 54: ! 55: sp = (unsigned char *)buf; ! 56: blen = 0; ! 57: for (;;) { ! 58: if (blen < SNBSIZE) { ! 59: n = _rfgread(fd, buf+blen, size-blen, SNBSIZE); ! 60: if (n < SNBSIZE) ! 61: break; ! 62: blen += n; ! 63: } ! 64: c = frnetchar(sp, SNB_CMD); ! 65: if (c < 0 || c > MAXCMD) ! 66: c = 0; ! 67: mlen = frnetlong(sp, SNB_LEN); ! 68: if (rfdebug) ! 69: rflog("%ld: %s: cmd %d tag x%lx flag %d len %ld\n", ! 70: frnetlong(sp, SNB_TRANNUM), funcnames[c], ! 71: frnetchar(sp, SNB_CMD), frnetlong(sp, SNB_TAG), ! 72: frnetchar(sp, SNB_FLAGS), mlen); ! 73: if (frnetchar(sp, SNB_VERSION) != NETB) ! 74: rfpanic("ill version: %d\n", frnetchar(sp, SNB_VERSION)); ! 75: if (mlen > size) ! 76: rfpanic("msg too long: %d\n", mlen); ! 77: if (mlen > blen) { ! 78: n = _rfgread(fd, buf+blen, size-blen, mlen-blen); ! 79: if (n < mlen - blen) ! 80: break; ! 81: blen += n; ! 82: } ! 83: if (rfdebug ! 84: && c == NBNAMI && frnetchar(sp, SNB_FLAGS) <= MAXNI) { ! 85: rflog("\tnamei: %s '%.*s'\n", ninames[frnetchar(sp, SNB_FLAGS)], ! 86: mlen - SNMSIZE, sp + SNMSIZE); ! 87: } ! 88: cuid = frnetshort(sp, SNB_UID); ! 89: cgid = frnetshort(sp, SNB_GID); ! 90: rfuid = _rfsuid(cuid); ! 91: rfgid = _rfsgid(cgid); ! 92: (*functab[c])(fd, sp, mlen); ! 93: blen -= mlen; ! 94: if (blen != 0) { /* leftover stuff in buffer; shouldn't happen */ ! 95: rflog("%d bytes excess read\n", blen); ! 96: slide(buf+mlen, n, mlen); ! 97: } ! 98: } ! 99: if (n) ! 100: rfpanic("bad read: %d\n", n); ! 101: } ! 102: ! 103: static ! 104: slide(buf, len, dist) ! 105: char *buf; ! 106: register int len; ! 107: int dist; ! 108: { ! 109: register char *fr, *to; ! 110: ! 111: fr = buf; ! 112: to = buf - dist; ! 113: while (--len >= 0) ! 114: *to++ = *fr++; ! 115: } ! 116: ! 117: static ! 118: illcmd(fd, sp) ! 119: int fd; ! 120: unsigned char *sp; ! 121: { ! 122: unsigned char rbuf[RNBSIZE]; ! 123: ! 124: tonetshort(rbuf, RNB_ERRNO, NBEINVAL); ! 125: _rfresp(fd, sp, rbuf, RNBSIZE); ! 126: } ! 127: ! 128: /* ! 129: * send a response ! 130: */ ! 131: ! 132: _rfresp(fd, sp, rp, len) ! 133: int fd; ! 134: register unsigned char *sp, *rp; ! 135: int len; ! 136: { ! 137: ! 138: if (rfdebug) ! 139: rflog("\t_rfresp: %ld: errno %d flags %d len %ld\n", ! 140: frnetlong(sp, SNB_TRANNUM), frnetshort(rp, RNB_ERRNO), ! 141: frnetchar(rp, RNB_FLAGS), len); ! 142: tonetlong(rp, RNB_TRANNUM, frnetlong(sp, SNB_TRANNUM)); ! 143: tonetlong(rp, RNB_LEN, len); ! 144: if (write(fd, (char *)rp, len) != len) ! 145: rfpanic("bad _rfresp write\n", 0); ! 146: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.