12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394 |
- #include "lib9.h"
- #include "fcall.h"
- uint
- sizeD2M(Dir *d)
- {
- char *sv[4];
- int i, ns;
- sv[0] = d->name;
- sv[1] = d->uid;
- sv[2] = d->gid;
- sv[3] = d->muid;
- ns = 0;
- for(i = 0; i < 4; i++)
- if(sv[i])
- ns += strlen(sv[i]);
- return STATFIXLEN + ns;
- }
- uint
- convD2M(Dir *d, uchar *buf, uint nbuf)
- {
- uchar *p, *ebuf;
- char *sv[4];
- int i, ns, nsv[4], ss;
- if(nbuf < BIT16SZ)
- return 0;
- p = buf;
- ebuf = buf + nbuf;
- sv[0] = d->name;
- sv[1] = d->uid;
- sv[2] = d->gid;
- sv[3] = d->muid;
- ns = 0;
- for(i = 0; i < 4; i++){
- if(sv[i])
- nsv[i] = strlen(sv[i]);
- else
- nsv[i] = 0;
- ns += nsv[i];
- }
- ss = STATFIXLEN + ns;
- /* set size befor erroring, so user can know how much is needed */
- /* note that length excludes count field itself */
- PBIT16(p, ss-BIT16SZ);
- p += BIT16SZ;
- if(ss > nbuf)
- return BIT16SZ;
- PBIT16(p, d->type);
- p += BIT16SZ;
- PBIT32(p, d->dev);
- p += BIT32SZ;
- PBIT8(p, d->qid.type);
- p += BIT8SZ;
- PBIT32(p, d->qid.vers);
- p += BIT32SZ;
- PBIT64(p, d->qid.path);
- p += BIT64SZ;
- PBIT32(p, d->mode);
- p += BIT32SZ;
- PBIT32(p, d->atime);
- p += BIT32SZ;
- PBIT32(p, d->mtime);
- p += BIT32SZ;
- PBIT64(p, d->length);
- p += BIT64SZ;
- for(i = 0; i < 4; i++){
- ns = nsv[i];
- if(p + ns + BIT16SZ > ebuf)
- return 0;
- PBIT16(p, ns);
- p += BIT16SZ;
- if(ns)
- memmove(p, sv[i], ns);
- p += ns;
- }
- if(ss != p - buf)
- return 0;
- return p - buf;
- }
|