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