1 #include "lib9.h" 2 #include "fcall.h" 3 4 uint 5 sizeD2M(Dir *d) 6 { 7 char *sv[4]; 8 int i, ns; 9 10 sv[0] = d->name; 11 sv[1] = d->uid; 12 sv[2] = d->gid; 13 sv[3] = d->muid; 14 15 ns = 0; 16 for(i = 0; i < 4; i++) 17 if(sv[i]) 18 ns += strlen(sv[i]); 19 20 return STATFIXLEN + ns; 21 } 22 23 uint 24 convD2M(Dir *d, uchar *buf, uint nbuf) 25 { 26 uchar *p, *ebuf; 27 char *sv[4]; 28 int i, ns, nsv[4], ss; 29 30 if(nbuf < BIT16SZ) 31 return 0; 32 33 p = buf; 34 ebuf = buf + nbuf; 35 36 sv[0] = d->name; 37 sv[1] = d->uid; 38 sv[2] = d->gid; 39 sv[3] = d->muid; 40 41 ns = 0; 42 for(i = 0; i < 4; i++){ 43 if(sv[i]) 44 nsv[i] = strlen(sv[i]); 45 else 46 nsv[i] = 0; 47 ns += nsv[i]; 48 } 49 50 ss = STATFIXLEN + ns; 51 52 /* set size befor erroring, so user can know how much is needed */ 53 /* note that length excludes count field itself */ 54 PBIT16(p, ss-BIT16SZ); 55 p += BIT16SZ; 56 57 if(ss > nbuf) 58 return BIT16SZ; 59 60 PBIT16(p, d->type); 61 p += BIT16SZ; 62 PBIT32(p, d->dev); 63 p += BIT32SZ; 64 PBIT8(p, d->qid.type); 65 p += BIT8SZ; 66 PBIT32(p, d->qid.vers); 67 p += BIT32SZ; 68 PBIT64(p, d->qid.path); 69 p += BIT64SZ; 70 PBIT32(p, d->mode); 71 p += BIT32SZ; 72 PBIT32(p, d->atime); 73 p += BIT32SZ; 74 PBIT32(p, d->mtime); 75 p += BIT32SZ; 76 PBIT64(p, d->length); 77 p += BIT64SZ; 78 79 for(i = 0; i < 4; i++){ 80 ns = nsv[i]; 81 if(p + ns + BIT16SZ > ebuf) 82 return 0; 83 PBIT16(p, ns); 84 p += BIT16SZ; 85 if(ns) 86 memmove(p, sv[i], ns); 87 p += ns; 88 } 89 90 if(ss != p - buf) 91 return 0; 92 93 return p - buf; 94 } 95