1*9a747e4fSDavid du Colombier #include <plan9.h>
2*9a747e4fSDavid du Colombier #include <fcall.h>
3*9a747e4fSDavid du Colombier #include <oldfcall.h>
4*9a747e4fSDavid du Colombier
5*9a747e4fSDavid du Colombier /*
6*9a747e4fSDavid du Colombier * routines to package the old protocol in the new structures.
7*9a747e4fSDavid du Colombier */
8*9a747e4fSDavid du Colombier
9*9a747e4fSDavid du Colombier #define SHORT(x) p[0]=f->x; p[1]=f->x>>8; p += 2
10*9a747e4fSDavid du Colombier #define LONG(x) p[0]=f->x; p[1]=f->x>>8; p[2]=f->x>>16; p[3]=f->x>>24; p += 4
11*9a747e4fSDavid du Colombier #define VLONG(x) p[0]=f->x; p[1]=f->x>>8;\
12*9a747e4fSDavid du Colombier p[2]=f->x>>16; p[3]=f->x>>24;\
13*9a747e4fSDavid du Colombier p[4]=f->x>>32; p[5]=f->x>>40;\
14*9a747e4fSDavid du Colombier p[6]=f->x>>48; p[7]=f->x>>56;\
15*9a747e4fSDavid du Colombier p += 8
16*9a747e4fSDavid du Colombier #define STRING(x,n) strecpy((char*)p, (char*)p+n, f->x); p += n;
17*9a747e4fSDavid du Colombier #define FIXQID(q) q.path ^= (q.path>>33); q.path &= 0x7FFFFFFF; q.path |= (q.type&0x80)<<24
18*9a747e4fSDavid du Colombier
19*9a747e4fSDavid du Colombier uint
oldhdrsize(uchar type)20*9a747e4fSDavid du Colombier oldhdrsize(uchar type)
21*9a747e4fSDavid du Colombier {
22*9a747e4fSDavid du Colombier switch(type){
23*9a747e4fSDavid du Colombier default:
24*9a747e4fSDavid du Colombier return 0;
25*9a747e4fSDavid du Colombier case oldTnop:
26*9a747e4fSDavid du Colombier return 3;
27*9a747e4fSDavid du Colombier case oldTflush:
28*9a747e4fSDavid du Colombier return 3+2;
29*9a747e4fSDavid du Colombier case oldTclone:
30*9a747e4fSDavid du Colombier return 3+2+2;
31*9a747e4fSDavid du Colombier case oldTwalk:
32*9a747e4fSDavid du Colombier return 3+2+28;
33*9a747e4fSDavid du Colombier case oldTopen:
34*9a747e4fSDavid du Colombier return 3+2+1;
35*9a747e4fSDavid du Colombier case oldTcreate:
36*9a747e4fSDavid du Colombier return 3+2+28+4+1;
37*9a747e4fSDavid du Colombier case oldTread:
38*9a747e4fSDavid du Colombier return 3+2+8+2;
39*9a747e4fSDavid du Colombier case oldTwrite:
40*9a747e4fSDavid du Colombier return 3+2+8+2+1;
41*9a747e4fSDavid du Colombier case oldTclunk:
42*9a747e4fSDavid du Colombier return 3+2;
43*9a747e4fSDavid du Colombier case oldTremove:
44*9a747e4fSDavid du Colombier return 3+2;
45*9a747e4fSDavid du Colombier case oldTstat:
46*9a747e4fSDavid du Colombier return 3+2;
47*9a747e4fSDavid du Colombier case oldTwstat:
48*9a747e4fSDavid du Colombier return 3+2+116;
49*9a747e4fSDavid du Colombier case oldTsession:
50*9a747e4fSDavid du Colombier return 3+8;
51*9a747e4fSDavid du Colombier case oldTattach:
52*9a747e4fSDavid du Colombier return 3+2+28+28+72+13;
53*9a747e4fSDavid du Colombier }
54*9a747e4fSDavid du Colombier }
55*9a747e4fSDavid du Colombier
56*9a747e4fSDavid du Colombier uint
iosize(uchar * p)57*9a747e4fSDavid du Colombier iosize(uchar *p)
58*9a747e4fSDavid du Colombier {
59*9a747e4fSDavid du Colombier if(p[0] != oldTwrite)
60*9a747e4fSDavid du Colombier return 0;
61*9a747e4fSDavid du Colombier return p[3+2+8] | (p[3+2+8+1]<<8);
62*9a747e4fSDavid du Colombier }
63*9a747e4fSDavid du Colombier
64*9a747e4fSDavid du Colombier uint
sizeS2M(Fcall * f)65*9a747e4fSDavid du Colombier sizeS2M(Fcall *f)
66*9a747e4fSDavid du Colombier {
67*9a747e4fSDavid du Colombier switch(f->type)
68*9a747e4fSDavid du Colombier {
69*9a747e4fSDavid du Colombier default:
70*9a747e4fSDavid du Colombier abort();
71*9a747e4fSDavid du Colombier return 0;
72*9a747e4fSDavid du Colombier
73*9a747e4fSDavid du Colombier /* no T messages */
74*9a747e4fSDavid du Colombier
75*9a747e4fSDavid du Colombier /*
76*9a747e4fSDavid du Colombier */
77*9a747e4fSDavid du Colombier case Rversion:
78*9a747e4fSDavid du Colombier return 1+2;
79*9a747e4fSDavid du Colombier
80*9a747e4fSDavid du Colombier /*
81*9a747e4fSDavid du Colombier case Rsession:
82*9a747e4fSDavid du Colombier return 1+2+8+28+48;
83*9a747e4fSDavid du Colombier */
84*9a747e4fSDavid du Colombier
85*9a747e4fSDavid du Colombier case Rattach:
86*9a747e4fSDavid du Colombier return 1+2+2+4+4+13;
87*9a747e4fSDavid du Colombier
88*9a747e4fSDavid du Colombier case Rerror:
89*9a747e4fSDavid du Colombier return 1+2+64;
90*9a747e4fSDavid du Colombier
91*9a747e4fSDavid du Colombier case Rflush:
92*9a747e4fSDavid du Colombier if(f->tag&0x8000)
93*9a747e4fSDavid du Colombier return 1+2+8+28+48; /* session */
94*9a747e4fSDavid du Colombier return 1+2;
95*9a747e4fSDavid du Colombier
96*9a747e4fSDavid du Colombier /* assumes we don't ever see Tclwalk requests ... */
97*9a747e4fSDavid du Colombier case Rwalk:
98*9a747e4fSDavid du Colombier if(f->nwqid == 0)
99*9a747e4fSDavid du Colombier return 1+2+2;
100*9a747e4fSDavid du Colombier else
101*9a747e4fSDavid du Colombier return 1+2+2+4+4;
102*9a747e4fSDavid du Colombier
103*9a747e4fSDavid du Colombier case Ropen:
104*9a747e4fSDavid du Colombier return 1+2+2+4+4;
105*9a747e4fSDavid du Colombier
106*9a747e4fSDavid du Colombier case Rcreate:
107*9a747e4fSDavid du Colombier return 1+2+2+4+4;
108*9a747e4fSDavid du Colombier
109*9a747e4fSDavid du Colombier case Rread:
110*9a747e4fSDavid du Colombier return 1+2+2+2+1+f->count;
111*9a747e4fSDavid du Colombier
112*9a747e4fSDavid du Colombier case Rwrite:
113*9a747e4fSDavid du Colombier return 1+2+2+2;
114*9a747e4fSDavid du Colombier
115*9a747e4fSDavid du Colombier case Rclunk:
116*9a747e4fSDavid du Colombier return 1+2+2;
117*9a747e4fSDavid du Colombier
118*9a747e4fSDavid du Colombier case Rremove:
119*9a747e4fSDavid du Colombier return 1+2+2;
120*9a747e4fSDavid du Colombier
121*9a747e4fSDavid du Colombier case Rstat:
122*9a747e4fSDavid du Colombier return 1+2+2+116;
123*9a747e4fSDavid du Colombier
124*9a747e4fSDavid du Colombier case Rwstat:
125*9a747e4fSDavid du Colombier return 1+2+2;
126*9a747e4fSDavid du Colombier }
127*9a747e4fSDavid du Colombier }
128*9a747e4fSDavid du Colombier
129*9a747e4fSDavid du Colombier uint
convS2Mold(Fcall * f,uchar * ap,uint nap)130*9a747e4fSDavid du Colombier convS2Mold(Fcall *f, uchar *ap, uint nap)
131*9a747e4fSDavid du Colombier {
132*9a747e4fSDavid du Colombier uchar *p;
133*9a747e4fSDavid du Colombier
134*9a747e4fSDavid du Colombier if(nap < sizeS2M(f))
135*9a747e4fSDavid du Colombier return 0;
136*9a747e4fSDavid du Colombier
137*9a747e4fSDavid du Colombier p = ap;
138*9a747e4fSDavid du Colombier switch(f->type)
139*9a747e4fSDavid du Colombier {
140*9a747e4fSDavid du Colombier default:
141*9a747e4fSDavid du Colombier abort();
142*9a747e4fSDavid du Colombier return 0;
143*9a747e4fSDavid du Colombier
144*9a747e4fSDavid du Colombier /* no T messages */
145*9a747e4fSDavid du Colombier
146*9a747e4fSDavid du Colombier /*
147*9a747e4fSDavid du Colombier */
148*9a747e4fSDavid du Colombier case Rversion:
149*9a747e4fSDavid du Colombier *p++ = oldRnop;
150*9a747e4fSDavid du Colombier SHORT(tag);
151*9a747e4fSDavid du Colombier break;
152*9a747e4fSDavid du Colombier
153*9a747e4fSDavid du Colombier /*
154*9a747e4fSDavid du Colombier case Rsession:
155*9a747e4fSDavid du Colombier *p++ = oldRsession;
156*9a747e4fSDavid du Colombier SHORT(tag);
157*9a747e4fSDavid du Colombier
158*9a747e4fSDavid du Colombier if(f->nchal > 8)
159*9a747e4fSDavid du Colombier f->nchal = 8;
160*9a747e4fSDavid du Colombier memmove(p, f->chal, f->nchal);
161*9a747e4fSDavid du Colombier p += f->nchal;
162*9a747e4fSDavid du Colombier if(f->nchal < 8){
163*9a747e4fSDavid du Colombier memset(p, 0, 8 - f->nchal);
164*9a747e4fSDavid du Colombier p += 8 - f->nchal;
165*9a747e4fSDavid du Colombier }
166*9a747e4fSDavid du Colombier
167*9a747e4fSDavid du Colombier STRING(authid, 28);
168*9a747e4fSDavid du Colombier STRING(authdom, 48);
169*9a747e4fSDavid du Colombier break;
170*9a747e4fSDavid du Colombier */
171*9a747e4fSDavid du Colombier
172*9a747e4fSDavid du Colombier case Rattach:
173*9a747e4fSDavid du Colombier *p++ = oldRattach;
174*9a747e4fSDavid du Colombier SHORT(tag);
175*9a747e4fSDavid du Colombier SHORT(fid);
176*9a747e4fSDavid du Colombier FIXQID(f->qid);
177*9a747e4fSDavid du Colombier LONG(qid.path);
178*9a747e4fSDavid du Colombier LONG(qid.vers);
179*9a747e4fSDavid du Colombier memset(p, 0, 13);
180*9a747e4fSDavid du Colombier p += 13;
181*9a747e4fSDavid du Colombier break;
182*9a747e4fSDavid du Colombier
183*9a747e4fSDavid du Colombier case Rerror:
184*9a747e4fSDavid du Colombier *p++ = oldRerror;
185*9a747e4fSDavid du Colombier SHORT(tag);
186*9a747e4fSDavid du Colombier STRING(ename, 64);
187*9a747e4fSDavid du Colombier break;
188*9a747e4fSDavid du Colombier
189*9a747e4fSDavid du Colombier case Rflush:
190*9a747e4fSDavid du Colombier if(f->tag&0x8000){
191*9a747e4fSDavid du Colombier *p++ = oldRsession;
192*9a747e4fSDavid du Colombier f->tag &= ~0x8000;
193*9a747e4fSDavid du Colombier SHORT(tag);
194*9a747e4fSDavid du Colombier memset(p, 0, 8+28+48);
195*9a747e4fSDavid du Colombier p += 8+28+48;
196*9a747e4fSDavid du Colombier }else{
197*9a747e4fSDavid du Colombier *p++ = oldRflush;
198*9a747e4fSDavid du Colombier SHORT(tag);
199*9a747e4fSDavid du Colombier }
200*9a747e4fSDavid du Colombier break;
201*9a747e4fSDavid du Colombier
202*9a747e4fSDavid du Colombier /* assumes we don't ever see Tclwalk requests ... */
203*9a747e4fSDavid du Colombier case Rwalk:
204*9a747e4fSDavid du Colombier if(f->nwqid == 0){ /* successful clone */
205*9a747e4fSDavid du Colombier *p++ = oldRclone;
206*9a747e4fSDavid du Colombier SHORT(tag);
207*9a747e4fSDavid du Colombier SHORT(fid);
208*9a747e4fSDavid du Colombier }else{ /* successful 1-element walk */
209*9a747e4fSDavid du Colombier *p++ = oldRwalk;
210*9a747e4fSDavid du Colombier SHORT(tag);
211*9a747e4fSDavid du Colombier SHORT(fid);
212*9a747e4fSDavid du Colombier FIXQID(f->wqid[0]);
213*9a747e4fSDavid du Colombier LONG(wqid[0].path);
214*9a747e4fSDavid du Colombier LONG(wqid[0].vers);
215*9a747e4fSDavid du Colombier }
216*9a747e4fSDavid du Colombier break;
217*9a747e4fSDavid du Colombier
218*9a747e4fSDavid du Colombier case Ropen:
219*9a747e4fSDavid du Colombier *p++ = oldRopen;
220*9a747e4fSDavid du Colombier SHORT(tag);
221*9a747e4fSDavid du Colombier SHORT(fid);
222*9a747e4fSDavid du Colombier FIXQID(f->qid);
223*9a747e4fSDavid du Colombier LONG(qid.path);
224*9a747e4fSDavid du Colombier LONG(qid.vers);
225*9a747e4fSDavid du Colombier break;
226*9a747e4fSDavid du Colombier
227*9a747e4fSDavid du Colombier case Rcreate:
228*9a747e4fSDavid du Colombier *p++ = oldRcreate;
229*9a747e4fSDavid du Colombier SHORT(tag);
230*9a747e4fSDavid du Colombier SHORT(fid);
231*9a747e4fSDavid du Colombier FIXQID(f->qid);
232*9a747e4fSDavid du Colombier LONG(qid.path);
233*9a747e4fSDavid du Colombier LONG(qid.vers);
234*9a747e4fSDavid du Colombier break;
235*9a747e4fSDavid du Colombier
236*9a747e4fSDavid du Colombier case Rread:
237*9a747e4fSDavid du Colombier *p++ = oldRread;
238*9a747e4fSDavid du Colombier SHORT(tag);
239*9a747e4fSDavid du Colombier SHORT(fid);
240*9a747e4fSDavid du Colombier SHORT(count);
241*9a747e4fSDavid du Colombier p++; /* pad(1) */
242*9a747e4fSDavid du Colombier memmove(p, f->data, f->count);
243*9a747e4fSDavid du Colombier p += f->count;
244*9a747e4fSDavid du Colombier break;
245*9a747e4fSDavid du Colombier
246*9a747e4fSDavid du Colombier case Rwrite:
247*9a747e4fSDavid du Colombier *p++ = oldRwrite;
248*9a747e4fSDavid du Colombier SHORT(tag);
249*9a747e4fSDavid du Colombier SHORT(fid);
250*9a747e4fSDavid du Colombier SHORT(count);
251*9a747e4fSDavid du Colombier break;
252*9a747e4fSDavid du Colombier
253*9a747e4fSDavid du Colombier case Rclunk:
254*9a747e4fSDavid du Colombier *p++ = oldRclunk;
255*9a747e4fSDavid du Colombier SHORT(tag);
256*9a747e4fSDavid du Colombier SHORT(fid);
257*9a747e4fSDavid du Colombier break;
258*9a747e4fSDavid du Colombier
259*9a747e4fSDavid du Colombier case Rremove:
260*9a747e4fSDavid du Colombier *p++ = oldRremove;
261*9a747e4fSDavid du Colombier SHORT(tag);
262*9a747e4fSDavid du Colombier SHORT(fid);
263*9a747e4fSDavid du Colombier break;
264*9a747e4fSDavid du Colombier
265*9a747e4fSDavid du Colombier case Rstat:
266*9a747e4fSDavid du Colombier *p++ = oldRstat;
267*9a747e4fSDavid du Colombier SHORT(tag);
268*9a747e4fSDavid du Colombier SHORT(fid);
269*9a747e4fSDavid du Colombier memmove(p, f->stat, 116);
270*9a747e4fSDavid du Colombier p += 116;
271*9a747e4fSDavid du Colombier break;
272*9a747e4fSDavid du Colombier
273*9a747e4fSDavid du Colombier case Rwstat:
274*9a747e4fSDavid du Colombier *p++ = oldRwstat;
275*9a747e4fSDavid du Colombier SHORT(tag);
276*9a747e4fSDavid du Colombier SHORT(fid);
277*9a747e4fSDavid du Colombier break;
278*9a747e4fSDavid du Colombier }
279*9a747e4fSDavid du Colombier return p - ap;
280*9a747e4fSDavid du Colombier }
281*9a747e4fSDavid du Colombier
282*9a747e4fSDavid du Colombier uint
sizeD2Mold(Dir * d)283*9a747e4fSDavid du Colombier sizeD2Mold(Dir *d)
284*9a747e4fSDavid du Colombier {
285*9a747e4fSDavid du Colombier return 116;
286*9a747e4fSDavid du Colombier }
287*9a747e4fSDavid du Colombier
288*9a747e4fSDavid du Colombier uint
convD2Mold(Dir * f,uchar * ap,uint nap)289*9a747e4fSDavid du Colombier convD2Mold(Dir *f, uchar *ap, uint nap)
290*9a747e4fSDavid du Colombier {
291*9a747e4fSDavid du Colombier uchar *p;
292*9a747e4fSDavid du Colombier
293*9a747e4fSDavid du Colombier if(nap < 116)
294*9a747e4fSDavid du Colombier return 0;
295*9a747e4fSDavid du Colombier
296*9a747e4fSDavid du Colombier p = ap;
297*9a747e4fSDavid du Colombier STRING(name, 28);
298*9a747e4fSDavid du Colombier STRING(uid, 28);
299*9a747e4fSDavid du Colombier STRING(gid, 28);
300*9a747e4fSDavid du Colombier FIXQID(f->qid);
301*9a747e4fSDavid du Colombier LONG(qid.path);
302*9a747e4fSDavid du Colombier LONG(qid.vers);
303*9a747e4fSDavid du Colombier LONG(mode);
304*9a747e4fSDavid du Colombier LONG(atime);
305*9a747e4fSDavid du Colombier LONG(mtime);
306*9a747e4fSDavid du Colombier VLONG(length);
307*9a747e4fSDavid du Colombier SHORT(type);
308*9a747e4fSDavid du Colombier SHORT(dev);
309*9a747e4fSDavid du Colombier
310*9a747e4fSDavid du Colombier return p - ap;
311*9a747e4fSDavid du Colombier }
312*9a747e4fSDavid du Colombier
313*9a747e4fSDavid du Colombier #undef SHORT
314*9a747e4fSDavid du Colombier #undef LONG
315*9a747e4fSDavid du Colombier #undef VLONG
316*9a747e4fSDavid du Colombier #undef STRING
317*9a747e4fSDavid du Colombier #define CHAR(x) f->x = *p++
318*9a747e4fSDavid du Colombier #define SHORT(x) f->x = (p[0] | (p[1]<<8)); p += 2
319*9a747e4fSDavid du Colombier #define LONG(x) f->x = (p[0] | (p[1]<<8) |\
320*9a747e4fSDavid du Colombier (p[2]<<16) | (p[3]<<24)); p += 4
321*9a747e4fSDavid du Colombier #define VLONG(x) f->x = (ulong)(p[0] | (p[1]<<8) |\
322*9a747e4fSDavid du Colombier (p[2]<<16) | (p[3]<<24)) |\
323*9a747e4fSDavid du Colombier ((vlong)(p[4] | (p[5]<<8) |\
324*9a747e4fSDavid du Colombier (p[6]<<16) | (p[7]<<24)) << 32); p += 8
325*9a747e4fSDavid du Colombier #define STRING(x,n) f->x = (char*)p; p += n
326*9a747e4fSDavid du Colombier
327*9a747e4fSDavid du Colombier uint
convM2Sold(uchar * ap,uint nap,Fcall * f)328*9a747e4fSDavid du Colombier convM2Sold(uchar *ap, uint nap, Fcall *f)
329*9a747e4fSDavid du Colombier {
330*9a747e4fSDavid du Colombier uchar *p, *q, *ep;
331*9a747e4fSDavid du Colombier
332*9a747e4fSDavid du Colombier p = ap;
333*9a747e4fSDavid du Colombier ep = p + nap;
334*9a747e4fSDavid du Colombier
335*9a747e4fSDavid du Colombier if(p+3 > ep)
336*9a747e4fSDavid du Colombier return 0;
337*9a747e4fSDavid du Colombier
338*9a747e4fSDavid du Colombier switch(*p++){
339*9a747e4fSDavid du Colombier case oldTnop:
340*9a747e4fSDavid du Colombier f->type = Tversion;
341*9a747e4fSDavid du Colombier SHORT(tag);
342*9a747e4fSDavid du Colombier f->msize = 0;
343*9a747e4fSDavid du Colombier f->version = "9P1";
344*9a747e4fSDavid du Colombier break;
345*9a747e4fSDavid du Colombier
346*9a747e4fSDavid du Colombier case oldTflush:
347*9a747e4fSDavid du Colombier f->type = Tflush;
348*9a747e4fSDavid du Colombier SHORT(tag);
349*9a747e4fSDavid du Colombier if(p+2 > ep)
350*9a747e4fSDavid du Colombier return 0;
351*9a747e4fSDavid du Colombier SHORT(oldtag);
352*9a747e4fSDavid du Colombier break;
353*9a747e4fSDavid du Colombier
354*9a747e4fSDavid du Colombier case oldTclone:
355*9a747e4fSDavid du Colombier f->type = Twalk;
356*9a747e4fSDavid du Colombier SHORT(tag);
357*9a747e4fSDavid du Colombier if(p+2+2 > ep)
358*9a747e4fSDavid du Colombier return 0;
359*9a747e4fSDavid du Colombier SHORT(fid);
360*9a747e4fSDavid du Colombier SHORT(newfid);
361*9a747e4fSDavid du Colombier f->nwname = 0;
362*9a747e4fSDavid du Colombier break;
363*9a747e4fSDavid du Colombier
364*9a747e4fSDavid du Colombier case oldTwalk:
365*9a747e4fSDavid du Colombier f->type = Twalk;
366*9a747e4fSDavid du Colombier SHORT(tag);
367*9a747e4fSDavid du Colombier if(p+2+28 > ep)
368*9a747e4fSDavid du Colombier return 0;
369*9a747e4fSDavid du Colombier SHORT(fid);
370*9a747e4fSDavid du Colombier f->newfid = f->fid;
371*9a747e4fSDavid du Colombier f->nwname = 1;
372*9a747e4fSDavid du Colombier f->wname[0] = (char*)p;
373*9a747e4fSDavid du Colombier p += 28;
374*9a747e4fSDavid du Colombier break;
375*9a747e4fSDavid du Colombier
376*9a747e4fSDavid du Colombier case oldTopen:
377*9a747e4fSDavid du Colombier f->type = Topen;
378*9a747e4fSDavid du Colombier SHORT(tag);
379*9a747e4fSDavid du Colombier if(p+2+1 > ep)
380*9a747e4fSDavid du Colombier return 0;
381*9a747e4fSDavid du Colombier SHORT(fid);
382*9a747e4fSDavid du Colombier CHAR(mode);
383*9a747e4fSDavid du Colombier break;
384*9a747e4fSDavid du Colombier
385*9a747e4fSDavid du Colombier case oldTcreate:
386*9a747e4fSDavid du Colombier f->type = Tcreate;
387*9a747e4fSDavid du Colombier SHORT(tag);
388*9a747e4fSDavid du Colombier if(p+2+28+4+1 > ep)
389*9a747e4fSDavid du Colombier return 0;
390*9a747e4fSDavid du Colombier SHORT(fid);
391*9a747e4fSDavid du Colombier f->name = (char*)p;
392*9a747e4fSDavid du Colombier p += 28;
393*9a747e4fSDavid du Colombier LONG(perm);
394*9a747e4fSDavid du Colombier CHAR(mode);
395*9a747e4fSDavid du Colombier break;
396*9a747e4fSDavid du Colombier
397*9a747e4fSDavid du Colombier case oldTread:
398*9a747e4fSDavid du Colombier f->type = Tread;
399*9a747e4fSDavid du Colombier SHORT(tag);
400*9a747e4fSDavid du Colombier if(p+2+8+2 > ep)
401*9a747e4fSDavid du Colombier return 0;
402*9a747e4fSDavid du Colombier SHORT(fid);
403*9a747e4fSDavid du Colombier VLONG(offset);
404*9a747e4fSDavid du Colombier SHORT(count);
405*9a747e4fSDavid du Colombier break;
406*9a747e4fSDavid du Colombier
407*9a747e4fSDavid du Colombier case oldTwrite:
408*9a747e4fSDavid du Colombier f->type = Twrite;
409*9a747e4fSDavid du Colombier SHORT(tag);
410*9a747e4fSDavid du Colombier if(p+2+8+2+1 > ep)
411*9a747e4fSDavid du Colombier return 0;
412*9a747e4fSDavid du Colombier SHORT(fid);
413*9a747e4fSDavid du Colombier VLONG(offset);
414*9a747e4fSDavid du Colombier SHORT(count);
415*9a747e4fSDavid du Colombier p++; /* pad(1) */
416*9a747e4fSDavid du Colombier if(p+f->count > ep)
417*9a747e4fSDavid du Colombier return 0;
418*9a747e4fSDavid du Colombier f->data = (char*)p;
419*9a747e4fSDavid du Colombier p += f->count;
420*9a747e4fSDavid du Colombier break;
421*9a747e4fSDavid du Colombier
422*9a747e4fSDavid du Colombier case oldTclunk:
423*9a747e4fSDavid du Colombier f->type = Tclunk;
424*9a747e4fSDavid du Colombier SHORT(tag);
425*9a747e4fSDavid du Colombier if(p+2 > ep)
426*9a747e4fSDavid du Colombier return 0;
427*9a747e4fSDavid du Colombier SHORT(fid);
428*9a747e4fSDavid du Colombier break;
429*9a747e4fSDavid du Colombier
430*9a747e4fSDavid du Colombier case oldTremove:
431*9a747e4fSDavid du Colombier f->type = Tremove;
432*9a747e4fSDavid du Colombier SHORT(tag);
433*9a747e4fSDavid du Colombier if(p+2 > ep)
434*9a747e4fSDavid du Colombier return 0;
435*9a747e4fSDavid du Colombier SHORT(fid);
436*9a747e4fSDavid du Colombier break;
437*9a747e4fSDavid du Colombier
438*9a747e4fSDavid du Colombier case oldTstat:
439*9a747e4fSDavid du Colombier f->type = Tstat;
440*9a747e4fSDavid du Colombier f->nstat = 116;
441*9a747e4fSDavid du Colombier SHORT(tag);
442*9a747e4fSDavid du Colombier if(p+2 > ep)
443*9a747e4fSDavid du Colombier return 0;
444*9a747e4fSDavid du Colombier SHORT(fid);
445*9a747e4fSDavid du Colombier break;
446*9a747e4fSDavid du Colombier
447*9a747e4fSDavid du Colombier case oldTwstat:
448*9a747e4fSDavid du Colombier f->type = Twstat;
449*9a747e4fSDavid du Colombier SHORT(tag);
450*9a747e4fSDavid du Colombier if(p+2+116 > ep)
451*9a747e4fSDavid du Colombier return 0;
452*9a747e4fSDavid du Colombier SHORT(fid);
453*9a747e4fSDavid du Colombier f->stat = p;
454*9a747e4fSDavid du Colombier q = p+28*3+5*4;
455*9a747e4fSDavid du Colombier memset(q, 0xFF, 8); /* clear length to ``don't care'' */
456*9a747e4fSDavid du Colombier p += 116;
457*9a747e4fSDavid du Colombier break;
458*9a747e4fSDavid du Colombier
459*9a747e4fSDavid du Colombier /*
460*9a747e4fSDavid du Colombier case oldTsession:
461*9a747e4fSDavid du Colombier f->type = Tsession;
462*9a747e4fSDavid du Colombier SHORT(tag);
463*9a747e4fSDavid du Colombier if(p+8 > ep)
464*9a747e4fSDavid du Colombier return 0;
465*9a747e4fSDavid du Colombier f->chal = p;
466*9a747e4fSDavid du Colombier p += 8;
467*9a747e4fSDavid du Colombier f->nchal = 8;
468*9a747e4fSDavid du Colombier break;
469*9a747e4fSDavid du Colombier */
470*9a747e4fSDavid du Colombier case oldTsession:
471*9a747e4fSDavid du Colombier f->type = Tflush;
472*9a747e4fSDavid du Colombier SHORT(tag);
473*9a747e4fSDavid du Colombier f->tag |= 0x8000;
474*9a747e4fSDavid du Colombier f->oldtag = f->tag;
475*9a747e4fSDavid du Colombier p += 8;
476*9a747e4fSDavid du Colombier break;
477*9a747e4fSDavid du Colombier
478*9a747e4fSDavid du Colombier case oldTattach:
479*9a747e4fSDavid du Colombier f->type = Tattach;
480*9a747e4fSDavid du Colombier SHORT(tag);
481*9a747e4fSDavid du Colombier if(p+2+28+28+72+13 > ep)
482*9a747e4fSDavid du Colombier return 0;
483*9a747e4fSDavid du Colombier SHORT(fid);
484*9a747e4fSDavid du Colombier STRING(uname, 28);
485*9a747e4fSDavid du Colombier STRING(aname, 28);
486*9a747e4fSDavid du Colombier p += 72+13;
487*9a747e4fSDavid du Colombier f->afid = NOFID;
488*9a747e4fSDavid du Colombier break;
489*9a747e4fSDavid du Colombier
490*9a747e4fSDavid du Colombier default:
491*9a747e4fSDavid du Colombier return 0;
492*9a747e4fSDavid du Colombier }
493*9a747e4fSDavid du Colombier
494*9a747e4fSDavid du Colombier return p-ap;
495*9a747e4fSDavid du Colombier }
496*9a747e4fSDavid du Colombier
497*9a747e4fSDavid du Colombier uint
convM2Dold(uchar * ap,uint nap,Dir * f,char * strs)498*9a747e4fSDavid du Colombier convM2Dold(uchar *ap, uint nap, Dir *f, char *strs)
499*9a747e4fSDavid du Colombier {
500*9a747e4fSDavid du Colombier uchar *p;
501*9a747e4fSDavid du Colombier
502*9a747e4fSDavid du Colombier USED(strs);
503*9a747e4fSDavid du Colombier
504*9a747e4fSDavid du Colombier if(nap < 116)
505*9a747e4fSDavid du Colombier return 0;
506*9a747e4fSDavid du Colombier
507*9a747e4fSDavid du Colombier p = (uchar*)ap;
508*9a747e4fSDavid du Colombier STRING(name, 28);
509*9a747e4fSDavid du Colombier STRING(uid, 28);
510*9a747e4fSDavid du Colombier STRING(gid, 28);
511*9a747e4fSDavid du Colombier LONG(qid.path);
512*9a747e4fSDavid du Colombier LONG(qid.vers);
513*9a747e4fSDavid du Colombier LONG(mode);
514*9a747e4fSDavid du Colombier LONG(atime);
515*9a747e4fSDavid du Colombier LONG(mtime);
516*9a747e4fSDavid du Colombier VLONG(length);
517*9a747e4fSDavid du Colombier SHORT(type);
518*9a747e4fSDavid du Colombier SHORT(dev);
519*9a747e4fSDavid du Colombier f->qid.type = (f->mode>>24)&0xF0;
520*9a747e4fSDavid du Colombier return p - (uchar*)ap;
521*9a747e4fSDavid du Colombier }
522