| /*  | 
 |  * This file is part of the UCB release of Plan 9. It is subject to the license | 
 |  * terms in the LICENSE file found in the top-level directory of this | 
 |  * distribution and at http://akaros.cs.berkeley.edu/files/Plan9License. No | 
 |  * part of the UCB release of Plan 9, including this file, may be copied, | 
 |  * modified, propagated, or distributed except according to the terms contained | 
 |  * in the LICENSE file. | 
 |  */ | 
 |  | 
 | #include <string.h> | 
 | #include <fcall.h> | 
 |  | 
 | unsigned int sizeD2M(struct 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; | 
 | } | 
 |  | 
 | unsigned int convD2M(struct dir *d, uint8_t * buf, unsigned int nbuf) | 
 | { | 
 | 	uint8_t *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 before 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; | 
 | } |