xref: /plan9/sys/src/ape/lib/ap/plan9/convD2M.c (revision 9a747e4fd48b9f4522c70c07e8f882a15030f964)
1*9a747e4fSDavid du Colombier #include "lib.h"
2*9a747e4fSDavid du Colombier #include <string.h>
3*9a747e4fSDavid du Colombier #include "sys9.h"
4*9a747e4fSDavid du Colombier #include "dir.h"
5*9a747e4fSDavid du Colombier 
6*9a747e4fSDavid du Colombier uint
_convD2M(Dir * d,uchar * buf,uint nbuf)7*9a747e4fSDavid du Colombier _convD2M(Dir *d, uchar *buf, uint nbuf)
8*9a747e4fSDavid du Colombier {
9*9a747e4fSDavid du Colombier 	uchar *p, *ebuf;
10*9a747e4fSDavid du Colombier 	char *sv[4];
11*9a747e4fSDavid du Colombier 	int i, ns, nsv[4], ss;
12*9a747e4fSDavid du Colombier 
13*9a747e4fSDavid du Colombier 	if(nbuf < BIT16SZ)
14*9a747e4fSDavid du Colombier 		return 0;
15*9a747e4fSDavid du Colombier 
16*9a747e4fSDavid du Colombier 	p = buf;
17*9a747e4fSDavid du Colombier 	ebuf = buf + nbuf;
18*9a747e4fSDavid du Colombier 
19*9a747e4fSDavid du Colombier 	sv[0] = d->name;
20*9a747e4fSDavid du Colombier 	sv[1] = d->uid;
21*9a747e4fSDavid du Colombier 	sv[2] = d->gid;
22*9a747e4fSDavid du Colombier 	sv[3] = d->muid;
23*9a747e4fSDavid du Colombier 
24*9a747e4fSDavid du Colombier 	ns = 0;
25*9a747e4fSDavid du Colombier 	for(i = 0; i < 4; i++){
26*9a747e4fSDavid du Colombier 		nsv[i] = strlen(sv[i]);
27*9a747e4fSDavid du Colombier 		ns += nsv[i];
28*9a747e4fSDavid du Colombier 	}
29*9a747e4fSDavid du Colombier 
30*9a747e4fSDavid du Colombier 	ss = STATFIXLEN + ns;
31*9a747e4fSDavid du Colombier 
32*9a747e4fSDavid du Colombier 	/* set size befor erroring, so user can know how much is needed */
33*9a747e4fSDavid du Colombier 	/* note that length excludes count field itself */
34*9a747e4fSDavid du Colombier 	PBIT16(p, ss-BIT16SZ);
35*9a747e4fSDavid du Colombier 	p += BIT16SZ;
36*9a747e4fSDavid du Colombier 
37*9a747e4fSDavid du Colombier 	if(ss > nbuf)
38*9a747e4fSDavid du Colombier 		return BIT16SZ;
39*9a747e4fSDavid du Colombier 
40*9a747e4fSDavid du Colombier 	PBIT16(p, d->type);
41*9a747e4fSDavid du Colombier 	p += BIT16SZ;
42*9a747e4fSDavid du Colombier 	PBIT32(p, d->dev);
43*9a747e4fSDavid du Colombier 	p += BIT32SZ;
44*9a747e4fSDavid du Colombier 	PBIT8(p, d->qid.type);
45*9a747e4fSDavid du Colombier 	p += BIT8SZ;
46*9a747e4fSDavid du Colombier 	PBIT32(p, d->qid.vers);
47*9a747e4fSDavid du Colombier 	p += BIT32SZ;
48*9a747e4fSDavid du Colombier 	PBIT64(p, d->qid.path);
49*9a747e4fSDavid du Colombier 	p += BIT64SZ;
50*9a747e4fSDavid du Colombier 	PBIT32(p, d->mode);
51*9a747e4fSDavid du Colombier 	p += BIT32SZ;
52*9a747e4fSDavid du Colombier 	PBIT32(p, d->atime);
53*9a747e4fSDavid du Colombier 	p += BIT32SZ;
54*9a747e4fSDavid du Colombier 	PBIT32(p, d->mtime);
55*9a747e4fSDavid du Colombier 	p += BIT32SZ;
56*9a747e4fSDavid du Colombier 	PBIT64(p, d->length);
57*9a747e4fSDavid du Colombier 	p += BIT64SZ;
58*9a747e4fSDavid du Colombier 
59*9a747e4fSDavid du Colombier 	for(i = 0; i < 4; i++){
60*9a747e4fSDavid du Colombier 		ns = nsv[i];
61*9a747e4fSDavid du Colombier 		if(p + ns + BIT16SZ > ebuf)
62*9a747e4fSDavid du Colombier 			return 0;
63*9a747e4fSDavid du Colombier 		PBIT16(p, ns);
64*9a747e4fSDavid du Colombier 		p += BIT16SZ;
65*9a747e4fSDavid du Colombier 		memmove(p, sv[i], ns);
66*9a747e4fSDavid du Colombier 		p += ns;
67*9a747e4fSDavid du Colombier 	}
68*9a747e4fSDavid du Colombier 
69*9a747e4fSDavid du Colombier 	if(ss != p - buf)
70*9a747e4fSDavid du Colombier 		return 0;
71*9a747e4fSDavid du Colombier 
72*9a747e4fSDavid du Colombier 	return p - buf;
73*9a747e4fSDavid du Colombier }
74*9a747e4fSDavid du Colombier 
75*9a747e4fSDavid du Colombier uint
_sizeD2M(Dir * d)76*9a747e4fSDavid du Colombier _sizeD2M(Dir *d)
77*9a747e4fSDavid du Colombier {
78*9a747e4fSDavid du Colombier 	char *sv[4];
79*9a747e4fSDavid du Colombier 	int i, ns;
80*9a747e4fSDavid du Colombier 
81*9a747e4fSDavid du Colombier 	sv[0] = d->name;
82*9a747e4fSDavid du Colombier 	sv[1] = d->uid;
83*9a747e4fSDavid du Colombier 	sv[2] = d->gid;
84*9a747e4fSDavid du Colombier 	sv[3] = d->muid;
85*9a747e4fSDavid du Colombier 
86*9a747e4fSDavid du Colombier 	ns = 0;
87*9a747e4fSDavid du Colombier 	for(i = 0; i < 4; i++)
88*9a747e4fSDavid du Colombier 		if(sv[i])
89*9a747e4fSDavid du Colombier 			ns += strlen(sv[i]);
90*9a747e4fSDavid du Colombier 
91*9a747e4fSDavid du Colombier 	return STATFIXLEN + ns;
92*9a747e4fSDavid du Colombier }
93*9a747e4fSDavid du Colombier 
94