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