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