xref: /plan9-contrib/sys/src/ape/lib/ap/plan9/_fcall.c (revision 219b2ee8daee37f4aad58d63f21287faa8e4ffdc)
13e12c5d1SDavid du Colombier #include	<string.h>
23e12c5d1SDavid du Colombier #include	"sys9.h"
3*219b2ee8SDavid du Colombier #include	"lib.h"
43e12c5d1SDavid du Colombier #include	"dir.h"
53e12c5d1SDavid du Colombier #include	"fcall.h"
63e12c5d1SDavid du Colombier 
73e12c5d1SDavid du Colombier typedef unsigned char uchar;
83e12c5d1SDavid du Colombier 
93e12c5d1SDavid du Colombier #define	CHAR(x)		*p++ = f->x
103e12c5d1SDavid du Colombier #define	SHORT(x)	p[0] = f->x; p[1] = f->x>>8; p += 2
113e12c5d1SDavid 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
123e12c5d1SDavid du Colombier #define	VLONG(x)	p[0] = f->x; p[1] = f->x>>8; p[2] = f->x>>16; p[3] = f->x>>24;\
133e12c5d1SDavid du Colombier 				p[4] = 0; p[5] = 0; p[6] = 0; p[7] = 0; p += 8
143e12c5d1SDavid du Colombier #define	STRING(x,n)	memcpy(p, f->x, n); p += n
153e12c5d1SDavid du Colombier 
163e12c5d1SDavid du Colombier int
convS2M(Fcall * f,char * ap)173e12c5d1SDavid du Colombier convS2M(Fcall *f, char *ap)
183e12c5d1SDavid du Colombier {
193e12c5d1SDavid du Colombier 	uchar *p;
203e12c5d1SDavid du Colombier 
213e12c5d1SDavid du Colombier 	p = (uchar*)ap;
223e12c5d1SDavid du Colombier 	CHAR(type);
233e12c5d1SDavid du Colombier 	SHORT(tag);
243e12c5d1SDavid du Colombier 	switch(f->type)
253e12c5d1SDavid du Colombier 	{
263e12c5d1SDavid du Colombier 	default:
273e12c5d1SDavid du Colombier 		return 0;
283e12c5d1SDavid du Colombier 
29*219b2ee8SDavid du Colombier 	case Tosession:
303e12c5d1SDavid du Colombier 	case Tnop:
313e12c5d1SDavid du Colombier 		break;
323e12c5d1SDavid du Colombier 
333e12c5d1SDavid du Colombier 	case Tsession:
34*219b2ee8SDavid du Colombier 		STRING(chal, sizeof(f->chal));
353e12c5d1SDavid du Colombier 		break;
363e12c5d1SDavid du Colombier 
373e12c5d1SDavid du Colombier 	case Tflush:
383e12c5d1SDavid du Colombier 		SHORT(oldtag);
393e12c5d1SDavid du Colombier 		break;
403e12c5d1SDavid du Colombier 
413e12c5d1SDavid du Colombier 	case Tattach:
423e12c5d1SDavid du Colombier 		SHORT(fid);
433e12c5d1SDavid du Colombier 		STRING(uname, sizeof(f->uname));
443e12c5d1SDavid du Colombier 		STRING(aname, sizeof(f->aname));
45*219b2ee8SDavid du Colombier 		STRING(ticket, sizeof(f->ticket));
463e12c5d1SDavid du Colombier 		STRING(auth, sizeof(f->auth));
473e12c5d1SDavid du Colombier 		break;
483e12c5d1SDavid du Colombier 
49*219b2ee8SDavid du Colombier 	case Toattach:
50*219b2ee8SDavid du Colombier 		SHORT(fid);
51*219b2ee8SDavid du Colombier 		STRING(uname, sizeof(f->uname));
52*219b2ee8SDavid du Colombier 		STRING(aname, sizeof(f->aname));
53*219b2ee8SDavid du Colombier 		STRING(ticket, NAMELEN);
54*219b2ee8SDavid du Colombier 		break;
55*219b2ee8SDavid du Colombier 
563e12c5d1SDavid du Colombier 	case Tauth:
573e12c5d1SDavid du Colombier 		SHORT(fid);
583e12c5d1SDavid du Colombier 		STRING(uname, sizeof(f->uname));
59*219b2ee8SDavid du Colombier 		STRING(ticket, 8+NAMELEN);
603e12c5d1SDavid du Colombier 		break;
613e12c5d1SDavid du Colombier 
623e12c5d1SDavid du Colombier 	case Tclone:
633e12c5d1SDavid du Colombier 		SHORT(fid);
643e12c5d1SDavid du Colombier 		SHORT(newfid);
653e12c5d1SDavid du Colombier 		break;
663e12c5d1SDavid du Colombier 
673e12c5d1SDavid du Colombier 	case Twalk:
683e12c5d1SDavid du Colombier 		SHORT(fid);
693e12c5d1SDavid du Colombier 		STRING(name, sizeof(f->name));
703e12c5d1SDavid du Colombier 		break;
713e12c5d1SDavid du Colombier 
723e12c5d1SDavid du Colombier 	case Topen:
733e12c5d1SDavid du Colombier 		SHORT(fid);
743e12c5d1SDavid du Colombier 		CHAR(mode);
753e12c5d1SDavid du Colombier 		break;
763e12c5d1SDavid du Colombier 
773e12c5d1SDavid du Colombier 	case Tcreate:
783e12c5d1SDavid du Colombier 		SHORT(fid);
793e12c5d1SDavid du Colombier 		STRING(name, sizeof(f->name));
803e12c5d1SDavid du Colombier 		LONG(perm);
813e12c5d1SDavid du Colombier 		CHAR(mode);
823e12c5d1SDavid du Colombier 		break;
833e12c5d1SDavid du Colombier 
843e12c5d1SDavid du Colombier 	case Tread:
853e12c5d1SDavid du Colombier 		SHORT(fid);
863e12c5d1SDavid du Colombier 		VLONG(offset);
873e12c5d1SDavid du Colombier 		SHORT(count);
883e12c5d1SDavid du Colombier 		break;
893e12c5d1SDavid du Colombier 
903e12c5d1SDavid du Colombier 	case Twrite:
913e12c5d1SDavid du Colombier 		SHORT(fid);
923e12c5d1SDavid du Colombier 		VLONG(offset);
933e12c5d1SDavid du Colombier 		SHORT(count);
943e12c5d1SDavid du Colombier 		p++;	/* pad(1) */
953e12c5d1SDavid du Colombier 		STRING(data, f->count);
963e12c5d1SDavid du Colombier 		break;
973e12c5d1SDavid du Colombier 
983e12c5d1SDavid du Colombier 	case Tclunk:
993e12c5d1SDavid du Colombier 		SHORT(fid);
1003e12c5d1SDavid du Colombier 		break;
1013e12c5d1SDavid du Colombier 
1023e12c5d1SDavid du Colombier 	case Tremove:
1033e12c5d1SDavid du Colombier 		SHORT(fid);
1043e12c5d1SDavid du Colombier 		break;
1053e12c5d1SDavid du Colombier 
1063e12c5d1SDavid du Colombier 	case Tstat:
1073e12c5d1SDavid du Colombier 		SHORT(fid);
1083e12c5d1SDavid du Colombier 		break;
1093e12c5d1SDavid du Colombier 
1103e12c5d1SDavid du Colombier 	case Twstat:
1113e12c5d1SDavid du Colombier 		SHORT(fid);
1123e12c5d1SDavid du Colombier 		STRING(stat, sizeof(f->stat));
1133e12c5d1SDavid du Colombier 		break;
1143e12c5d1SDavid du Colombier 
1153e12c5d1SDavid du Colombier 	case Tclwalk:
1163e12c5d1SDavid du Colombier 		SHORT(fid);
1173e12c5d1SDavid du Colombier 		SHORT(newfid);
1183e12c5d1SDavid du Colombier 		STRING(name, sizeof(f->name));
1193e12c5d1SDavid du Colombier 		break;
1203e12c5d1SDavid du Colombier /*
1213e12c5d1SDavid du Colombier  */
122*219b2ee8SDavid du Colombier 	case Rosession:
1233e12c5d1SDavid du Colombier 	case Rnop:
1243e12c5d1SDavid du Colombier 		break;
1253e12c5d1SDavid du Colombier 
1263e12c5d1SDavid du Colombier 	case Rsession:
127*219b2ee8SDavid du Colombier 		STRING(chal, sizeof(f->chal));
128*219b2ee8SDavid du Colombier 		STRING(authid, sizeof(f->authid));
129*219b2ee8SDavid du Colombier 		STRING(authdom, sizeof(f->authdom));
1303e12c5d1SDavid du Colombier 		break;
1313e12c5d1SDavid du Colombier 
1323e12c5d1SDavid du Colombier 	case Rerror:
1333e12c5d1SDavid du Colombier 		STRING(ename, sizeof(f->ename));
1343e12c5d1SDavid du Colombier 		break;
1353e12c5d1SDavid du Colombier 
1363e12c5d1SDavid du Colombier 	case Rflush:
1373e12c5d1SDavid du Colombier 		break;
1383e12c5d1SDavid du Colombier 
1393e12c5d1SDavid du Colombier 	case Rattach:
1403e12c5d1SDavid du Colombier 		SHORT(fid);
1413e12c5d1SDavid du Colombier 		LONG(qid.path);
1423e12c5d1SDavid du Colombier 		LONG(qid.vers);
143*219b2ee8SDavid du Colombier 		STRING(rauth, sizeof(f->rauth));
144*219b2ee8SDavid du Colombier 		break;
145*219b2ee8SDavid du Colombier 
146*219b2ee8SDavid du Colombier 	case Roattach:
147*219b2ee8SDavid du Colombier 		SHORT(fid);
148*219b2ee8SDavid du Colombier 		LONG(qid.path);
149*219b2ee8SDavid du Colombier 		LONG(qid.vers);
1503e12c5d1SDavid du Colombier 		break;
1513e12c5d1SDavid du Colombier 
1523e12c5d1SDavid du Colombier 	case Rauth:
1533e12c5d1SDavid du Colombier 		SHORT(fid);
154*219b2ee8SDavid du Colombier 		STRING(ticket, 8+8+7+7);
1553e12c5d1SDavid du Colombier 		break;
1563e12c5d1SDavid du Colombier 
1573e12c5d1SDavid du Colombier 	case Rclone:
1583e12c5d1SDavid du Colombier 		SHORT(fid);
1593e12c5d1SDavid du Colombier 		break;
1603e12c5d1SDavid du Colombier 
1613e12c5d1SDavid du Colombier 	case Rwalk:
1623e12c5d1SDavid du Colombier 	case Rclwalk:
1633e12c5d1SDavid du Colombier 		SHORT(fid);
1643e12c5d1SDavid du Colombier 		LONG(qid.path);
1653e12c5d1SDavid du Colombier 		LONG(qid.vers);
1663e12c5d1SDavid du Colombier 		break;
1673e12c5d1SDavid du Colombier 
1683e12c5d1SDavid du Colombier 	case Ropen:
1693e12c5d1SDavid du Colombier 		SHORT(fid);
1703e12c5d1SDavid du Colombier 		LONG(qid.path);
1713e12c5d1SDavid du Colombier 		LONG(qid.vers);
1723e12c5d1SDavid du Colombier 		break;
1733e12c5d1SDavid du Colombier 
1743e12c5d1SDavid du Colombier 	case Rcreate:
1753e12c5d1SDavid du Colombier 		SHORT(fid);
1763e12c5d1SDavid du Colombier 		LONG(qid.path);
1773e12c5d1SDavid du Colombier 		LONG(qid.vers);
1783e12c5d1SDavid du Colombier 		break;
1793e12c5d1SDavid du Colombier 
1803e12c5d1SDavid du Colombier 	case Rread:
1813e12c5d1SDavid du Colombier 		SHORT(fid);
1823e12c5d1SDavid du Colombier 		SHORT(count);
1833e12c5d1SDavid du Colombier 		p++;	/* pad(1) */
1843e12c5d1SDavid du Colombier 		STRING(data, f->count);
1853e12c5d1SDavid du Colombier 		break;
1863e12c5d1SDavid du Colombier 
1873e12c5d1SDavid du Colombier 	case Rwrite:
1883e12c5d1SDavid du Colombier 		SHORT(fid);
1893e12c5d1SDavid du Colombier 		SHORT(count);
1903e12c5d1SDavid du Colombier 		break;
1913e12c5d1SDavid du Colombier 
1923e12c5d1SDavid du Colombier 	case Rclunk:
1933e12c5d1SDavid du Colombier 		SHORT(fid);
1943e12c5d1SDavid du Colombier 		break;
1953e12c5d1SDavid du Colombier 
1963e12c5d1SDavid du Colombier 	case Rremove:
1973e12c5d1SDavid du Colombier 		SHORT(fid);
1983e12c5d1SDavid du Colombier 		break;
1993e12c5d1SDavid du Colombier 
2003e12c5d1SDavid du Colombier 	case Rstat:
2013e12c5d1SDavid du Colombier 		SHORT(fid);
2023e12c5d1SDavid du Colombier 		STRING(stat, sizeof(f->stat));
2033e12c5d1SDavid du Colombier 		break;
2043e12c5d1SDavid du Colombier 
2053e12c5d1SDavid du Colombier 	case Rwstat:
2063e12c5d1SDavid du Colombier 		SHORT(fid);
2073e12c5d1SDavid du Colombier 		break;
2083e12c5d1SDavid du Colombier 	}
2093e12c5d1SDavid du Colombier 	return p - (uchar*)ap;
2103e12c5d1SDavid du Colombier }
2113e12c5d1SDavid du Colombier 
2123e12c5d1SDavid du Colombier #undef	CHAR
2133e12c5d1SDavid du Colombier #undef	SHORT
2143e12c5d1SDavid du Colombier #undef	LONG
2153e12c5d1SDavid du Colombier #undef	VLONG
2163e12c5d1SDavid du Colombier #undef	STRING
2173e12c5d1SDavid du Colombier 
2183e12c5d1SDavid du Colombier #define	CHAR(x)		f->x = *p++
2193e12c5d1SDavid du Colombier #define	SHORT(x)	f->x = (p[0] | (p[1]<<8)); p += 2
2203e12c5d1SDavid du Colombier #define	LONG(x)		f->x = (p[0] | (p[1]<<8) |\
2213e12c5d1SDavid du Colombier 				(p[2]<<16) | (p[3]<<24)); p += 4
2223e12c5d1SDavid du Colombier #define	VLONG(x)	f->x = (p[0] | (p[1]<<8) |\
2233e12c5d1SDavid du Colombier 				(p[2]<<16) | (p[3]<<24)); p += 8
2243e12c5d1SDavid du Colombier #define	STRING(x,n)	memcpy(f->x, p, n); p += n
2253e12c5d1SDavid du Colombier 
2263e12c5d1SDavid du Colombier int
convM2S(char * ap,Fcall * f,int n)2273e12c5d1SDavid du Colombier convM2S(char *ap, Fcall *f, int n)
2283e12c5d1SDavid du Colombier {
2293e12c5d1SDavid du Colombier 	uchar *p;
2303e12c5d1SDavid du Colombier 
2313e12c5d1SDavid du Colombier 	p = (uchar*)ap;
2323e12c5d1SDavid du Colombier 	CHAR(type);
2333e12c5d1SDavid du Colombier 	SHORT(tag);
2343e12c5d1SDavid du Colombier 	switch(f->type)
2353e12c5d1SDavid du Colombier 	{
2363e12c5d1SDavid du Colombier 	default:
2373e12c5d1SDavid du Colombier 		return 0;
2383e12c5d1SDavid du Colombier 
2393e12c5d1SDavid du Colombier 	case Tnop:
240*219b2ee8SDavid du Colombier 	case Tosession:
2413e12c5d1SDavid du Colombier 		break;
2423e12c5d1SDavid du Colombier 
2433e12c5d1SDavid du Colombier 	case Tsession:
244*219b2ee8SDavid du Colombier 		STRING(chal, sizeof(f->chal));
2453e12c5d1SDavid du Colombier 		break;
2463e12c5d1SDavid du Colombier 
2473e12c5d1SDavid du Colombier 	case Tflush:
2483e12c5d1SDavid du Colombier 		SHORT(oldtag);
2493e12c5d1SDavid du Colombier 		break;
2503e12c5d1SDavid du Colombier 
2513e12c5d1SDavid du Colombier 	case Tattach:
2523e12c5d1SDavid du Colombier 		SHORT(fid);
2533e12c5d1SDavid du Colombier 		STRING(uname, sizeof(f->uname));
2543e12c5d1SDavid du Colombier 		STRING(aname, sizeof(f->aname));
255*219b2ee8SDavid du Colombier 		STRING(ticket, sizeof(f->ticket));
2563e12c5d1SDavid du Colombier 		STRING(auth, sizeof(f->auth));
2573e12c5d1SDavid du Colombier 		break;
2583e12c5d1SDavid du Colombier 
259*219b2ee8SDavid du Colombier 	case Toattach:
260*219b2ee8SDavid du Colombier 		SHORT(fid);
261*219b2ee8SDavid du Colombier 		STRING(uname, sizeof(f->uname));
262*219b2ee8SDavid du Colombier 		STRING(aname, sizeof(f->aname));
263*219b2ee8SDavid du Colombier 		STRING(ticket, NAMELEN);
264*219b2ee8SDavid du Colombier 		break;
265*219b2ee8SDavid du Colombier 
2663e12c5d1SDavid du Colombier 	case Tauth:
2673e12c5d1SDavid du Colombier 		SHORT(fid);
2683e12c5d1SDavid du Colombier 		STRING(uname, sizeof(f->uname));
269*219b2ee8SDavid du Colombier 		STRING(ticket, 8+NAMELEN);
2703e12c5d1SDavid du Colombier 		break;
2713e12c5d1SDavid du Colombier 
2723e12c5d1SDavid du Colombier 	case Tclone:
2733e12c5d1SDavid du Colombier 		SHORT(fid);
2743e12c5d1SDavid du Colombier 		SHORT(newfid);
2753e12c5d1SDavid du Colombier 		break;
2763e12c5d1SDavid du Colombier 
2773e12c5d1SDavid du Colombier 	case Twalk:
2783e12c5d1SDavid du Colombier 		SHORT(fid);
2793e12c5d1SDavid du Colombier 		STRING(name, sizeof(f->name));
2803e12c5d1SDavid du Colombier 		break;
2813e12c5d1SDavid du Colombier 
2823e12c5d1SDavid du Colombier 	case Topen:
2833e12c5d1SDavid du Colombier 		SHORT(fid);
2843e12c5d1SDavid du Colombier 		CHAR(mode);
2853e12c5d1SDavid du Colombier 		break;
2863e12c5d1SDavid du Colombier 
2873e12c5d1SDavid du Colombier 	case Tcreate:
2883e12c5d1SDavid du Colombier 		SHORT(fid);
2893e12c5d1SDavid du Colombier 		STRING(name, sizeof(f->name));
2903e12c5d1SDavid du Colombier 		LONG(perm);
2913e12c5d1SDavid du Colombier 		CHAR(mode);
2923e12c5d1SDavid du Colombier 		break;
2933e12c5d1SDavid du Colombier 
2943e12c5d1SDavid du Colombier 	case Tread:
2953e12c5d1SDavid du Colombier 		SHORT(fid);
2963e12c5d1SDavid du Colombier 		VLONG(offset);
2973e12c5d1SDavid du Colombier 		SHORT(count);
2983e12c5d1SDavid du Colombier 		break;
2993e12c5d1SDavid du Colombier 
3003e12c5d1SDavid du Colombier 	case Twrite:
3013e12c5d1SDavid du Colombier 		SHORT(fid);
3023e12c5d1SDavid du Colombier 		VLONG(offset);
3033e12c5d1SDavid du Colombier 		SHORT(count);
3043e12c5d1SDavid du Colombier 		p++;	/* pad(1) */
3053e12c5d1SDavid du Colombier 		f->data = (char*)p; p += f->count;
3063e12c5d1SDavid du Colombier 		break;
3073e12c5d1SDavid du Colombier 
3083e12c5d1SDavid du Colombier 	case Tclunk:
3093e12c5d1SDavid du Colombier 		SHORT(fid);
3103e12c5d1SDavid du Colombier 		break;
3113e12c5d1SDavid du Colombier 
3123e12c5d1SDavid du Colombier 	case Tremove:
3133e12c5d1SDavid du Colombier 		SHORT(fid);
3143e12c5d1SDavid du Colombier 		break;
3153e12c5d1SDavid du Colombier 
3163e12c5d1SDavid du Colombier 	case Tstat:
3173e12c5d1SDavid du Colombier 		SHORT(fid);
3183e12c5d1SDavid du Colombier 		break;
3193e12c5d1SDavid du Colombier 
3203e12c5d1SDavid du Colombier 	case Twstat:
3213e12c5d1SDavid du Colombier 		SHORT(fid);
3223e12c5d1SDavid du Colombier 		STRING(stat, sizeof(f->stat));
3233e12c5d1SDavid du Colombier 		break;
3243e12c5d1SDavid du Colombier 
3253e12c5d1SDavid du Colombier 	case Tclwalk:
3263e12c5d1SDavid du Colombier 		SHORT(fid);
3273e12c5d1SDavid du Colombier 		SHORT(newfid);
3283e12c5d1SDavid du Colombier 		STRING(name, sizeof(f->name));
3293e12c5d1SDavid du Colombier 		break;
3303e12c5d1SDavid du Colombier /*
3313e12c5d1SDavid du Colombier  */
3323e12c5d1SDavid du Colombier 	case Rnop:
333*219b2ee8SDavid du Colombier 	case Rosession:
3343e12c5d1SDavid du Colombier 		break;
3353e12c5d1SDavid du Colombier 
3363e12c5d1SDavid du Colombier 	case Rsession:
337*219b2ee8SDavid du Colombier 		STRING(chal, sizeof(f->chal));
338*219b2ee8SDavid du Colombier 		STRING(authid, sizeof(f->authid));
339*219b2ee8SDavid du Colombier 		STRING(authdom, sizeof(f->authdom));
3403e12c5d1SDavid du Colombier 		break;
3413e12c5d1SDavid du Colombier 
3423e12c5d1SDavid du Colombier 	case Rerror:
3433e12c5d1SDavid du Colombier 		STRING(ename, sizeof(f->ename));
3443e12c5d1SDavid du Colombier 		break;
3453e12c5d1SDavid du Colombier 
3463e12c5d1SDavid du Colombier 	case Rflush:
3473e12c5d1SDavid du Colombier 		break;
3483e12c5d1SDavid du Colombier 
3493e12c5d1SDavid du Colombier 	case Rattach:
3503e12c5d1SDavid du Colombier 		SHORT(fid);
3513e12c5d1SDavid du Colombier 		LONG(qid.path);
3523e12c5d1SDavid du Colombier 		LONG(qid.vers);
353*219b2ee8SDavid du Colombier 		STRING(rauth, sizeof(f->rauth));
354*219b2ee8SDavid du Colombier 		break;
355*219b2ee8SDavid du Colombier 
356*219b2ee8SDavid du Colombier 	case Roattach:
357*219b2ee8SDavid du Colombier 		SHORT(fid);
358*219b2ee8SDavid du Colombier 		LONG(qid.path);
359*219b2ee8SDavid du Colombier 		LONG(qid.vers);
3603e12c5d1SDavid du Colombier 		break;
3613e12c5d1SDavid du Colombier 
3623e12c5d1SDavid du Colombier 	case Rauth:
3633e12c5d1SDavid du Colombier 		SHORT(fid);
364*219b2ee8SDavid du Colombier 		STRING(ticket, 8+8+7+7);
3653e12c5d1SDavid du Colombier 		break;
3663e12c5d1SDavid du Colombier 
3673e12c5d1SDavid du Colombier 	case Rclone:
3683e12c5d1SDavid du Colombier 		SHORT(fid);
3693e12c5d1SDavid du Colombier 		break;
3703e12c5d1SDavid du Colombier 
3713e12c5d1SDavid du Colombier 	case Rwalk:
3723e12c5d1SDavid du Colombier 	case Rclwalk:
3733e12c5d1SDavid du Colombier 		SHORT(fid);
3743e12c5d1SDavid du Colombier 		LONG(qid.path);
3753e12c5d1SDavid du Colombier 		LONG(qid.vers);
3763e12c5d1SDavid du Colombier 		break;
3773e12c5d1SDavid du Colombier 
3783e12c5d1SDavid du Colombier 	case Ropen:
3793e12c5d1SDavid du Colombier 		SHORT(fid);
3803e12c5d1SDavid du Colombier 		LONG(qid.path);
3813e12c5d1SDavid du Colombier 		LONG(qid.vers);
3823e12c5d1SDavid du Colombier 		break;
3833e12c5d1SDavid du Colombier 
3843e12c5d1SDavid du Colombier 	case Rcreate:
3853e12c5d1SDavid du Colombier 		SHORT(fid);
3863e12c5d1SDavid du Colombier 		LONG(qid.path);
3873e12c5d1SDavid du Colombier 		LONG(qid.vers);
3883e12c5d1SDavid du Colombier 		break;
3893e12c5d1SDavid du Colombier 
3903e12c5d1SDavid du Colombier 	case Rread:
3913e12c5d1SDavid du Colombier 		SHORT(fid);
3923e12c5d1SDavid du Colombier 		SHORT(count);
3933e12c5d1SDavid du Colombier 		p++;	/* pad(1) */
3943e12c5d1SDavid du Colombier 		f->data = (char*)p; p += f->count;
3953e12c5d1SDavid du Colombier 		break;
3963e12c5d1SDavid du Colombier 
3973e12c5d1SDavid du Colombier 	case Rwrite:
3983e12c5d1SDavid du Colombier 		SHORT(fid);
3993e12c5d1SDavid du Colombier 		SHORT(count);
4003e12c5d1SDavid du Colombier 		break;
4013e12c5d1SDavid du Colombier 
4023e12c5d1SDavid du Colombier 	case Rclunk:
4033e12c5d1SDavid du Colombier 		SHORT(fid);
4043e12c5d1SDavid du Colombier 		break;
4053e12c5d1SDavid du Colombier 
4063e12c5d1SDavid du Colombier 	case Rremove:
4073e12c5d1SDavid du Colombier 		SHORT(fid);
4083e12c5d1SDavid du Colombier 		break;
4093e12c5d1SDavid du Colombier 
4103e12c5d1SDavid du Colombier 	case Rstat:
4113e12c5d1SDavid du Colombier 		SHORT(fid);
4123e12c5d1SDavid du Colombier 		STRING(stat, sizeof(f->stat));
4133e12c5d1SDavid du Colombier 		break;
4143e12c5d1SDavid du Colombier 
4153e12c5d1SDavid du Colombier 	case Rwstat:
4163e12c5d1SDavid du Colombier 		SHORT(fid);
4173e12c5d1SDavid du Colombier 		break;
4183e12c5d1SDavid du Colombier 	}
4193e12c5d1SDavid du Colombier 	if((uchar*)ap+n == p)
4203e12c5d1SDavid du Colombier 		return n;
4213e12c5d1SDavid du Colombier 	return 0;
4223e12c5d1SDavid du Colombier }
423