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