xref: /plan9/sys/src/cmd/disk/kfs/9p1lib.c (revision 9a747e4fd48b9f4522c70c07e8f882a15030f964)
1*9a747e4fSDavid du Colombier #include "all.h"
2*9a747e4fSDavid du Colombier #include "9p1.h"
3*9a747e4fSDavid du Colombier 
4*9a747e4fSDavid du Colombier #define	CHAR(x)		*p++ = f->x
5*9a747e4fSDavid du Colombier #define	SHORT(x)	{ ulong vvv = f->x; p[0] = vvv; p[1] = vvv>>8; p += 2; }
6*9a747e4fSDavid du Colombier #define	VLONG(q)	p[0] = (q); p[1] = (q)>>8; p[2] = (q)>>16; p[3] = (q)>>24; p += 4
7*9a747e4fSDavid du Colombier #define	LONG(x)		{ ulong vvv = f->x; VLONG(vvv); }
8*9a747e4fSDavid du Colombier #define	BYTES(x,n)	memmove(p, f->x, n); p += n
9*9a747e4fSDavid du Colombier #define	STRING(x,n)	strncpy((char*)p, f->x, n); p += n
10*9a747e4fSDavid du Colombier 
11*9a747e4fSDavid du Colombier int
convS2M9p1(Oldfcall * f,uchar * ap)12*9a747e4fSDavid du Colombier convS2M9p1(Oldfcall *f, uchar *ap)
13*9a747e4fSDavid du Colombier {
14*9a747e4fSDavid du Colombier 	uchar *p;
15*9a747e4fSDavid du Colombier 	int t;
16*9a747e4fSDavid du Colombier 
17*9a747e4fSDavid du Colombier 	p = ap;
18*9a747e4fSDavid du Colombier 	CHAR(type);
19*9a747e4fSDavid du Colombier 	t = f->type;
20*9a747e4fSDavid du Colombier 	SHORT(tag);
21*9a747e4fSDavid du Colombier 	switch(t)
22*9a747e4fSDavid du Colombier 	{
23*9a747e4fSDavid du Colombier 	default:
24*9a747e4fSDavid du Colombier 		print("convS2M9p1: bad type: %d\n", t);
25*9a747e4fSDavid du Colombier 		return 0;
26*9a747e4fSDavid du Colombier 
27*9a747e4fSDavid du Colombier 	case Tnop9p1:
28*9a747e4fSDavid du Colombier 	case Tosession9p1:
29*9a747e4fSDavid du Colombier 		break;
30*9a747e4fSDavid du Colombier 
31*9a747e4fSDavid du Colombier 	case Tsession9p1:
32*9a747e4fSDavid du Colombier 		BYTES(chal, sizeof(f->chal));
33*9a747e4fSDavid du Colombier 		break;
34*9a747e4fSDavid du Colombier 
35*9a747e4fSDavid du Colombier 	case Tflush9p1:
36*9a747e4fSDavid du Colombier 		SHORT(oldtag);
37*9a747e4fSDavid du Colombier 		break;
38*9a747e4fSDavid du Colombier 
39*9a747e4fSDavid du Colombier 	case Tattach9p1:
40*9a747e4fSDavid du Colombier 		SHORT(fid);
41*9a747e4fSDavid du Colombier 		STRING(uname, sizeof(f->uname));
42*9a747e4fSDavid du Colombier 		STRING(aname, sizeof(f->aname));
43*9a747e4fSDavid du Colombier 		BYTES(ticket, sizeof(f->ticket));
44*9a747e4fSDavid du Colombier 		BYTES(auth, sizeof(f->auth));
45*9a747e4fSDavid du Colombier 		break;
46*9a747e4fSDavid du Colombier 
47*9a747e4fSDavid du Colombier 	case Toattach9p1:
48*9a747e4fSDavid du Colombier 		SHORT(fid);
49*9a747e4fSDavid du Colombier 		STRING(uname, sizeof(f->uname));
50*9a747e4fSDavid du Colombier 		STRING(aname, sizeof(f->aname));
51*9a747e4fSDavid du Colombier 		BYTES(ticket, NAMELEN);
52*9a747e4fSDavid du Colombier 		break;
53*9a747e4fSDavid du Colombier 
54*9a747e4fSDavid du Colombier 	case Tclone9p1:
55*9a747e4fSDavid du Colombier 		SHORT(fid);
56*9a747e4fSDavid du Colombier 		SHORT(newfid);
57*9a747e4fSDavid du Colombier 		break;
58*9a747e4fSDavid du Colombier 
59*9a747e4fSDavid du Colombier 	case Twalk9p1:
60*9a747e4fSDavid du Colombier 		SHORT(fid);
61*9a747e4fSDavid du Colombier 		STRING(name, sizeof(f->name));
62*9a747e4fSDavid du Colombier 		break;
63*9a747e4fSDavid du Colombier 
64*9a747e4fSDavid du Colombier 	case Tclwalk9p1:
65*9a747e4fSDavid du Colombier 		SHORT(fid);
66*9a747e4fSDavid du Colombier 		SHORT(newfid);
67*9a747e4fSDavid du Colombier 		STRING(name, sizeof(f->name));
68*9a747e4fSDavid du Colombier 		break;
69*9a747e4fSDavid du Colombier 
70*9a747e4fSDavid du Colombier 	case Topen9p1:
71*9a747e4fSDavid du Colombier 		SHORT(fid);
72*9a747e4fSDavid du Colombier 		CHAR(mode);
73*9a747e4fSDavid du Colombier 		break;
74*9a747e4fSDavid du Colombier 
75*9a747e4fSDavid du Colombier 	case Tcreate9p1:
76*9a747e4fSDavid du Colombier 		SHORT(fid);
77*9a747e4fSDavid du Colombier 		STRING(name, sizeof(f->name));
78*9a747e4fSDavid du Colombier 		LONG(perm);
79*9a747e4fSDavid du Colombier 		CHAR(mode);
80*9a747e4fSDavid du Colombier 		break;
81*9a747e4fSDavid du Colombier 
82*9a747e4fSDavid du Colombier 	case Tread9p1:
83*9a747e4fSDavid du Colombier 		SHORT(fid);
84*9a747e4fSDavid du Colombier 		LONG(offset); VLONG(0);
85*9a747e4fSDavid du Colombier 		SHORT(count);
86*9a747e4fSDavid du Colombier 		break;
87*9a747e4fSDavid du Colombier 
88*9a747e4fSDavid du Colombier 	case Twrite9p1:
89*9a747e4fSDavid du Colombier 		SHORT(fid);
90*9a747e4fSDavid du Colombier 		LONG(offset); VLONG(0);
91*9a747e4fSDavid du Colombier 		SHORT(count);
92*9a747e4fSDavid du Colombier 		p++;
93*9a747e4fSDavid du Colombier 		if((uchar*)p == (uchar*)f->data) {
94*9a747e4fSDavid du Colombier 			p += f->count;
95*9a747e4fSDavid du Colombier 			break;
96*9a747e4fSDavid du Colombier 		}
97*9a747e4fSDavid du Colombier 		BYTES(data, f->count);
98*9a747e4fSDavid du Colombier 		break;
99*9a747e4fSDavid du Colombier 
100*9a747e4fSDavid du Colombier 	case Tclunk9p1:
101*9a747e4fSDavid du Colombier 	case Tremove9p1:
102*9a747e4fSDavid du Colombier 	case Tstat9p1:
103*9a747e4fSDavid du Colombier 		SHORT(fid);
104*9a747e4fSDavid du Colombier 		break;
105*9a747e4fSDavid du Colombier 
106*9a747e4fSDavid du Colombier 	case Twstat9p1:
107*9a747e4fSDavid du Colombier 		SHORT(fid);
108*9a747e4fSDavid du Colombier 		BYTES(stat, sizeof(f->stat));
109*9a747e4fSDavid du Colombier 		break;
110*9a747e4fSDavid du Colombier /*
111*9a747e4fSDavid du Colombier  */
112*9a747e4fSDavid du Colombier 	case Rnop9p1:
113*9a747e4fSDavid du Colombier 	case Rosession9p1:
114*9a747e4fSDavid du Colombier 	case Rflush9p1:
115*9a747e4fSDavid du Colombier 		break;
116*9a747e4fSDavid du Colombier 
117*9a747e4fSDavid du Colombier 	case Rsession9p1:
118*9a747e4fSDavid du Colombier 		BYTES(chal, sizeof(f->chal));
119*9a747e4fSDavid du Colombier 		BYTES(authid, sizeof(f->authid));
120*9a747e4fSDavid du Colombier 		BYTES(authdom, sizeof(f->authdom));
121*9a747e4fSDavid du Colombier 		break;
122*9a747e4fSDavid du Colombier 
123*9a747e4fSDavid du Colombier 	case Rerror9p1:
124*9a747e4fSDavid du Colombier 		STRING(ename, sizeof(f->ename));
125*9a747e4fSDavid du Colombier 		break;
126*9a747e4fSDavid du Colombier 
127*9a747e4fSDavid du Colombier 	case Rclone9p1:
128*9a747e4fSDavid du Colombier 	case Rclunk9p1:
129*9a747e4fSDavid du Colombier 	case Rremove9p1:
130*9a747e4fSDavid du Colombier 	case Rwstat9p1:
131*9a747e4fSDavid du Colombier 		SHORT(fid);
132*9a747e4fSDavid du Colombier 		break;
133*9a747e4fSDavid du Colombier 
134*9a747e4fSDavid du Colombier 	case Rwalk9p1:
135*9a747e4fSDavid du Colombier 	case Ropen9p1:
136*9a747e4fSDavid du Colombier 	case Rcreate9p1:
137*9a747e4fSDavid du Colombier 	case Rclwalk9p1:
138*9a747e4fSDavid du Colombier 		SHORT(fid);
139*9a747e4fSDavid du Colombier 		LONG(qid.path);
140*9a747e4fSDavid du Colombier 		LONG(qid.version);
141*9a747e4fSDavid du Colombier 		break;
142*9a747e4fSDavid du Colombier 
143*9a747e4fSDavid du Colombier 	case Rattach9p1:
144*9a747e4fSDavid du Colombier 		SHORT(fid);
145*9a747e4fSDavid du Colombier 		LONG(qid.path);
146*9a747e4fSDavid du Colombier 		LONG(qid.version);
147*9a747e4fSDavid du Colombier 		BYTES(rauth, sizeof(f->rauth));
148*9a747e4fSDavid du Colombier 		break;
149*9a747e4fSDavid du Colombier 
150*9a747e4fSDavid du Colombier 	case Roattach9p1:
151*9a747e4fSDavid du Colombier 		SHORT(fid);
152*9a747e4fSDavid du Colombier 		LONG(qid.path);
153*9a747e4fSDavid du Colombier 		LONG(qid.version);
154*9a747e4fSDavid du Colombier 		break;
155*9a747e4fSDavid du Colombier 
156*9a747e4fSDavid du Colombier 	case Rread9p1:
157*9a747e4fSDavid du Colombier 		SHORT(fid);
158*9a747e4fSDavid du Colombier 		SHORT(count);
159*9a747e4fSDavid du Colombier 		p++;
160*9a747e4fSDavid du Colombier 		if((uchar*)p == (uchar*)f->data) {
161*9a747e4fSDavid du Colombier 			p += f->count;
162*9a747e4fSDavid du Colombier 			break;
163*9a747e4fSDavid du Colombier 		}
164*9a747e4fSDavid du Colombier 		BYTES(data, f->count);
165*9a747e4fSDavid du Colombier 		break;
166*9a747e4fSDavid du Colombier 
167*9a747e4fSDavid du Colombier 	case Rwrite9p1:
168*9a747e4fSDavid du Colombier 		SHORT(fid);
169*9a747e4fSDavid du Colombier 		SHORT(count);
170*9a747e4fSDavid du Colombier 		break;
171*9a747e4fSDavid du Colombier 
172*9a747e4fSDavid du Colombier 	case Rstat9p1:
173*9a747e4fSDavid du Colombier 		SHORT(fid);
174*9a747e4fSDavid du Colombier 		BYTES(stat, sizeof(f->stat));
175*9a747e4fSDavid du Colombier 		break;
176*9a747e4fSDavid du Colombier 	}
177*9a747e4fSDavid du Colombier 	return p - (uchar*)ap;
178*9a747e4fSDavid du Colombier }
179*9a747e4fSDavid du Colombier 
180*9a747e4fSDavid du Colombier /*
181*9a747e4fSDavid du Colombier  * buggery to give false qid for
182*9a747e4fSDavid du Colombier  * the top 2 levels of the dump fs
183*9a747e4fSDavid du Colombier  */
184*9a747e4fSDavid du Colombier static ulong
fakeqid9p1(Dentry * f)185*9a747e4fSDavid du Colombier fakeqid9p1(Dentry *f)
186*9a747e4fSDavid du Colombier {
187*9a747e4fSDavid du Colombier 	ulong q;
188*9a747e4fSDavid du Colombier 	int c;
189*9a747e4fSDavid du Colombier 
190*9a747e4fSDavid du Colombier 	q = f->qid.path;
191*9a747e4fSDavid du Colombier 	if(q == (QPROOT|QPDIR)) {
192*9a747e4fSDavid du Colombier 		c = f->name[0];
193*9a747e4fSDavid du Colombier 		if(c >= '0' && c <= '9') {
194*9a747e4fSDavid du Colombier 			q = 3|QPDIR;
195*9a747e4fSDavid du Colombier 			c = (c-'0')*10 + (f->name[1]-'0');
196*9a747e4fSDavid du Colombier 			if(c >= 1 && c <= 12)
197*9a747e4fSDavid du Colombier 				q = 4|QPDIR;
198*9a747e4fSDavid du Colombier 		}
199*9a747e4fSDavid du Colombier 	}
200*9a747e4fSDavid du Colombier 	return q;
201*9a747e4fSDavid du Colombier }
202*9a747e4fSDavid du Colombier 
203*9a747e4fSDavid du Colombier int
convD2M9p1(Dentry * f,char * ap)204*9a747e4fSDavid du Colombier convD2M9p1(Dentry *f, char *ap)
205*9a747e4fSDavid du Colombier {
206*9a747e4fSDavid du Colombier 	uchar *p;
207*9a747e4fSDavid du Colombier 	ulong q;
208*9a747e4fSDavid du Colombier 
209*9a747e4fSDavid du Colombier 	p = (uchar*)ap;
210*9a747e4fSDavid du Colombier 	STRING(name, sizeof(f->name));
211*9a747e4fSDavid du Colombier 
212*9a747e4fSDavid du Colombier 	memset(p, 0, 2*NAMELEN);
213*9a747e4fSDavid du Colombier 	uidtostr((char*)p, f->uid);
214*9a747e4fSDavid du Colombier 	p += NAMELEN;
215*9a747e4fSDavid du Colombier 
216*9a747e4fSDavid du Colombier 	uidtostr((char*)p, f->gid);
217*9a747e4fSDavid du Colombier 	p += NAMELEN;
218*9a747e4fSDavid du Colombier 
219*9a747e4fSDavid du Colombier 	q = fakeqid9p1(f);
220*9a747e4fSDavid du Colombier 	VLONG(q);
221*9a747e4fSDavid du Colombier 	LONG(qid.version);
222*9a747e4fSDavid du Colombier 	{
223*9a747e4fSDavid du Colombier 		q = f->mode & 0x0fff;
224*9a747e4fSDavid du Colombier 		if(f->mode & DDIR)
225*9a747e4fSDavid du Colombier 			q |= PDIR;
226*9a747e4fSDavid du Colombier 		if(f->mode & DAPND)
227*9a747e4fSDavid du Colombier 			q |= PAPND;
228*9a747e4fSDavid du Colombier 		if(f->mode & DLOCK)
229*9a747e4fSDavid du Colombier 			q |= PLOCK;
230*9a747e4fSDavid du Colombier 		VLONG(q);
231*9a747e4fSDavid du Colombier 	}
232*9a747e4fSDavid du Colombier 	LONG(atime);
233*9a747e4fSDavid du Colombier 	LONG(mtime);
234*9a747e4fSDavid du Colombier 	LONG(size); VLONG(0);
235*9a747e4fSDavid du Colombier 	VLONG(0);
236*9a747e4fSDavid du Colombier 	return p - (uchar*)ap;
237*9a747e4fSDavid du Colombier }
238*9a747e4fSDavid du Colombier 
239*9a747e4fSDavid du Colombier #undef	CHAR
240*9a747e4fSDavid du Colombier #undef	SHORT
241*9a747e4fSDavid du Colombier #undef	LONG
242*9a747e4fSDavid du Colombier #undef	VLONG
243*9a747e4fSDavid du Colombier #undef	BYTES
244*9a747e4fSDavid du Colombier #undef	STRING
245*9a747e4fSDavid du Colombier 
246*9a747e4fSDavid du Colombier #define	CHAR(x)		f->x = *p++
247*9a747e4fSDavid du Colombier #define	SHORT(x)	f->x = (p[0] | (p[1]<<8)); p += 2
248*9a747e4fSDavid du Colombier #define	VLONG(q)	q = (p[0] | (p[1]<<8) | (p[2]<<16) | (p[3]<<24)); p += 4
249*9a747e4fSDavid du Colombier #define	LONG(x)		VLONG(f->x)
250*9a747e4fSDavid du Colombier #define	BYTES(x,n)	memmove(f->x, p, n); p += n
251*9a747e4fSDavid du Colombier #define	STRING(x,n)	memmove(f->x, p, n); p += n
252*9a747e4fSDavid du Colombier 
253*9a747e4fSDavid du Colombier int
convM2S9p1(uchar * ap,Oldfcall * f,int n)254*9a747e4fSDavid du Colombier convM2S9p1(uchar *ap, Oldfcall *f, int n)
255*9a747e4fSDavid du Colombier {
256*9a747e4fSDavid du Colombier 	uchar *p;
257*9a747e4fSDavid du Colombier 	int t;
258*9a747e4fSDavid du Colombier 
259*9a747e4fSDavid du Colombier 	p = ap;
260*9a747e4fSDavid du Colombier 	CHAR(type);
261*9a747e4fSDavid du Colombier 	t = f->type;
262*9a747e4fSDavid du Colombier 	SHORT(tag);
263*9a747e4fSDavid du Colombier 	switch(t)
264*9a747e4fSDavid du Colombier 	{
265*9a747e4fSDavid du Colombier 	default:
266*9a747e4fSDavid du Colombier 		/*
267*9a747e4fSDavid du Colombier 		 * only whine if it couldn't be a 9P2000 Tversion9p1.
268*9a747e4fSDavid du Colombier 		 */
269*9a747e4fSDavid du Colombier 		if(t != 19 || ap[4] != 100)
270*9a747e4fSDavid du Colombier 			print("convM2S9p1: bad type: %d\n", f->type);
271*9a747e4fSDavid du Colombier 		return 0;
272*9a747e4fSDavid du Colombier 
273*9a747e4fSDavid du Colombier 	case Tnop9p1:
274*9a747e4fSDavid du Colombier 	case Tosession9p1:
275*9a747e4fSDavid du Colombier 		break;
276*9a747e4fSDavid du Colombier 
277*9a747e4fSDavid du Colombier 	case Tsession9p1:
278*9a747e4fSDavid du Colombier 		BYTES(chal, sizeof(f->chal));
279*9a747e4fSDavid du Colombier 		break;
280*9a747e4fSDavid du Colombier 
281*9a747e4fSDavid du Colombier 	case Tflush9p1:
282*9a747e4fSDavid du Colombier 		SHORT(oldtag);
283*9a747e4fSDavid du Colombier 		break;
284*9a747e4fSDavid du Colombier 
285*9a747e4fSDavid du Colombier 	case Tattach9p1:
286*9a747e4fSDavid du Colombier 		SHORT(fid);
287*9a747e4fSDavid du Colombier 		BYTES(uname, sizeof(f->uname));
288*9a747e4fSDavid du Colombier 		BYTES(aname, sizeof(f->aname));
289*9a747e4fSDavid du Colombier 		BYTES(ticket, sizeof(f->ticket));
290*9a747e4fSDavid du Colombier 		BYTES(auth, sizeof(f->auth));
291*9a747e4fSDavid du Colombier 		break;
292*9a747e4fSDavid du Colombier 
293*9a747e4fSDavid du Colombier 	case Toattach9p1:
294*9a747e4fSDavid du Colombier 		SHORT(fid);
295*9a747e4fSDavid du Colombier 		BYTES(uname, sizeof(f->uname));
296*9a747e4fSDavid du Colombier 		BYTES(aname, sizeof(f->aname));
297*9a747e4fSDavid du Colombier 		BYTES(ticket, NAMELEN);
298*9a747e4fSDavid du Colombier 		break;
299*9a747e4fSDavid du Colombier 
300*9a747e4fSDavid du Colombier 	case Tclone9p1:
301*9a747e4fSDavid du Colombier 		SHORT(fid);
302*9a747e4fSDavid du Colombier 		SHORT(newfid);
303*9a747e4fSDavid du Colombier 		break;
304*9a747e4fSDavid du Colombier 
305*9a747e4fSDavid du Colombier 	case Twalk9p1:
306*9a747e4fSDavid du Colombier 		SHORT(fid);
307*9a747e4fSDavid du Colombier 		BYTES(name, sizeof(f->name));
308*9a747e4fSDavid du Colombier 		break;
309*9a747e4fSDavid du Colombier 
310*9a747e4fSDavid du Colombier 	case Tclwalk9p1:
311*9a747e4fSDavid du Colombier 		SHORT(fid);
312*9a747e4fSDavid du Colombier 		SHORT(newfid);
313*9a747e4fSDavid du Colombier 		BYTES(name, sizeof(f->name));
314*9a747e4fSDavid du Colombier 		break;
315*9a747e4fSDavid du Colombier 
316*9a747e4fSDavid du Colombier 	case Tremove9p1:
317*9a747e4fSDavid du Colombier 		SHORT(fid);
318*9a747e4fSDavid du Colombier 		break;
319*9a747e4fSDavid du Colombier 
320*9a747e4fSDavid du Colombier 	case Topen9p1:
321*9a747e4fSDavid du Colombier 		SHORT(fid);
322*9a747e4fSDavid du Colombier 		CHAR(mode);
323*9a747e4fSDavid du Colombier 		break;
324*9a747e4fSDavid du Colombier 
325*9a747e4fSDavid du Colombier 	case Tcreate9p1:
326*9a747e4fSDavid du Colombier 		SHORT(fid);
327*9a747e4fSDavid du Colombier 		BYTES(name, sizeof(f->name));
328*9a747e4fSDavid du Colombier 		LONG(perm);
329*9a747e4fSDavid du Colombier 		CHAR(mode);
330*9a747e4fSDavid du Colombier 		break;
331*9a747e4fSDavid du Colombier 
332*9a747e4fSDavid du Colombier 	case Tread9p1:
333*9a747e4fSDavid du Colombier 		SHORT(fid);
334*9a747e4fSDavid du Colombier 		LONG(offset); p += 4;
335*9a747e4fSDavid du Colombier 		SHORT(count);
336*9a747e4fSDavid du Colombier 		break;
337*9a747e4fSDavid du Colombier 
338*9a747e4fSDavid du Colombier 	case Twrite9p1:
339*9a747e4fSDavid du Colombier 		SHORT(fid);
340*9a747e4fSDavid du Colombier 		LONG(offset); p += 4;
341*9a747e4fSDavid du Colombier 		SHORT(count);
342*9a747e4fSDavid du Colombier 		p++;
343*9a747e4fSDavid du Colombier 		f->data = (char*)p; p += f->count;
344*9a747e4fSDavid du Colombier 		break;
345*9a747e4fSDavid du Colombier 
346*9a747e4fSDavid du Colombier 	case Tclunk9p1:
347*9a747e4fSDavid du Colombier 	case Tstat9p1:
348*9a747e4fSDavid du Colombier 		SHORT(fid);
349*9a747e4fSDavid du Colombier 		break;
350*9a747e4fSDavid du Colombier 
351*9a747e4fSDavid du Colombier 	case Twstat9p1:
352*9a747e4fSDavid du Colombier 		SHORT(fid);
353*9a747e4fSDavid du Colombier 		BYTES(stat, sizeof(f->stat));
354*9a747e4fSDavid du Colombier 		break;
355*9a747e4fSDavid du Colombier 
356*9a747e4fSDavid du Colombier /*
357*9a747e4fSDavid du Colombier  */
358*9a747e4fSDavid du Colombier 	case Rnop9p1:
359*9a747e4fSDavid du Colombier 	case Rosession9p1:
360*9a747e4fSDavid du Colombier 		break;
361*9a747e4fSDavid du Colombier 
362*9a747e4fSDavid du Colombier 	case Rsession9p1:
363*9a747e4fSDavid du Colombier 		BYTES(chal, sizeof(f->chal));
364*9a747e4fSDavid du Colombier 		BYTES(authid, sizeof(f->authid));
365*9a747e4fSDavid du Colombier 		BYTES(authdom, sizeof(f->authdom));
366*9a747e4fSDavid du Colombier 		break;
367*9a747e4fSDavid du Colombier 
368*9a747e4fSDavid du Colombier 	case Rerror9p1:
369*9a747e4fSDavid du Colombier 		BYTES(ename, sizeof(f->ename));
370*9a747e4fSDavid du Colombier 		break;
371*9a747e4fSDavid du Colombier 
372*9a747e4fSDavid du Colombier 	case Rflush9p1:
373*9a747e4fSDavid du Colombier 		break;
374*9a747e4fSDavid du Colombier 
375*9a747e4fSDavid du Colombier 	case Rclone9p1:
376*9a747e4fSDavid du Colombier 	case Rclunk9p1:
377*9a747e4fSDavid du Colombier 	case Rremove9p1:
378*9a747e4fSDavid du Colombier 	case Rwstat9p1:
379*9a747e4fSDavid du Colombier 		SHORT(fid);
380*9a747e4fSDavid du Colombier 		break;
381*9a747e4fSDavid du Colombier 
382*9a747e4fSDavid du Colombier 	case Rwalk9p1:
383*9a747e4fSDavid du Colombier 	case Rclwalk9p1:
384*9a747e4fSDavid du Colombier 	case Ropen9p1:
385*9a747e4fSDavid du Colombier 	case Rcreate9p1:
386*9a747e4fSDavid du Colombier 		SHORT(fid);
387*9a747e4fSDavid du Colombier 		LONG(qid.path);
388*9a747e4fSDavid du Colombier 		LONG(qid.version);
389*9a747e4fSDavid du Colombier 		break;
390*9a747e4fSDavid du Colombier 
391*9a747e4fSDavid du Colombier 	case Rattach9p1:
392*9a747e4fSDavid du Colombier 		SHORT(fid);
393*9a747e4fSDavid du Colombier 		LONG(qid.path);
394*9a747e4fSDavid du Colombier 		LONG(qid.version);
395*9a747e4fSDavid du Colombier 		BYTES(rauth, sizeof(f->rauth));
396*9a747e4fSDavid du Colombier 		break;
397*9a747e4fSDavid du Colombier 
398*9a747e4fSDavid du Colombier 	case Roattach9p1:
399*9a747e4fSDavid du Colombier 		SHORT(fid);
400*9a747e4fSDavid du Colombier 		LONG(qid.path);
401*9a747e4fSDavid du Colombier 		LONG(qid.version);
402*9a747e4fSDavid du Colombier 		break;
403*9a747e4fSDavid du Colombier 
404*9a747e4fSDavid du Colombier 	case Rread9p1:
405*9a747e4fSDavid du Colombier 		SHORT(fid);
406*9a747e4fSDavid du Colombier 		SHORT(count);
407*9a747e4fSDavid du Colombier 		p++;
408*9a747e4fSDavid du Colombier 		f->data = (char*)p; p += f->count;
409*9a747e4fSDavid du Colombier 		break;
410*9a747e4fSDavid du Colombier 
411*9a747e4fSDavid du Colombier 	case Rwrite9p1:
412*9a747e4fSDavid du Colombier 		SHORT(fid);
413*9a747e4fSDavid du Colombier 		SHORT(count);
414*9a747e4fSDavid du Colombier 		break;
415*9a747e4fSDavid du Colombier 
416*9a747e4fSDavid du Colombier 	case Rstat9p1:
417*9a747e4fSDavid du Colombier 		SHORT(fid);
418*9a747e4fSDavid du Colombier 		BYTES(stat, sizeof(f->stat));
419*9a747e4fSDavid du Colombier 		break;
420*9a747e4fSDavid du Colombier 	}
421*9a747e4fSDavid du Colombier 	if((uchar*)ap+n == p)
422*9a747e4fSDavid du Colombier 		return n;
423*9a747e4fSDavid du Colombier 	return 0;
424*9a747e4fSDavid du Colombier }
425*9a747e4fSDavid du Colombier 
426*9a747e4fSDavid du Colombier int
convM2D9p1(char * ap,Dentry * f)427*9a747e4fSDavid du Colombier convM2D9p1(char *ap, Dentry *f)
428*9a747e4fSDavid du Colombier {
429*9a747e4fSDavid du Colombier 	uchar *p;
430*9a747e4fSDavid du Colombier 	char str[28];
431*9a747e4fSDavid du Colombier 
432*9a747e4fSDavid du Colombier 	p = (uchar*)ap;
433*9a747e4fSDavid du Colombier 	BYTES(name, sizeof(f->name));
434*9a747e4fSDavid du Colombier 
435*9a747e4fSDavid du Colombier 	memmove(str, p, NAMELEN);
436*9a747e4fSDavid du Colombier 	p += NAMELEN;
437*9a747e4fSDavid du Colombier 	f->uid = strtouid(str);
438*9a747e4fSDavid du Colombier 
439*9a747e4fSDavid du Colombier 	memmove(str, p, NAMELEN);
440*9a747e4fSDavid du Colombier 	p += NAMELEN;
441*9a747e4fSDavid du Colombier 	f->gid = strtouid(str);
442*9a747e4fSDavid du Colombier 
443*9a747e4fSDavid du Colombier 	LONG(qid.path);
444*9a747e4fSDavid du Colombier 	LONG(qid.version);
445*9a747e4fSDavid du Colombier 	{
446*9a747e4fSDavid du Colombier 		LONG(atime);
447*9a747e4fSDavid du Colombier 		f->mode = (f->atime & 0x0fff) | DALLOC;
448*9a747e4fSDavid du Colombier 		if(f->atime & PDIR)
449*9a747e4fSDavid du Colombier 			f->mode |= DDIR;
450*9a747e4fSDavid du Colombier 		if(f->atime & PAPND)
451*9a747e4fSDavid du Colombier 			f->mode |= DAPND;
452*9a747e4fSDavid du Colombier 		if(f->atime & PLOCK)
453*9a747e4fSDavid du Colombier 			f->mode |= DLOCK;
454*9a747e4fSDavid du Colombier 	}
455*9a747e4fSDavid du Colombier 	LONG(atime);
456*9a747e4fSDavid du Colombier 	LONG(mtime);
457*9a747e4fSDavid du Colombier 	LONG(size); p += 4;
458*9a747e4fSDavid du Colombier 	p += 4;
459*9a747e4fSDavid du Colombier 	return p - (uchar*)ap;
460*9a747e4fSDavid du Colombier }
461*9a747e4fSDavid du Colombier 
462