123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293 |
- #include "lib.h"
- #include <string.h>
- #include "sys9.h"
- #include "dir.h"
- 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++){
- nsv[i] = strlen(sv[i]);
- 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;
- memmove(p, sv[i], ns);
- p += ns;
- }
- if(ss != p - buf)
- return 0;
- return p - buf;
- }
- 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;
- }
|