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