xref: /inferno-os/libkern/convS2M.c (revision 37da2899f40661e3e9631e497da8dc59b971cbd0)
1*37da2899SCharles.Forsyth #include	"lib9.h"
2*37da2899SCharles.Forsyth #include	"fcall.h"
3*37da2899SCharles.Forsyth 
4*37da2899SCharles.Forsyth static
5*37da2899SCharles.Forsyth uchar*
pstring(uchar * p,char * s)6*37da2899SCharles.Forsyth pstring(uchar *p, char *s)
7*37da2899SCharles.Forsyth {
8*37da2899SCharles.Forsyth 	uint n;
9*37da2899SCharles.Forsyth 
10*37da2899SCharles.Forsyth 	if(s == nil){
11*37da2899SCharles.Forsyth 		PBIT16(p, 0);
12*37da2899SCharles.Forsyth 		p += BIT16SZ;
13*37da2899SCharles.Forsyth 		return p;
14*37da2899SCharles.Forsyth 	}
15*37da2899SCharles.Forsyth 
16*37da2899SCharles.Forsyth 	n = strlen(s);
17*37da2899SCharles.Forsyth 	PBIT16(p, n);
18*37da2899SCharles.Forsyth 	p += BIT16SZ;
19*37da2899SCharles.Forsyth 	memmove(p, s, n);
20*37da2899SCharles.Forsyth 	p += n;
21*37da2899SCharles.Forsyth 	return p;
22*37da2899SCharles.Forsyth }
23*37da2899SCharles.Forsyth 
24*37da2899SCharles.Forsyth static
25*37da2899SCharles.Forsyth uchar*
pqid(uchar * p,Qid * q)26*37da2899SCharles.Forsyth pqid(uchar *p, Qid *q)
27*37da2899SCharles.Forsyth {
28*37da2899SCharles.Forsyth 	PBIT8(p, q->type);
29*37da2899SCharles.Forsyth 	p += BIT8SZ;
30*37da2899SCharles.Forsyth 	PBIT32(p, q->vers);
31*37da2899SCharles.Forsyth 	p += BIT32SZ;
32*37da2899SCharles.Forsyth 	PBIT64(p, q->path);
33*37da2899SCharles.Forsyth 	p += BIT64SZ;
34*37da2899SCharles.Forsyth 	return p;
35*37da2899SCharles.Forsyth }
36*37da2899SCharles.Forsyth 
37*37da2899SCharles.Forsyth static
38*37da2899SCharles.Forsyth uint
stringsz(char * s)39*37da2899SCharles.Forsyth stringsz(char *s)
40*37da2899SCharles.Forsyth {
41*37da2899SCharles.Forsyth 	if(s == nil)
42*37da2899SCharles.Forsyth 		return BIT16SZ;
43*37da2899SCharles.Forsyth 
44*37da2899SCharles.Forsyth 	return BIT16SZ+strlen(s);
45*37da2899SCharles.Forsyth }
46*37da2899SCharles.Forsyth 
47*37da2899SCharles.Forsyth uint
sizeS2M(Fcall * f)48*37da2899SCharles.Forsyth sizeS2M(Fcall *f)
49*37da2899SCharles.Forsyth {
50*37da2899SCharles.Forsyth 	uint n;
51*37da2899SCharles.Forsyth 	int i;
52*37da2899SCharles.Forsyth 
53*37da2899SCharles.Forsyth 	n = 0;
54*37da2899SCharles.Forsyth 	n += BIT32SZ;	/* size */
55*37da2899SCharles.Forsyth 	n += BIT8SZ;	/* type */
56*37da2899SCharles.Forsyth 	n += BIT16SZ;	/* tag */
57*37da2899SCharles.Forsyth 
58*37da2899SCharles.Forsyth 	switch(f->type)
59*37da2899SCharles.Forsyth 	{
60*37da2899SCharles.Forsyth 	default:
61*37da2899SCharles.Forsyth 		return 0;
62*37da2899SCharles.Forsyth 
63*37da2899SCharles.Forsyth 	case Tversion:
64*37da2899SCharles.Forsyth 		n += BIT32SZ;
65*37da2899SCharles.Forsyth 		n += stringsz(f->version);
66*37da2899SCharles.Forsyth 		break;
67*37da2899SCharles.Forsyth 
68*37da2899SCharles.Forsyth 	case Tflush:
69*37da2899SCharles.Forsyth 		n += BIT16SZ;
70*37da2899SCharles.Forsyth 		break;
71*37da2899SCharles.Forsyth 
72*37da2899SCharles.Forsyth 	case Tauth:
73*37da2899SCharles.Forsyth 		n += BIT32SZ;
74*37da2899SCharles.Forsyth 		n += stringsz(f->uname);
75*37da2899SCharles.Forsyth 		n += stringsz(f->aname);
76*37da2899SCharles.Forsyth 		break;
77*37da2899SCharles.Forsyth 
78*37da2899SCharles.Forsyth 	case Tattach:
79*37da2899SCharles.Forsyth 		n += BIT32SZ;
80*37da2899SCharles.Forsyth 		n += BIT32SZ;
81*37da2899SCharles.Forsyth 		n += stringsz(f->uname);
82*37da2899SCharles.Forsyth 		n += stringsz(f->aname);
83*37da2899SCharles.Forsyth 		break;
84*37da2899SCharles.Forsyth 
85*37da2899SCharles.Forsyth 	case Twalk:
86*37da2899SCharles.Forsyth 		n += BIT32SZ;
87*37da2899SCharles.Forsyth 		n += BIT32SZ;
88*37da2899SCharles.Forsyth 		n += BIT16SZ;
89*37da2899SCharles.Forsyth 		for(i=0; i<f->nwname; i++)
90*37da2899SCharles.Forsyth 			n += stringsz(f->wname[i]);
91*37da2899SCharles.Forsyth 		break;
92*37da2899SCharles.Forsyth 
93*37da2899SCharles.Forsyth 	case Topen:
94*37da2899SCharles.Forsyth 		n += BIT32SZ;
95*37da2899SCharles.Forsyth 		n += BIT8SZ;
96*37da2899SCharles.Forsyth 		break;
97*37da2899SCharles.Forsyth 
98*37da2899SCharles.Forsyth 	case Tcreate:
99*37da2899SCharles.Forsyth 		n += BIT32SZ;
100*37da2899SCharles.Forsyth 		n += stringsz(f->name);
101*37da2899SCharles.Forsyth 		n += BIT32SZ;
102*37da2899SCharles.Forsyth 		n += BIT8SZ;
103*37da2899SCharles.Forsyth 		break;
104*37da2899SCharles.Forsyth 
105*37da2899SCharles.Forsyth 	case Tread:
106*37da2899SCharles.Forsyth 		n += BIT32SZ;
107*37da2899SCharles.Forsyth 		n += BIT64SZ;
108*37da2899SCharles.Forsyth 		n += BIT32SZ;
109*37da2899SCharles.Forsyth 		break;
110*37da2899SCharles.Forsyth 
111*37da2899SCharles.Forsyth 	case Twrite:
112*37da2899SCharles.Forsyth 		n += BIT32SZ;
113*37da2899SCharles.Forsyth 		n += BIT64SZ;
114*37da2899SCharles.Forsyth 		n += BIT32SZ;
115*37da2899SCharles.Forsyth 		n += f->count;
116*37da2899SCharles.Forsyth 		break;
117*37da2899SCharles.Forsyth 
118*37da2899SCharles.Forsyth 	case Tclunk:
119*37da2899SCharles.Forsyth 	case Tremove:
120*37da2899SCharles.Forsyth 		n += BIT32SZ;
121*37da2899SCharles.Forsyth 		break;
122*37da2899SCharles.Forsyth 
123*37da2899SCharles.Forsyth 	case Tstat:
124*37da2899SCharles.Forsyth 		n += BIT32SZ;
125*37da2899SCharles.Forsyth 		break;
126*37da2899SCharles.Forsyth 
127*37da2899SCharles.Forsyth 	case Twstat:
128*37da2899SCharles.Forsyth 		n += BIT32SZ;
129*37da2899SCharles.Forsyth 		n += BIT16SZ;
130*37da2899SCharles.Forsyth 		n += f->nstat;
131*37da2899SCharles.Forsyth 		break;
132*37da2899SCharles.Forsyth /*
133*37da2899SCharles.Forsyth  */
134*37da2899SCharles.Forsyth 
135*37da2899SCharles.Forsyth 	case Rversion:
136*37da2899SCharles.Forsyth 		n += BIT32SZ;
137*37da2899SCharles.Forsyth 		n += stringsz(f->version);
138*37da2899SCharles.Forsyth 		break;
139*37da2899SCharles.Forsyth 
140*37da2899SCharles.Forsyth 	case Rerror:
141*37da2899SCharles.Forsyth 		n += stringsz(f->ename);
142*37da2899SCharles.Forsyth 		break;
143*37da2899SCharles.Forsyth 
144*37da2899SCharles.Forsyth 	case Rflush:
145*37da2899SCharles.Forsyth 		break;
146*37da2899SCharles.Forsyth 
147*37da2899SCharles.Forsyth 	case Rauth:
148*37da2899SCharles.Forsyth 		n += QIDSZ;
149*37da2899SCharles.Forsyth 		break;
150*37da2899SCharles.Forsyth 
151*37da2899SCharles.Forsyth 	case Rattach:
152*37da2899SCharles.Forsyth 		n += QIDSZ;
153*37da2899SCharles.Forsyth 		break;
154*37da2899SCharles.Forsyth 
155*37da2899SCharles.Forsyth 	case Rwalk:
156*37da2899SCharles.Forsyth 		n += BIT16SZ;
157*37da2899SCharles.Forsyth 		n += f->nwqid*QIDSZ;
158*37da2899SCharles.Forsyth 		break;
159*37da2899SCharles.Forsyth 
160*37da2899SCharles.Forsyth 	case Ropen:
161*37da2899SCharles.Forsyth 	case Rcreate:
162*37da2899SCharles.Forsyth 		n += QIDSZ;
163*37da2899SCharles.Forsyth 		n += BIT32SZ;
164*37da2899SCharles.Forsyth 		break;
165*37da2899SCharles.Forsyth 
166*37da2899SCharles.Forsyth 	case Rread:
167*37da2899SCharles.Forsyth 		n += BIT32SZ;
168*37da2899SCharles.Forsyth 		n += f->count;
169*37da2899SCharles.Forsyth 		break;
170*37da2899SCharles.Forsyth 
171*37da2899SCharles.Forsyth 	case Rwrite:
172*37da2899SCharles.Forsyth 		n += BIT32SZ;
173*37da2899SCharles.Forsyth 		break;
174*37da2899SCharles.Forsyth 
175*37da2899SCharles.Forsyth 	case Rclunk:
176*37da2899SCharles.Forsyth 		break;
177*37da2899SCharles.Forsyth 
178*37da2899SCharles.Forsyth 	case Rremove:
179*37da2899SCharles.Forsyth 		break;
180*37da2899SCharles.Forsyth 
181*37da2899SCharles.Forsyth 	case Rstat:
182*37da2899SCharles.Forsyth 		n += BIT16SZ;
183*37da2899SCharles.Forsyth 		n += f->nstat;
184*37da2899SCharles.Forsyth 		break;
185*37da2899SCharles.Forsyth 
186*37da2899SCharles.Forsyth 	case Rwstat:
187*37da2899SCharles.Forsyth 		break;
188*37da2899SCharles.Forsyth 	}
189*37da2899SCharles.Forsyth 	return n;
190*37da2899SCharles.Forsyth }
191*37da2899SCharles.Forsyth 
192*37da2899SCharles.Forsyth uint
convS2M(Fcall * f,uchar * ap,uint nap)193*37da2899SCharles.Forsyth convS2M(Fcall *f, uchar *ap, uint nap)
194*37da2899SCharles.Forsyth {
195*37da2899SCharles.Forsyth 	uchar *p;
196*37da2899SCharles.Forsyth 	uint i, size;
197*37da2899SCharles.Forsyth 
198*37da2899SCharles.Forsyth 	size = sizeS2M(f);
199*37da2899SCharles.Forsyth 	if(size == 0)
200*37da2899SCharles.Forsyth 		return 0;
201*37da2899SCharles.Forsyth 	if(size > nap)
202*37da2899SCharles.Forsyth 		return 0;
203*37da2899SCharles.Forsyth 
204*37da2899SCharles.Forsyth 	p = (uchar*)ap;
205*37da2899SCharles.Forsyth 
206*37da2899SCharles.Forsyth 	PBIT32(p, size);
207*37da2899SCharles.Forsyth 	p += BIT32SZ;
208*37da2899SCharles.Forsyth 	PBIT8(p, f->type);
209*37da2899SCharles.Forsyth 	p += BIT8SZ;
210*37da2899SCharles.Forsyth 	PBIT16(p, f->tag);
211*37da2899SCharles.Forsyth 	p += BIT16SZ;
212*37da2899SCharles.Forsyth 
213*37da2899SCharles.Forsyth 	switch(f->type)
214*37da2899SCharles.Forsyth 	{
215*37da2899SCharles.Forsyth 	default:
216*37da2899SCharles.Forsyth 		return 0;
217*37da2899SCharles.Forsyth 
218*37da2899SCharles.Forsyth 	case Tversion:
219*37da2899SCharles.Forsyth 		PBIT32(p, f->msize);
220*37da2899SCharles.Forsyth 		p += BIT32SZ;
221*37da2899SCharles.Forsyth 		p = pstring(p, f->version);
222*37da2899SCharles.Forsyth 		break;
223*37da2899SCharles.Forsyth 
224*37da2899SCharles.Forsyth 	case Tflush:
225*37da2899SCharles.Forsyth 		PBIT16(p, f->oldtag);
226*37da2899SCharles.Forsyth 		p += BIT16SZ;
227*37da2899SCharles.Forsyth 		break;
228*37da2899SCharles.Forsyth 
229*37da2899SCharles.Forsyth 	case Tauth:
230*37da2899SCharles.Forsyth 		PBIT32(p, f->afid);
231*37da2899SCharles.Forsyth 		p += BIT32SZ;
232*37da2899SCharles.Forsyth 		p  = pstring(p, f->uname);
233*37da2899SCharles.Forsyth 		p  = pstring(p, f->aname);
234*37da2899SCharles.Forsyth 		break;
235*37da2899SCharles.Forsyth 
236*37da2899SCharles.Forsyth 	case Tattach:
237*37da2899SCharles.Forsyth 		PBIT32(p, f->fid);
238*37da2899SCharles.Forsyth 		p += BIT32SZ;
239*37da2899SCharles.Forsyth 		PBIT32(p, f->afid);
240*37da2899SCharles.Forsyth 		p += BIT32SZ;
241*37da2899SCharles.Forsyth 		p  = pstring(p, f->uname);
242*37da2899SCharles.Forsyth 		p  = pstring(p, f->aname);
243*37da2899SCharles.Forsyth 		break;
244*37da2899SCharles.Forsyth 
245*37da2899SCharles.Forsyth 	case Twalk:
246*37da2899SCharles.Forsyth 		PBIT32(p, f->fid);
247*37da2899SCharles.Forsyth 		p += BIT32SZ;
248*37da2899SCharles.Forsyth 		PBIT32(p, f->newfid);
249*37da2899SCharles.Forsyth 		p += BIT32SZ;
250*37da2899SCharles.Forsyth 		PBIT16(p, f->nwname);
251*37da2899SCharles.Forsyth 		p += BIT16SZ;
252*37da2899SCharles.Forsyth 		if(f->nwname > MAXWELEM)
253*37da2899SCharles.Forsyth 			return 0;
254*37da2899SCharles.Forsyth 		for(i=0; i<f->nwname; i++)
255*37da2899SCharles.Forsyth 			p = pstring(p, f->wname[i]);
256*37da2899SCharles.Forsyth 		break;
257*37da2899SCharles.Forsyth 
258*37da2899SCharles.Forsyth 	case Topen:
259*37da2899SCharles.Forsyth 		PBIT32(p, f->fid);
260*37da2899SCharles.Forsyth 		p += BIT32SZ;
261*37da2899SCharles.Forsyth 		PBIT8(p, f->mode);
262*37da2899SCharles.Forsyth 		p += BIT8SZ;
263*37da2899SCharles.Forsyth 		break;
264*37da2899SCharles.Forsyth 
265*37da2899SCharles.Forsyth 	case Tcreate:
266*37da2899SCharles.Forsyth 		PBIT32(p, f->fid);
267*37da2899SCharles.Forsyth 		p += BIT32SZ;
268*37da2899SCharles.Forsyth 		p = pstring(p, f->name);
269*37da2899SCharles.Forsyth 		PBIT32(p, f->perm);
270*37da2899SCharles.Forsyth 		p += BIT32SZ;
271*37da2899SCharles.Forsyth 		PBIT8(p, f->mode);
272*37da2899SCharles.Forsyth 		p += BIT8SZ;
273*37da2899SCharles.Forsyth 		break;
274*37da2899SCharles.Forsyth 
275*37da2899SCharles.Forsyth 	case Tread:
276*37da2899SCharles.Forsyth 		PBIT32(p, f->fid);
277*37da2899SCharles.Forsyth 		p += BIT32SZ;
278*37da2899SCharles.Forsyth 		PBIT64(p, f->offset);
279*37da2899SCharles.Forsyth 		p += BIT64SZ;
280*37da2899SCharles.Forsyth 		PBIT32(p, f->count);
281*37da2899SCharles.Forsyth 		p += BIT32SZ;
282*37da2899SCharles.Forsyth 		break;
283*37da2899SCharles.Forsyth 
284*37da2899SCharles.Forsyth 	case Twrite:
285*37da2899SCharles.Forsyth 		PBIT32(p, f->fid);
286*37da2899SCharles.Forsyth 		p += BIT32SZ;
287*37da2899SCharles.Forsyth 		PBIT64(p, f->offset);
288*37da2899SCharles.Forsyth 		p += BIT64SZ;
289*37da2899SCharles.Forsyth 		PBIT32(p, f->count);
290*37da2899SCharles.Forsyth 		p += BIT32SZ;
291*37da2899SCharles.Forsyth 		memmove(p, f->data, f->count);
292*37da2899SCharles.Forsyth 		p += f->count;
293*37da2899SCharles.Forsyth 		break;
294*37da2899SCharles.Forsyth 
295*37da2899SCharles.Forsyth 	case Tclunk:
296*37da2899SCharles.Forsyth 	case Tremove:
297*37da2899SCharles.Forsyth 		PBIT32(p, f->fid);
298*37da2899SCharles.Forsyth 		p += BIT32SZ;
299*37da2899SCharles.Forsyth 		break;
300*37da2899SCharles.Forsyth 
301*37da2899SCharles.Forsyth 	case Tstat:
302*37da2899SCharles.Forsyth 		PBIT32(p, f->fid);
303*37da2899SCharles.Forsyth 		p += BIT32SZ;
304*37da2899SCharles.Forsyth 		break;
305*37da2899SCharles.Forsyth 
306*37da2899SCharles.Forsyth 	case Twstat:
307*37da2899SCharles.Forsyth 		PBIT32(p, f->fid);
308*37da2899SCharles.Forsyth 		p += BIT32SZ;
309*37da2899SCharles.Forsyth 		PBIT16(p, f->nstat);
310*37da2899SCharles.Forsyth 		p += BIT16SZ;
311*37da2899SCharles.Forsyth 		memmove(p, f->stat, f->nstat);
312*37da2899SCharles.Forsyth 		p += f->nstat;
313*37da2899SCharles.Forsyth 		break;
314*37da2899SCharles.Forsyth /*
315*37da2899SCharles.Forsyth  */
316*37da2899SCharles.Forsyth 
317*37da2899SCharles.Forsyth 	case Rversion:
318*37da2899SCharles.Forsyth 		PBIT32(p, f->msize);
319*37da2899SCharles.Forsyth 		p += BIT32SZ;
320*37da2899SCharles.Forsyth 		p = pstring(p, f->version);
321*37da2899SCharles.Forsyth 		break;
322*37da2899SCharles.Forsyth 
323*37da2899SCharles.Forsyth 	case Rerror:
324*37da2899SCharles.Forsyth 		p = pstring(p, f->ename);
325*37da2899SCharles.Forsyth 		break;
326*37da2899SCharles.Forsyth 
327*37da2899SCharles.Forsyth 	case Rflush:
328*37da2899SCharles.Forsyth 		break;
329*37da2899SCharles.Forsyth 
330*37da2899SCharles.Forsyth 	case Rauth:
331*37da2899SCharles.Forsyth 		p = pqid(p, &f->aqid);
332*37da2899SCharles.Forsyth 		break;
333*37da2899SCharles.Forsyth 
334*37da2899SCharles.Forsyth 	case Rattach:
335*37da2899SCharles.Forsyth 		p = pqid(p, &f->qid);
336*37da2899SCharles.Forsyth 		break;
337*37da2899SCharles.Forsyth 
338*37da2899SCharles.Forsyth 	case Rwalk:
339*37da2899SCharles.Forsyth 		PBIT16(p, f->nwqid);
340*37da2899SCharles.Forsyth 		p += BIT16SZ;
341*37da2899SCharles.Forsyth 		if(f->nwqid > MAXWELEM)
342*37da2899SCharles.Forsyth 			return 0;
343*37da2899SCharles.Forsyth 		for(i=0; i<f->nwqid; i++)
344*37da2899SCharles.Forsyth 			p = pqid(p, &f->wqid[i]);
345*37da2899SCharles.Forsyth 		break;
346*37da2899SCharles.Forsyth 
347*37da2899SCharles.Forsyth 	case Ropen:
348*37da2899SCharles.Forsyth 	case Rcreate:
349*37da2899SCharles.Forsyth 		p = pqid(p, &f->qid);
350*37da2899SCharles.Forsyth 		PBIT32(p, f->iounit);
351*37da2899SCharles.Forsyth 		p += BIT32SZ;
352*37da2899SCharles.Forsyth 		break;
353*37da2899SCharles.Forsyth 
354*37da2899SCharles.Forsyth 	case Rread:
355*37da2899SCharles.Forsyth 		PBIT32(p, f->count);
356*37da2899SCharles.Forsyth 		p += BIT32SZ;
357*37da2899SCharles.Forsyth 		memmove(p, f->data, f->count);
358*37da2899SCharles.Forsyth 		p += f->count;
359*37da2899SCharles.Forsyth 		break;
360*37da2899SCharles.Forsyth 
361*37da2899SCharles.Forsyth 	case Rwrite:
362*37da2899SCharles.Forsyth 		PBIT32(p, f->count);
363*37da2899SCharles.Forsyth 		p += BIT32SZ;
364*37da2899SCharles.Forsyth 		break;
365*37da2899SCharles.Forsyth 
366*37da2899SCharles.Forsyth 	case Rclunk:
367*37da2899SCharles.Forsyth 		break;
368*37da2899SCharles.Forsyth 
369*37da2899SCharles.Forsyth 	case Rremove:
370*37da2899SCharles.Forsyth 		break;
371*37da2899SCharles.Forsyth 
372*37da2899SCharles.Forsyth 	case Rstat:
373*37da2899SCharles.Forsyth 		PBIT16(p, f->nstat);
374*37da2899SCharles.Forsyth 		p += BIT16SZ;
375*37da2899SCharles.Forsyth 		memmove(p, f->stat, f->nstat);
376*37da2899SCharles.Forsyth 		p += f->nstat;
377*37da2899SCharles.Forsyth 		break;
378*37da2899SCharles.Forsyth 
379*37da2899SCharles.Forsyth 	case Rwstat:
380*37da2899SCharles.Forsyth 		break;
381*37da2899SCharles.Forsyth 	}
382*37da2899SCharles.Forsyth 	if(size != p-ap)
383*37da2899SCharles.Forsyth 		return 0;
384*37da2899SCharles.Forsyth 	return size;
385*37da2899SCharles.Forsyth }
386