#include <u.h> | |
#include <libc.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; | |
} |