1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192 |
- #include <plan9.h>
- #include <fcall.h>
- int
- statcheck(uchar *buf, uint nbuf)
- {
- uchar *ebuf;
- int i;
- ebuf = buf + nbuf;
- buf += STATFIXLEN - 4 * BIT16SZ;
- for(i = 0; i < 4; i++){
- if(buf + BIT16SZ > ebuf)
- return -1;
- buf += BIT16SZ + GBIT16(buf);
- }
- if(buf != ebuf)
- return -1;
- return 0;
- }
- static char nullstring[] = "";
- uint
- convM2D(uchar *buf, uint nbuf, Dir *d, char *strs)
- {
- uchar *p, *ebuf;
- char *sv[4];
- int i, ns;
- p = buf;
- ebuf = buf + nbuf;
- p += BIT16SZ; /* ignore size */
- d->type = GBIT16(p);
- p += BIT16SZ;
- d->dev = GBIT32(p);
- p += BIT32SZ;
- d->qid.type = GBIT8(p);
- p += BIT8SZ;
- d->qid.vers = GBIT32(p);
- p += BIT32SZ;
- d->qid.path = GBIT64(p);
- p += BIT64SZ;
- d->mode = GBIT32(p);
- p += BIT32SZ;
- d->atime = GBIT32(p);
- p += BIT32SZ;
- d->mtime = GBIT32(p);
- p += BIT32SZ;
- d->length = GBIT64(p);
- p += BIT64SZ;
- d->name = nil;
- d->uid = nil;
- d->gid = nil;
- d->muid = nil;
- for(i = 0; i < 4; i++){
- if(p + BIT16SZ > ebuf)
- return 0;
- ns = GBIT16(p);
- p += BIT16SZ;
- if(p + ns > ebuf)
- return 0;
- if(strs){
- sv[i] = strs;
- memmove(strs, p, ns);
- strs += ns;
- *strs++ = '\0';
- }
- p += ns;
- }
- if(strs){
- d->name = sv[0];
- d->uid = sv[1];
- d->gid = sv[2];
- d->muid = sv[3];
- }else{
- d->name = nullstring;
- d->uid = nullstring;
- d->gid = nullstring;
- d->muid = nullstring;
- }
-
- return p - buf;
- }
|