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