xref: /plan9/sys/src/cmd/cwfs/9p1lib.c (revision 01a344a29f2ff35133953eaef092a50fc8c3163b)
1*01a344a2SDavid du Colombier #include "all.h"
2*01a344a2SDavid du Colombier 
3*01a344a2SDavid du Colombier /* BUG transition */
4*01a344a2SDavid du Colombier // int client9p = 2;
5*01a344a2SDavid du Colombier // int kernel9p = 2;
6*01a344a2SDavid du Colombier 
7*01a344a2SDavid du Colombier #include "9p1.h"
8*01a344a2SDavid du Colombier 
9*01a344a2SDavid du Colombier #define	CHAR(x)		*p++ = f->x
10*01a344a2SDavid du Colombier #define	SHORT(x)	{ ulong vvv = f->x; *p++ = vvv; *p++ = vvv>>8; }
11*01a344a2SDavid du Colombier #define	LONGINT(q) {*p++ = (q); *p++ = (q)>>8; *p++ = (q)>>16; *p++ = (q)>>24;}
12*01a344a2SDavid du Colombier #define	LONG(x)		{ ulong vvv = f->x; LONGINT(vvv); }
13*01a344a2SDavid du Colombier #define	VLONG(x) { \
14*01a344a2SDavid du Colombier 	uvlong q = f->x; \
15*01a344a2SDavid du Colombier 	*p++ = (q)>> 0; *p++ = (q)>> 8; *p++ = (q)>>16; *p++ = (q)>>24; \
16*01a344a2SDavid du Colombier 	*p++ = (q)>>32; *p++ = (q)>>40; *p++ = (q)>>48; *p++ = (q)>>56; \
17*01a344a2SDavid du Colombier 	}
18*01a344a2SDavid du Colombier 
19*01a344a2SDavid du Colombier #define	BYTES(x,n)	memmove(p, f->x, n); p += n
20*01a344a2SDavid du Colombier #define	STRING(x,n)	strncpy((char*)p, f->x, n); p += n
21*01a344a2SDavid du Colombier 
22*01a344a2SDavid du Colombier int
convS2M9p1(Fcall * f,uchar * ap)23*01a344a2SDavid du Colombier convS2M9p1(Fcall *f, uchar *ap)
24*01a344a2SDavid du Colombier {
25*01a344a2SDavid du Colombier 	uchar *p;
26*01a344a2SDavid du Colombier 	int t;
27*01a344a2SDavid du Colombier 
28*01a344a2SDavid du Colombier 	p = ap;
29*01a344a2SDavid du Colombier 	CHAR(type);
30*01a344a2SDavid du Colombier 	t = f->type;
31*01a344a2SDavid du Colombier 	SHORT(tag);
32*01a344a2SDavid du Colombier 	switch(t) {
33*01a344a2SDavid du Colombier 	default:
34*01a344a2SDavid du Colombier 		print("convS2M9p1: bad type: %d\n", t);
35*01a344a2SDavid du Colombier 		return 0;
36*01a344a2SDavid du Colombier 
37*01a344a2SDavid du Colombier 	case Tnop:
38*01a344a2SDavid du Colombier 	case Tosession:
39*01a344a2SDavid du Colombier 		break;
40*01a344a2SDavid du Colombier 
41*01a344a2SDavid du Colombier 	case Tsession:
42*01a344a2SDavid du Colombier 		BYTES(chal, sizeof(f->chal));
43*01a344a2SDavid du Colombier 		break;
44*01a344a2SDavid du Colombier 
45*01a344a2SDavid du Colombier 	case Tflush:
46*01a344a2SDavid du Colombier 		SHORT(oldtag);
47*01a344a2SDavid du Colombier 		break;
48*01a344a2SDavid du Colombier 
49*01a344a2SDavid du Colombier 	case Tattach:
50*01a344a2SDavid du Colombier 		SHORT(fid);
51*01a344a2SDavid du Colombier 		STRING(uname, sizeof(f->uname));
52*01a344a2SDavid du Colombier 		STRING(aname, sizeof(f->aname));
53*01a344a2SDavid du Colombier 		BYTES(ticket, sizeof(f->ticket));
54*01a344a2SDavid du Colombier 		BYTES(auth, sizeof(f->auth));
55*01a344a2SDavid du Colombier 		break;
56*01a344a2SDavid du Colombier 
57*01a344a2SDavid du Colombier 	case Toattach:
58*01a344a2SDavid du Colombier 		SHORT(fid);
59*01a344a2SDavid du Colombier 		STRING(uname, sizeof(f->uname));
60*01a344a2SDavid du Colombier 		STRING(aname, sizeof(f->aname));
61*01a344a2SDavid du Colombier 		BYTES(ticket, NAMELEN);
62*01a344a2SDavid du Colombier 		break;
63*01a344a2SDavid du Colombier 
64*01a344a2SDavid du Colombier 	case Tclone:
65*01a344a2SDavid du Colombier 		SHORT(fid);
66*01a344a2SDavid du Colombier 		SHORT(newfid);
67*01a344a2SDavid du Colombier 		break;
68*01a344a2SDavid du Colombier 
69*01a344a2SDavid du Colombier 	case Twalk:
70*01a344a2SDavid du Colombier 		SHORT(fid);
71*01a344a2SDavid du Colombier 		STRING(name, sizeof(f->name));
72*01a344a2SDavid du Colombier 		break;
73*01a344a2SDavid du Colombier 
74*01a344a2SDavid du Colombier 	case Tclwalk:
75*01a344a2SDavid du Colombier 		SHORT(fid);
76*01a344a2SDavid du Colombier 		SHORT(newfid);
77*01a344a2SDavid du Colombier 		STRING(name, sizeof(f->name));
78*01a344a2SDavid du Colombier 		break;
79*01a344a2SDavid du Colombier 
80*01a344a2SDavid du Colombier 	case Topen:
81*01a344a2SDavid du Colombier 		SHORT(fid);
82*01a344a2SDavid du Colombier 		CHAR(mode);
83*01a344a2SDavid du Colombier 		break;
84*01a344a2SDavid du Colombier 
85*01a344a2SDavid du Colombier 	case Tcreate:
86*01a344a2SDavid du Colombier 		SHORT(fid);
87*01a344a2SDavid du Colombier 		STRING(name, sizeof(f->name));
88*01a344a2SDavid du Colombier 		LONG(perm);
89*01a344a2SDavid du Colombier 		CHAR(mode);
90*01a344a2SDavid du Colombier 		break;
91*01a344a2SDavid du Colombier 
92*01a344a2SDavid du Colombier 	case Tread:
93*01a344a2SDavid du Colombier 		SHORT(fid);
94*01a344a2SDavid du Colombier 		VLONG(offset);
95*01a344a2SDavid du Colombier 		SHORT(count);
96*01a344a2SDavid du Colombier 		break;
97*01a344a2SDavid du Colombier 
98*01a344a2SDavid du Colombier 	case Twrite:
99*01a344a2SDavid du Colombier 		SHORT(fid);
100*01a344a2SDavid du Colombier 		VLONG(offset);
101*01a344a2SDavid du Colombier 		SHORT(count);
102*01a344a2SDavid du Colombier 		p++;
103*01a344a2SDavid du Colombier 		if((uchar*)p == (uchar*)f->data) {
104*01a344a2SDavid du Colombier 			p += f->count;
105*01a344a2SDavid du Colombier 			break;
106*01a344a2SDavid du Colombier 		}
107*01a344a2SDavid du Colombier 		BYTES(data, f->count);
108*01a344a2SDavid du Colombier 		break;
109*01a344a2SDavid du Colombier 
110*01a344a2SDavid du Colombier 	case Tclunk:
111*01a344a2SDavid du Colombier 	case Tremove:
112*01a344a2SDavid du Colombier 	case Tstat:
113*01a344a2SDavid du Colombier 		SHORT(fid);
114*01a344a2SDavid du Colombier 		break;
115*01a344a2SDavid du Colombier 
116*01a344a2SDavid du Colombier 	case Twstat:
117*01a344a2SDavid du Colombier 		SHORT(fid);
118*01a344a2SDavid du Colombier 		BYTES(stat, sizeof(f->stat));
119*01a344a2SDavid du Colombier 		break;
120*01a344a2SDavid du Colombier /*
121*01a344a2SDavid du Colombier  */
122*01a344a2SDavid du Colombier 	case Rnop:
123*01a344a2SDavid du Colombier 	case Rosession:
124*01a344a2SDavid du Colombier 	case Rflush:
125*01a344a2SDavid du Colombier 		break;
126*01a344a2SDavid du Colombier 
127*01a344a2SDavid du Colombier 	case Rsession:
128*01a344a2SDavid du Colombier 		BYTES(chal, sizeof(f->chal));
129*01a344a2SDavid du Colombier 		BYTES(authid, sizeof(f->authid));
130*01a344a2SDavid du Colombier 		BYTES(authdom, sizeof(f->authdom));
131*01a344a2SDavid du Colombier 		break;
132*01a344a2SDavid du Colombier 
133*01a344a2SDavid du Colombier 	case Rerror:
134*01a344a2SDavid du Colombier 		STRING(ename, sizeof(f->ename));
135*01a344a2SDavid du Colombier 		break;
136*01a344a2SDavid du Colombier 
137*01a344a2SDavid du Colombier 	case Rclone:
138*01a344a2SDavid du Colombier 	case Rclunk:
139*01a344a2SDavid du Colombier 	case Rremove:
140*01a344a2SDavid du Colombier 	case Rwstat:
141*01a344a2SDavid du Colombier 		SHORT(fid);
142*01a344a2SDavid du Colombier 		break;
143*01a344a2SDavid du Colombier 
144*01a344a2SDavid du Colombier 	case Rwalk:
145*01a344a2SDavid du Colombier 	case Ropen:
146*01a344a2SDavid du Colombier 	case Rcreate:
147*01a344a2SDavid du Colombier 	case Rclwalk:
148*01a344a2SDavid du Colombier 		SHORT(fid);
149*01a344a2SDavid du Colombier 		LONG(qid.path);
150*01a344a2SDavid du Colombier 		LONG(qid.version);
151*01a344a2SDavid du Colombier 		break;
152*01a344a2SDavid du Colombier 
153*01a344a2SDavid du Colombier 	case Rattach:
154*01a344a2SDavid du Colombier 		SHORT(fid);
155*01a344a2SDavid du Colombier 		LONG(qid.path);
156*01a344a2SDavid du Colombier 		LONG(qid.version);
157*01a344a2SDavid du Colombier 		BYTES(rauth, sizeof(f->rauth));
158*01a344a2SDavid du Colombier 		break;
159*01a344a2SDavid du Colombier 
160*01a344a2SDavid du Colombier 	case Roattach:
161*01a344a2SDavid du Colombier 		SHORT(fid);
162*01a344a2SDavid du Colombier 		LONG(qid.path);
163*01a344a2SDavid du Colombier 		LONG(qid.version);
164*01a344a2SDavid du Colombier 		break;
165*01a344a2SDavid du Colombier 
166*01a344a2SDavid du Colombier 	case Rread:
167*01a344a2SDavid du Colombier 		SHORT(fid);
168*01a344a2SDavid du Colombier 		SHORT(count);
169*01a344a2SDavid du Colombier 		p++;
170*01a344a2SDavid du Colombier 		if((uchar*)p == (uchar*)f->data) {
171*01a344a2SDavid du Colombier 			p += f->count;
172*01a344a2SDavid du Colombier 			break;
173*01a344a2SDavid du Colombier 		}
174*01a344a2SDavid du Colombier 		BYTES(data, f->count);
175*01a344a2SDavid du Colombier 		break;
176*01a344a2SDavid du Colombier 
177*01a344a2SDavid du Colombier 	case Rwrite:
178*01a344a2SDavid du Colombier 		SHORT(fid);
179*01a344a2SDavid du Colombier 		SHORT(count);
180*01a344a2SDavid du Colombier 		break;
181*01a344a2SDavid du Colombier 
182*01a344a2SDavid du Colombier 	case Rstat:
183*01a344a2SDavid du Colombier 		SHORT(fid);
184*01a344a2SDavid du Colombier 		BYTES(stat, sizeof(f->stat));
185*01a344a2SDavid du Colombier 		break;
186*01a344a2SDavid du Colombier 	}
187*01a344a2SDavid du Colombier 	return p - (uchar*)ap;
188*01a344a2SDavid du Colombier }
189*01a344a2SDavid du Colombier 
190*01a344a2SDavid du Colombier /*
191*01a344a2SDavid du Colombier  * buggery to give false qid for
192*01a344a2SDavid du Colombier  * the top 2 levels of the dump fs
193*01a344a2SDavid du Colombier  */
194*01a344a2SDavid du Colombier static ulong
fakeqid9p1(Dentry * f)195*01a344a2SDavid du Colombier fakeqid9p1(Dentry *f)
196*01a344a2SDavid du Colombier {
197*01a344a2SDavid du Colombier 	ulong q;
198*01a344a2SDavid du Colombier 	int c;
199*01a344a2SDavid du Colombier 
200*01a344a2SDavid du Colombier 	q = f->qid.path;
201*01a344a2SDavid du Colombier 	if(q == (QPROOT|QPDIR)) {
202*01a344a2SDavid du Colombier 		c = f->name[0];
203*01a344a2SDavid du Colombier 		if(isascii(c) && isdigit(c)) {
204*01a344a2SDavid du Colombier 			q = 3|QPDIR;
205*01a344a2SDavid du Colombier 			c = (c-'0')*10 + (f->name[1]-'0');
206*01a344a2SDavid du Colombier 			if(c >= 1 && c <= 12)
207*01a344a2SDavid du Colombier 				q = 4|QPDIR;
208*01a344a2SDavid du Colombier 		}
209*01a344a2SDavid du Colombier 	}
210*01a344a2SDavid du Colombier 	return q;
211*01a344a2SDavid du Colombier }
212*01a344a2SDavid du Colombier 
213*01a344a2SDavid du Colombier int
convD2M9p1(Dentry * f,char * ap)214*01a344a2SDavid du Colombier convD2M9p1(Dentry *f, char *ap)
215*01a344a2SDavid du Colombier {
216*01a344a2SDavid du Colombier 	uchar *p;
217*01a344a2SDavid du Colombier 	ulong q;
218*01a344a2SDavid du Colombier 
219*01a344a2SDavid du Colombier 	p = (uchar*)ap;
220*01a344a2SDavid du Colombier 	STRING(name, sizeof(f->name));
221*01a344a2SDavid du Colombier 
222*01a344a2SDavid du Colombier 	memset(p, 0, 2*NAMELEN);
223*01a344a2SDavid du Colombier 	uidtostr((char*)p, f->uid, 1);
224*01a344a2SDavid du Colombier 	p += NAMELEN;
225*01a344a2SDavid du Colombier 
226*01a344a2SDavid du Colombier 	uidtostr((char*)p, f->gid, 1);
227*01a344a2SDavid du Colombier 	p += NAMELEN;
228*01a344a2SDavid du Colombier 
229*01a344a2SDavid du Colombier 	q = fakeqid9p1(f);
230*01a344a2SDavid du Colombier 	LONGINT(q);
231*01a344a2SDavid du Colombier 	LONG(qid.version);
232*01a344a2SDavid du Colombier 
233*01a344a2SDavid du Colombier 	q = f->mode & 0x0fff;
234*01a344a2SDavid du Colombier 	if(f->mode & DDIR)
235*01a344a2SDavid du Colombier 		q |= PDIR;
236*01a344a2SDavid du Colombier 	if(f->mode & DAPND)
237*01a344a2SDavid du Colombier 		q |= PAPND;
238*01a344a2SDavid du Colombier 	if(f->mode & DLOCK)
239*01a344a2SDavid du Colombier 		q |= PLOCK;
240*01a344a2SDavid du Colombier 	LONGINT(q);
241*01a344a2SDavid du Colombier 
242*01a344a2SDavid du Colombier 	LONG(atime);
243*01a344a2SDavid du Colombier 	LONG(mtime);
244*01a344a2SDavid du Colombier 	VLONG(size);
245*01a344a2SDavid du Colombier 	LONGINT(0);
246*01a344a2SDavid du Colombier 	return p - (uchar*)ap;
247*01a344a2SDavid du Colombier }
248*01a344a2SDavid du Colombier 
249*01a344a2SDavid du Colombier int
convA2M9p1(Authenticator * f,char * ap,char * key)250*01a344a2SDavid du Colombier convA2M9p1(Authenticator *f, char *ap, char *key)
251*01a344a2SDavid du Colombier {
252*01a344a2SDavid du Colombier 	int n;
253*01a344a2SDavid du Colombier 	uchar *p;
254*01a344a2SDavid du Colombier 
255*01a344a2SDavid du Colombier 	p = (uchar*)ap;
256*01a344a2SDavid du Colombier 	CHAR(num);
257*01a344a2SDavid du Colombier 	BYTES(chal, CHALLEN);
258*01a344a2SDavid du Colombier 	LONG(id);
259*01a344a2SDavid du Colombier 	n = p - (uchar*)ap;
260*01a344a2SDavid du Colombier 	if(key)
261*01a344a2SDavid du Colombier 		encrypt(key, ap, n);
262*01a344a2SDavid du Colombier 	return n;
263*01a344a2SDavid du Colombier }
264*01a344a2SDavid du Colombier 
265*01a344a2SDavid du Colombier #undef	CHAR
266*01a344a2SDavid du Colombier #undef	SHORT
267*01a344a2SDavid du Colombier #undef	LONG
268*01a344a2SDavid du Colombier #undef	LONGINT
269*01a344a2SDavid du Colombier #undef	VLONG
270*01a344a2SDavid du Colombier #undef	BYTES
271*01a344a2SDavid du Colombier #undef	STRING
272*01a344a2SDavid du Colombier 
273*01a344a2SDavid du Colombier #define	CHAR(x)		f->x = *p++
274*01a344a2SDavid du Colombier #define	SHORT(x)	f->x = (p[0] | (p[1]<<8)); p += 2
275*01a344a2SDavid du Colombier #define	LONG(x)	f->x = p[0] | (p[1]<<8) | (p[2]<<16) | (p[3]<<24); p += 4
276*01a344a2SDavid du Colombier #define	VLONG(x) { \
277*01a344a2SDavid du Colombier 	f->x =	    (p[0] | (p[1]<<8) | (p[2]<<16) | (p[3]<<24)) | \
278*01a344a2SDavid du Colombier 	    (uvlong)(p[4] | (p[5]<<8) | (p[6]<<16) | (p[7]<<24)) << 32; \
279*01a344a2SDavid du Colombier 	p += 8; \
280*01a344a2SDavid du Colombier }
281*01a344a2SDavid du Colombier 
282*01a344a2SDavid du Colombier #define	BYTES(x,n)	memmove(f->x, p, n); p += n
283*01a344a2SDavid du Colombier #define	STRING(x,n)	memmove(f->x, p, n); p += n
284*01a344a2SDavid du Colombier 
285*01a344a2SDavid du Colombier int
convM2S9p1(uchar * ap,Fcall * f,int n)286*01a344a2SDavid du Colombier convM2S9p1(uchar *ap, Fcall *f, int n)
287*01a344a2SDavid du Colombier {
288*01a344a2SDavid du Colombier 	uchar *p;
289*01a344a2SDavid du Colombier 	int t;
290*01a344a2SDavid du Colombier 
291*01a344a2SDavid du Colombier 	p = ap;
292*01a344a2SDavid du Colombier 	CHAR(type);
293*01a344a2SDavid du Colombier 	t = f->type;
294*01a344a2SDavid du Colombier 	SHORT(tag);
295*01a344a2SDavid du Colombier 	switch(t) {
296*01a344a2SDavid du Colombier 	default:
297*01a344a2SDavid du Colombier 		/*
298*01a344a2SDavid du Colombier 		 * only whine if it couldn't be a 9P2000 Tversion.
299*01a344a2SDavid du Colombier 		 */
300*01a344a2SDavid du Colombier 		if(t != 19 || ap[4] != 100)
301*01a344a2SDavid du Colombier 			print("convM2S9p1: bad type: %d\n", f->type);
302*01a344a2SDavid du Colombier 		return 0;
303*01a344a2SDavid du Colombier 
304*01a344a2SDavid du Colombier 	case Tnop:
305*01a344a2SDavid du Colombier 	case Tosession:
306*01a344a2SDavid du Colombier 		break;
307*01a344a2SDavid du Colombier 
308*01a344a2SDavid du Colombier 	case Tsession:
309*01a344a2SDavid du Colombier 		BYTES(chal, sizeof(f->chal));
310*01a344a2SDavid du Colombier 		break;
311*01a344a2SDavid du Colombier 
312*01a344a2SDavid du Colombier 	case Tflush:
313*01a344a2SDavid du Colombier 		SHORT(oldtag);
314*01a344a2SDavid du Colombier 		break;
315*01a344a2SDavid du Colombier 
316*01a344a2SDavid du Colombier 	case Tattach:
317*01a344a2SDavid du Colombier 		SHORT(fid);
318*01a344a2SDavid du Colombier 		BYTES(uname, sizeof(f->uname));
319*01a344a2SDavid du Colombier 		BYTES(aname, sizeof(f->aname));
320*01a344a2SDavid du Colombier 		BYTES(ticket, sizeof(f->ticket));
321*01a344a2SDavid du Colombier 		BYTES(auth, sizeof(f->auth));
322*01a344a2SDavid du Colombier 		break;
323*01a344a2SDavid du Colombier 
324*01a344a2SDavid du Colombier 	case Toattach:
325*01a344a2SDavid du Colombier 		SHORT(fid);
326*01a344a2SDavid du Colombier 		BYTES(uname, sizeof(f->uname));
327*01a344a2SDavid du Colombier 		BYTES(aname, sizeof(f->aname));
328*01a344a2SDavid du Colombier 		BYTES(ticket, NAMELEN);
329*01a344a2SDavid du Colombier 		break;
330*01a344a2SDavid du Colombier 
331*01a344a2SDavid du Colombier 	case Tclone:
332*01a344a2SDavid du Colombier 		SHORT(fid);
333*01a344a2SDavid du Colombier 		SHORT(newfid);
334*01a344a2SDavid du Colombier 		break;
335*01a344a2SDavid du Colombier 
336*01a344a2SDavid du Colombier 	case Twalk:
337*01a344a2SDavid du Colombier 		SHORT(fid);
338*01a344a2SDavid du Colombier 		BYTES(name, sizeof(f->name));
339*01a344a2SDavid du Colombier 		break;
340*01a344a2SDavid du Colombier 
341*01a344a2SDavid du Colombier 	case Tclwalk:
342*01a344a2SDavid du Colombier 		SHORT(fid);
343*01a344a2SDavid du Colombier 		SHORT(newfid);
344*01a344a2SDavid du Colombier 		BYTES(name, sizeof(f->name));
345*01a344a2SDavid du Colombier 		break;
346*01a344a2SDavid du Colombier 
347*01a344a2SDavid du Colombier 	case Tremove:
348*01a344a2SDavid du Colombier 		SHORT(fid);
349*01a344a2SDavid du Colombier 		break;
350*01a344a2SDavid du Colombier 
351*01a344a2SDavid du Colombier 	case Topen:
352*01a344a2SDavid du Colombier 		SHORT(fid);
353*01a344a2SDavid du Colombier 		CHAR(mode);
354*01a344a2SDavid du Colombier 		break;
355*01a344a2SDavid du Colombier 
356*01a344a2SDavid du Colombier 	case Tcreate:
357*01a344a2SDavid du Colombier 		SHORT(fid);
358*01a344a2SDavid du Colombier 		BYTES(name, sizeof(f->name));
359*01a344a2SDavid du Colombier 		LONG(perm);
360*01a344a2SDavid du Colombier 		CHAR(mode);
361*01a344a2SDavid du Colombier 		break;
362*01a344a2SDavid du Colombier 
363*01a344a2SDavid du Colombier 	case Tread:
364*01a344a2SDavid du Colombier 		SHORT(fid);
365*01a344a2SDavid du Colombier 		VLONG(offset);
366*01a344a2SDavid du Colombier 		SHORT(count);
367*01a344a2SDavid du Colombier 		break;
368*01a344a2SDavid du Colombier 
369*01a344a2SDavid du Colombier 	case Twrite:
370*01a344a2SDavid du Colombier 		SHORT(fid);
371*01a344a2SDavid du Colombier 		VLONG(offset);
372*01a344a2SDavid du Colombier 		SHORT(count);
373*01a344a2SDavid du Colombier 		p++;
374*01a344a2SDavid du Colombier 		f->data = (char*)p; p += f->count;
375*01a344a2SDavid du Colombier 		break;
376*01a344a2SDavid du Colombier 
377*01a344a2SDavid du Colombier 	case Tclunk:
378*01a344a2SDavid du Colombier 	case Tstat:
379*01a344a2SDavid du Colombier 		SHORT(fid);
380*01a344a2SDavid du Colombier 		break;
381*01a344a2SDavid du Colombier 
382*01a344a2SDavid du Colombier 	case Twstat:
383*01a344a2SDavid du Colombier 		SHORT(fid);
384*01a344a2SDavid du Colombier 		BYTES(stat, sizeof(f->stat));
385*01a344a2SDavid du Colombier 		break;
386*01a344a2SDavid du Colombier 
387*01a344a2SDavid du Colombier /*
388*01a344a2SDavid du Colombier  */
389*01a344a2SDavid du Colombier 	case Rnop:
390*01a344a2SDavid du Colombier 	case Rosession:
391*01a344a2SDavid du Colombier 		break;
392*01a344a2SDavid du Colombier 
393*01a344a2SDavid du Colombier 	case Rsession:
394*01a344a2SDavid du Colombier 		BYTES(chal, sizeof(f->chal));
395*01a344a2SDavid du Colombier 		BYTES(authid, sizeof(f->authid));
396*01a344a2SDavid du Colombier 		BYTES(authdom, sizeof(f->authdom));
397*01a344a2SDavid du Colombier 		break;
398*01a344a2SDavid du Colombier 
399*01a344a2SDavid du Colombier 	case Rerror:
400*01a344a2SDavid du Colombier 		BYTES(ename, sizeof(f->ename));
401*01a344a2SDavid du Colombier 		break;
402*01a344a2SDavid du Colombier 
403*01a344a2SDavid du Colombier 	case Rflush:
404*01a344a2SDavid du Colombier 		break;
405*01a344a2SDavid du Colombier 
406*01a344a2SDavid du Colombier 	case Rclone:
407*01a344a2SDavid du Colombier 	case Rclunk:
408*01a344a2SDavid du Colombier 	case Rremove:
409*01a344a2SDavid du Colombier 	case Rwstat:
410*01a344a2SDavid du Colombier 		SHORT(fid);
411*01a344a2SDavid du Colombier 		break;
412*01a344a2SDavid du Colombier 
413*01a344a2SDavid du Colombier 	case Rwalk:
414*01a344a2SDavid du Colombier 	case Rclwalk:
415*01a344a2SDavid du Colombier 	case Ropen:
416*01a344a2SDavid du Colombier 	case Rcreate:
417*01a344a2SDavid du Colombier 		SHORT(fid);
418*01a344a2SDavid du Colombier 		LONG(qid.path);
419*01a344a2SDavid du Colombier 		LONG(qid.version);
420*01a344a2SDavid du Colombier 		break;
421*01a344a2SDavid du Colombier 
422*01a344a2SDavid du Colombier 	case Rattach:
423*01a344a2SDavid du Colombier 		SHORT(fid);
424*01a344a2SDavid du Colombier 		LONG(qid.path);
425*01a344a2SDavid du Colombier 		LONG(qid.version);
426*01a344a2SDavid du Colombier 		BYTES(rauth, sizeof(f->rauth));
427*01a344a2SDavid du Colombier 		break;
428*01a344a2SDavid du Colombier 
429*01a344a2SDavid du Colombier 	case Roattach:
430*01a344a2SDavid du Colombier 		SHORT(fid);
431*01a344a2SDavid du Colombier 		LONG(qid.path);
432*01a344a2SDavid du Colombier 		LONG(qid.version);
433*01a344a2SDavid du Colombier 		break;
434*01a344a2SDavid du Colombier 
435*01a344a2SDavid du Colombier 	case Rread:
436*01a344a2SDavid du Colombier 		SHORT(fid);
437*01a344a2SDavid du Colombier 		SHORT(count);
438*01a344a2SDavid du Colombier 		p++;
439*01a344a2SDavid du Colombier 		f->data = (char*)p; p += f->count;
440*01a344a2SDavid du Colombier 		break;
441*01a344a2SDavid du Colombier 
442*01a344a2SDavid du Colombier 	case Rwrite:
443*01a344a2SDavid du Colombier 		SHORT(fid);
444*01a344a2SDavid du Colombier 		SHORT(count);
445*01a344a2SDavid du Colombier 		break;
446*01a344a2SDavid du Colombier 
447*01a344a2SDavid du Colombier 	case Rstat:
448*01a344a2SDavid du Colombier 		SHORT(fid);
449*01a344a2SDavid du Colombier 		BYTES(stat, sizeof(f->stat));
450*01a344a2SDavid du Colombier 		break;
451*01a344a2SDavid du Colombier 	}
452*01a344a2SDavid du Colombier 	if((uchar*)ap+n == p)
453*01a344a2SDavid du Colombier 		return n;
454*01a344a2SDavid du Colombier 	return 0;
455*01a344a2SDavid du Colombier }
456*01a344a2SDavid du Colombier 
457*01a344a2SDavid du Colombier int
convM2D9p1(char * ap,Dentry * f)458*01a344a2SDavid du Colombier convM2D9p1(char *ap, Dentry *f)
459*01a344a2SDavid du Colombier {
460*01a344a2SDavid du Colombier 	uchar *p;
461*01a344a2SDavid du Colombier 	char str[NAMELEN];
462*01a344a2SDavid du Colombier 
463*01a344a2SDavid du Colombier 	p = (uchar*)ap;
464*01a344a2SDavid du Colombier 	BYTES(name, sizeof(f->name));
465*01a344a2SDavid du Colombier 
466*01a344a2SDavid du Colombier 	memmove(str, p, NAMELEN);
467*01a344a2SDavid du Colombier 	p += NAMELEN;
468*01a344a2SDavid du Colombier 	f->uid = strtouid(str);
469*01a344a2SDavid du Colombier 
470*01a344a2SDavid du Colombier 	memmove(str, p, NAMELEN);
471*01a344a2SDavid du Colombier 	p += NAMELEN;
472*01a344a2SDavid du Colombier 	f->gid = strtouid(str);
473*01a344a2SDavid du Colombier 
474*01a344a2SDavid du Colombier 	LONG(qid.path);
475*01a344a2SDavid du Colombier 	LONG(qid.version);
476*01a344a2SDavid du Colombier 
477*01a344a2SDavid du Colombier 	LONG(atime);
478*01a344a2SDavid du Colombier 	f->mode = (f->atime & 0x0fff) | DALLOC;
479*01a344a2SDavid du Colombier 	if(f->atime & PDIR)
480*01a344a2SDavid du Colombier 		f->mode |= DDIR;
481*01a344a2SDavid du Colombier 	if(f->atime & PAPND)
482*01a344a2SDavid du Colombier 		f->mode |= DAPND;
483*01a344a2SDavid du Colombier 	if(f->atime & PLOCK)
484*01a344a2SDavid du Colombier 		f->mode |= DLOCK;
485*01a344a2SDavid du Colombier 
486*01a344a2SDavid du Colombier 	LONG(atime);
487*01a344a2SDavid du Colombier 	LONG(mtime);
488*01a344a2SDavid du Colombier 	VLONG(size);
489*01a344a2SDavid du Colombier 	p += 4;
490*01a344a2SDavid du Colombier 	return p - (uchar*)ap;
491*01a344a2SDavid du Colombier }
492*01a344a2SDavid du Colombier 
493*01a344a2SDavid du Colombier void
convM2A9p1(char * ap,Authenticator * f,char * key)494*01a344a2SDavid du Colombier convM2A9p1(char *ap, Authenticator *f, char *key)
495*01a344a2SDavid du Colombier {
496*01a344a2SDavid du Colombier 	uchar *p;
497*01a344a2SDavid du Colombier 
498*01a344a2SDavid du Colombier 	if(key)
499*01a344a2SDavid du Colombier 		decrypt(key, ap, AUTHENTLEN);
500*01a344a2SDavid du Colombier 	p = (uchar*)ap;
501*01a344a2SDavid du Colombier 	CHAR(num);
502*01a344a2SDavid du Colombier 	BYTES(chal, CHALLEN);
503*01a344a2SDavid du Colombier 	LONG(id);
504*01a344a2SDavid du Colombier 	USED(p);
505*01a344a2SDavid du Colombier }
506*01a344a2SDavid du Colombier 
507*01a344a2SDavid du Colombier void
convM2T9p1(char * ap,Ticket * f,char * key)508*01a344a2SDavid du Colombier convM2T9p1(char *ap, Ticket *f, char *key)
509*01a344a2SDavid du Colombier {
510*01a344a2SDavid du Colombier 	uchar *p;
511*01a344a2SDavid du Colombier 
512*01a344a2SDavid du Colombier 	if(key)
513*01a344a2SDavid du Colombier 		decrypt(key, ap, TICKETLEN);
514*01a344a2SDavid du Colombier 	p = (uchar*)ap;
515*01a344a2SDavid du Colombier 	CHAR(num);
516*01a344a2SDavid du Colombier 	BYTES(chal, CHALLEN);
517*01a344a2SDavid du Colombier 	STRING(cuid, NAMELEN);
518*01a344a2SDavid du Colombier 	f->cuid[NAMELEN-1] = 0;
519*01a344a2SDavid du Colombier 	STRING(suid, NAMELEN);
520*01a344a2SDavid du Colombier 	f->suid[NAMELEN-1] = 0;
521*01a344a2SDavid du Colombier 	BYTES(key, DESKEYLEN);
522*01a344a2SDavid du Colombier 	USED(p);
523*01a344a2SDavid du Colombier }
524