convM2D.c (1503B)
1 #include <u.h> 2 #include <libc.h> 3 #include <fcall.h> 4 5 int 6 statcheck(uchar *buf, uint nbuf) 7 { 8 uchar *ebuf; 9 int i, nstr; 10 11 ebuf = buf + nbuf; 12 13 if(nbuf < STATFIXLEN || nbuf != BIT16SZ + GBIT16(buf)) 14 return -1; 15 16 buf += STATFIXLEN - 4 * BIT16SZ; 17 18 nstr = 4; 19 for(i = 0; i < nstr; i++){ 20 if(buf + BIT16SZ > ebuf) 21 return -1; 22 buf += BIT16SZ + GBIT16(buf); 23 } 24 25 if(buf != ebuf) 26 return -1; 27 28 return 0; 29 } 30 31 static char nullstring[] = ""; 32 33 uint 34 convM2D(uchar *buf, uint nbuf, Dir *d, char *strs) 35 { 36 uchar *p, *ebuf; 37 char *sv[5]; 38 int i, ns, nstr; 39 40 if(nbuf < STATFIXLEN) 41 return 0; 42 43 p = buf; 44 ebuf = buf + nbuf; 45 46 p += BIT16SZ; /* ignore size */ 47 d->type = GBIT16(p); 48 p += BIT16SZ; 49 d->dev = GBIT32(p); 50 p += BIT32SZ; 51 d->qid.type = GBIT8(p); 52 p += BIT8SZ; 53 d->qid.vers = GBIT32(p); 54 p += BIT32SZ; 55 d->qid.path = GBIT64(p); 56 p += BIT64SZ; 57 d->mode = GBIT32(p); 58 p += BIT32SZ; 59 d->atime = GBIT32(p); 60 p += BIT32SZ; 61 d->mtime = GBIT32(p); 62 p += BIT32SZ; 63 d->length = GBIT64(p); 64 p += BIT64SZ; 65 66 nstr = 4; 67 for(i = 0; i < nstr; i++){ 68 if(p + BIT16SZ > ebuf) 69 return 0; 70 ns = GBIT16(p); 71 p += BIT16SZ; 72 if(p + ns > ebuf) 73 return 0; 74 if(strs){ 75 sv[i] = strs; 76 memmove(strs, p, ns); 77 strs += ns; 78 *strs++ = '\0'; 79 } 80 p += ns; 81 } 82 83 if(strs){ 84 d->name = sv[0]; 85 d->uid = sv[1]; 86 d->gid = sv[2]; 87 d->muid = sv[3]; 88 d->ext = nullstring; 89 }else{ 90 d->name = nullstring; 91 d->uid = nullstring; 92 d->gid = nullstring; 93 d->muid = nullstring; 94 d->ext = nullstring; 95 } 96 97 return p - buf; 98 }