|  | #include	<u.h> | 
|  | #include	<libc.h> | 
|  | #include	<fcall.h> | 
|  |  | 
|  | uint | 
|  | sizeD2M(Dir *d) | 
|  | { | 
|  | char *sv[5]; | 
|  | int i, ns, nstr, fixlen; | 
|  |  | 
|  | sv[0] = d->name; | 
|  | sv[1] = d->uid; | 
|  | sv[2] = d->gid; | 
|  | sv[3] = d->muid; | 
|  |  | 
|  | fixlen = STATFIXLEN; | 
|  | nstr = 4; | 
|  |  | 
|  | ns = 0; | 
|  | for(i = 0; i < nstr; i++) | 
|  | if(sv[i]) | 
|  | ns += strlen(sv[i]); | 
|  |  | 
|  | return fixlen + ns; | 
|  | } | 
|  |  | 
|  | uint | 
|  | convD2M(Dir *d, uchar *buf, uint nbuf) | 
|  | { | 
|  | uchar *p, *ebuf; | 
|  | char *sv[5]; | 
|  | int i, ns, nsv[5], ss, nstr, fixlen; | 
|  |  | 
|  | 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; | 
|  |  | 
|  | fixlen = STATFIXLEN; | 
|  | nstr = 4; | 
|  |  | 
|  | ns = 0; | 
|  | for(i = 0; i < nstr; i++){ | 
|  | if(sv[i]) | 
|  | nsv[i] = strlen(sv[i]); | 
|  | else | 
|  | nsv[i] = 0; | 
|  | ns += nsv[i]; | 
|  | } | 
|  |  | 
|  | ss = fixlen + 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 < nstr; 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; | 
|  | } |