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