xref: /plan9-contrib/sys/src/libc/9sys/convD2M.c (revision 5fe11e2580d4833b76e3395a87f740886ced2411)
13e12c5d1SDavid du Colombier #include	<u.h>
23e12c5d1SDavid du Colombier #include	<libc.h>
33e12c5d1SDavid du Colombier #include	<fcall.h>
43e12c5d1SDavid du Colombier 
59a747e4fSDavid du Colombier uint
sizeD2M(Dir * d)69a747e4fSDavid du Colombier sizeD2M(Dir *d)
73e12c5d1SDavid du Colombier {
89a747e4fSDavid du Colombier 	char *sv[4];
99a747e4fSDavid du Colombier 	int i, ns;
103e12c5d1SDavid du Colombier 
119a747e4fSDavid du Colombier 	sv[0] = d->name;
129a747e4fSDavid du Colombier 	sv[1] = d->uid;
139a747e4fSDavid du Colombier 	sv[2] = d->gid;
149a747e4fSDavid du Colombier 	sv[3] = d->muid;
159a747e4fSDavid du Colombier 
169a747e4fSDavid du Colombier 	ns = 0;
179a747e4fSDavid du Colombier 	for(i = 0; i < 4; i++)
189a747e4fSDavid du Colombier 		if(sv[i])
199a747e4fSDavid du Colombier 			ns += strlen(sv[i]);
209a747e4fSDavid du Colombier 
219a747e4fSDavid du Colombier 	return STATFIXLEN + ns;
229a747e4fSDavid du Colombier }
239a747e4fSDavid du Colombier 
249a747e4fSDavid du Colombier uint
convD2M(Dir * d,uchar * buf,uint nbuf)259a747e4fSDavid du Colombier convD2M(Dir *d, uchar *buf, uint nbuf)
269a747e4fSDavid du Colombier {
279a747e4fSDavid du Colombier 	uchar *p, *ebuf;
289a747e4fSDavid du Colombier 	char *sv[4];
299a747e4fSDavid du Colombier 	int i, ns, nsv[4], ss;
309a747e4fSDavid du Colombier 
319a747e4fSDavid du Colombier 	if(nbuf < BIT16SZ)
329a747e4fSDavid du Colombier 		return 0;
339a747e4fSDavid du Colombier 
349a747e4fSDavid du Colombier 	p = buf;
359a747e4fSDavid du Colombier 	ebuf = buf + nbuf;
369a747e4fSDavid du Colombier 
379a747e4fSDavid du Colombier 	sv[0] = d->name;
389a747e4fSDavid du Colombier 	sv[1] = d->uid;
399a747e4fSDavid du Colombier 	sv[2] = d->gid;
409a747e4fSDavid du Colombier 	sv[3] = d->muid;
419a747e4fSDavid du Colombier 
429a747e4fSDavid du Colombier 	ns = 0;
439a747e4fSDavid du Colombier 	for(i = 0; i < 4; i++){
449a747e4fSDavid du Colombier 		if(sv[i])
459a747e4fSDavid du Colombier 			nsv[i] = strlen(sv[i]);
469a747e4fSDavid du Colombier 		else
479a747e4fSDavid du Colombier 			nsv[i] = 0;
489a747e4fSDavid du Colombier 		ns += nsv[i];
499a747e4fSDavid du Colombier 	}
509a747e4fSDavid du Colombier 
519a747e4fSDavid du Colombier 	ss = STATFIXLEN + ns;
529a747e4fSDavid du Colombier 
53*5fe11e25SDavid du Colombier 	/* set size before erroring, so user can know how much is needed */
549a747e4fSDavid du Colombier 	/* note that length excludes count field itself */
559a747e4fSDavid du Colombier 	PBIT16(p, ss-BIT16SZ);
569a747e4fSDavid du Colombier 	p += BIT16SZ;
579a747e4fSDavid du Colombier 
589a747e4fSDavid du Colombier 	if(ss > nbuf)
599a747e4fSDavid du Colombier 		return BIT16SZ;
609a747e4fSDavid du Colombier 
619a747e4fSDavid du Colombier 	PBIT16(p, d->type);
629a747e4fSDavid du Colombier 	p += BIT16SZ;
639a747e4fSDavid du Colombier 	PBIT32(p, d->dev);
649a747e4fSDavid du Colombier 	p += BIT32SZ;
659a747e4fSDavid du Colombier 	PBIT8(p, d->qid.type);
669a747e4fSDavid du Colombier 	p += BIT8SZ;
679a747e4fSDavid du Colombier 	PBIT32(p, d->qid.vers);
689a747e4fSDavid du Colombier 	p += BIT32SZ;
699a747e4fSDavid du Colombier 	PBIT64(p, d->qid.path);
709a747e4fSDavid du Colombier 	p += BIT64SZ;
719a747e4fSDavid du Colombier 	PBIT32(p, d->mode);
729a747e4fSDavid du Colombier 	p += BIT32SZ;
739a747e4fSDavid du Colombier 	PBIT32(p, d->atime);
749a747e4fSDavid du Colombier 	p += BIT32SZ;
759a747e4fSDavid du Colombier 	PBIT32(p, d->mtime);
769a747e4fSDavid du Colombier 	p += BIT32SZ;
779a747e4fSDavid du Colombier 	PBIT64(p, d->length);
789a747e4fSDavid du Colombier 	p += BIT64SZ;
799a747e4fSDavid du Colombier 
809a747e4fSDavid du Colombier 	for(i = 0; i < 4; i++){
819a747e4fSDavid du Colombier 		ns = nsv[i];
829a747e4fSDavid du Colombier 		if(p + ns + BIT16SZ > ebuf)
839a747e4fSDavid du Colombier 			return 0;
849a747e4fSDavid du Colombier 		PBIT16(p, ns);
859a747e4fSDavid du Colombier 		p += BIT16SZ;
869a747e4fSDavid du Colombier 		if(ns)
879a747e4fSDavid du Colombier 			memmove(p, sv[i], ns);
889a747e4fSDavid du Colombier 		p += ns;
899a747e4fSDavid du Colombier 	}
909a747e4fSDavid du Colombier 
919a747e4fSDavid du Colombier 	if(ss != p - buf)
929a747e4fSDavid du Colombier 		return 0;
939a747e4fSDavid du Colombier 
949a747e4fSDavid du Colombier 	return p - buf;
953e12c5d1SDavid du Colombier }
96