xref: /plan9/sys/src/cmd/unix/u9fs/oldfcall.c (revision 9a747e4fd48b9f4522c70c07e8f882a15030f964)
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