xref: /plan9/sys/src/cmd/unix/u9fs/fcall.h (revision 9a747e4fd48b9f4522c70c07e8f882a15030f964)
1*9a747e4fSDavid du Colombier #define	VERSION9P	"9P2000"
2*9a747e4fSDavid du Colombier #define	MAXWELEM	16
3*9a747e4fSDavid du Colombier 
4*9a747e4fSDavid du Colombier typedef
5*9a747e4fSDavid du Colombier struct	Fcall
6*9a747e4fSDavid du Colombier {
7*9a747e4fSDavid du Colombier 	uchar	type;
8*9a747e4fSDavid du Colombier 	u32int	fid;
9*9a747e4fSDavid du Colombier 	ushort	tag;
10*9a747e4fSDavid du Colombier 
11*9a747e4fSDavid du Colombier 	u32int	msize;		/* Tversion, Rversion */
12*9a747e4fSDavid du Colombier 	char	*version;	/* Tversion, Rversion */
13*9a747e4fSDavid du Colombier 
14*9a747e4fSDavid du Colombier 	u32int	oldtag;		/* Tflush */
15*9a747e4fSDavid du Colombier 
16*9a747e4fSDavid du Colombier 	char	*ename;		/* Rerror */
17*9a747e4fSDavid du Colombier 
18*9a747e4fSDavid du Colombier 	Qid	qid;		/* Rattach, Ropen, Rcreate */
19*9a747e4fSDavid du Colombier 	u32int	iounit;		/* Ropen, Rcreate */
20*9a747e4fSDavid du Colombier 
21*9a747e4fSDavid du Colombier 	char	*uname;		/* Tattach, Tauth */
22*9a747e4fSDavid du Colombier 	char	*aname;		/* Tattach, Tauth */
23*9a747e4fSDavid du Colombier 
24*9a747e4fSDavid du Colombier 
25*9a747e4fSDavid du Colombier 	u32int	perm;		/* Tcreate */
26*9a747e4fSDavid du Colombier 	char	*name;		/* Tcreate */
27*9a747e4fSDavid du Colombier 	uchar	mode;		/* Tcreate, Topen */
28*9a747e4fSDavid du Colombier 
29*9a747e4fSDavid du Colombier 	u32int	newfid;		/* Twalk */
30*9a747e4fSDavid du Colombier 	ushort	nwname;		/* Twalk */
31*9a747e4fSDavid du Colombier 	char	*wname[MAXWELEM];	/* Twalk */
32*9a747e4fSDavid du Colombier 
33*9a747e4fSDavid du Colombier 	ushort	nwqid;		/* Rwalk */
34*9a747e4fSDavid du Colombier 	Qid	wqid[MAXWELEM];		/* Rwalk */
35*9a747e4fSDavid du Colombier 
36*9a747e4fSDavid du Colombier 	vlong	offset;		/* Tread, Twrite */
37*9a747e4fSDavid du Colombier 	u32int	count;		/* Tread, Twrite, Rread */
38*9a747e4fSDavid du Colombier 	char	*data;		/* Twrite, Rread */
39*9a747e4fSDavid du Colombier 
40*9a747e4fSDavid du Colombier 	ushort	nstat;		/* Twstat, Rstat */
41*9a747e4fSDavid du Colombier 	uchar	*stat;		/* Twstat, Rstat */
42*9a747e4fSDavid du Colombier 
43*9a747e4fSDavid du Colombier 	u32int	afid;		/* Tauth, Tattach */
44*9a747e4fSDavid du Colombier 	Qid aqid;		/* Rauth */
45*9a747e4fSDavid du Colombier } Fcall;
46*9a747e4fSDavid du Colombier 
47*9a747e4fSDavid du Colombier 
48*9a747e4fSDavid du Colombier #define	GBIT8(p)	((p)[0])
49*9a747e4fSDavid du Colombier #define	GBIT16(p)	((p)[0]|((p)[1]<<8))
50*9a747e4fSDavid du Colombier #define	GBIT32(p)	((p)[0]|((p)[1]<<8)|((p)[2]<<16)|((p)[3]<<24))
51*9a747e4fSDavid du Colombier #define	GBIT64(p)	((ulong)((p)[0]|((p)[1]<<8)|((p)[2]<<16)|((p)[3]<<24)) |\
52*9a747e4fSDavid du Colombier 				((vlong)((p)[4]|((p)[5]<<8)|((p)[6]<<16)|((p)[7]<<24)) << 32))
53*9a747e4fSDavid du Colombier 
54*9a747e4fSDavid du Colombier #define	PBIT8(p,v)	(p)[0]=(v)
55*9a747e4fSDavid du Colombier #define	PBIT16(p,v)	(p)[0]=(v);(p)[1]=(v)>>8
56*9a747e4fSDavid du Colombier #define	PBIT32(p,v)	(p)[0]=(v);(p)[1]=(v)>>8;(p)[2]=(v)>>16;(p)[3]=(v)>>24
57*9a747e4fSDavid du Colombier #define	PBIT64(p,v)	(p)[0]=(v);(p)[1]=(v)>>8;(p)[2]=(v)>>16;(p)[3]=(v)>>24;\
58*9a747e4fSDavid du Colombier 			(p)[4]=(v)>>32;(p)[5]=(v)>>40;(p)[6]=(v)>>48;(p)[7]=(v)>>56
59*9a747e4fSDavid du Colombier 
60*9a747e4fSDavid du Colombier #define	BIT8SZ		1
61*9a747e4fSDavid du Colombier #define	BIT16SZ		2
62*9a747e4fSDavid du Colombier #define	BIT32SZ		4
63*9a747e4fSDavid du Colombier #define	BIT64SZ		8
64*9a747e4fSDavid du Colombier #define	QIDSZ	(BIT8SZ+BIT32SZ+BIT64SZ)
65*9a747e4fSDavid du Colombier 
66*9a747e4fSDavid du Colombier /* STATFIXLEN includes leading 16-bit count */
67*9a747e4fSDavid du Colombier /* The count, however, excludes itself; total size is BIT16SZ+count */
68*9a747e4fSDavid du Colombier #define STATFIXLEN	(BIT16SZ+QIDSZ+5*BIT16SZ+4*BIT32SZ+1*BIT64SZ)	/* amount of fixed length data in a stat buffer */
69*9a747e4fSDavid du Colombier 
70*9a747e4fSDavid du Colombier #define	MAXMSG		10000	/* max header sans data */
71*9a747e4fSDavid du Colombier #define	NOTAG		~0U	/* Dummy tag */
72*9a747e4fSDavid du Colombier #define	IOHDRSZ		24	/* ample room for Twrite/Rread header (iounit) */
73*9a747e4fSDavid du Colombier 
74*9a747e4fSDavid du Colombier enum
75*9a747e4fSDavid du Colombier {
76*9a747e4fSDavid du Colombier 	Tversion =	100,
77*9a747e4fSDavid du Colombier 	Rversion,
78*9a747e4fSDavid du Colombier 	Tauth =		102,
79*9a747e4fSDavid du Colombier 	Rauth,
80*9a747e4fSDavid du Colombier 	Tattach =	104,
81*9a747e4fSDavid du Colombier 	Rattach,
82*9a747e4fSDavid du Colombier 	Terror =	106,	/* illegal */
83*9a747e4fSDavid du Colombier 	Rerror,
84*9a747e4fSDavid du Colombier 	Tflush =	108,
85*9a747e4fSDavid du Colombier 	Rflush,
86*9a747e4fSDavid du Colombier 	Twalk =		110,
87*9a747e4fSDavid du Colombier 	Rwalk,
88*9a747e4fSDavid du Colombier 	Topen =		112,
89*9a747e4fSDavid du Colombier 	Ropen,
90*9a747e4fSDavid du Colombier 	Tcreate =	114,
91*9a747e4fSDavid du Colombier 	Rcreate,
92*9a747e4fSDavid du Colombier 	Tread =		116,
93*9a747e4fSDavid du Colombier 	Rread,
94*9a747e4fSDavid du Colombier 	Twrite =	118,
95*9a747e4fSDavid du Colombier 	Rwrite,
96*9a747e4fSDavid du Colombier 	Tclunk =	120,
97*9a747e4fSDavid du Colombier 	Rclunk,
98*9a747e4fSDavid du Colombier 	Tremove =	122,
99*9a747e4fSDavid du Colombier 	Rremove,
100*9a747e4fSDavid du Colombier 	Tstat =		124,
101*9a747e4fSDavid du Colombier 	Rstat,
102*9a747e4fSDavid du Colombier 	Twstat =	126,
103*9a747e4fSDavid du Colombier 	Rwstat,
104*9a747e4fSDavid du Colombier 	Tmax
105*9a747e4fSDavid du Colombier };
106*9a747e4fSDavid du Colombier 
107*9a747e4fSDavid du Colombier uint	convM2S(uchar*, uint, Fcall*);
108*9a747e4fSDavid du Colombier uint	convS2M(Fcall*, uchar*, uint);
109*9a747e4fSDavid du Colombier 
110*9a747e4fSDavid du Colombier int	statcheck(uchar *abuf, uint nbuf);
111*9a747e4fSDavid du Colombier uint	convM2D(uchar*, uint, Dir*, char*);
112*9a747e4fSDavid du Colombier uint	convD2M(Dir*, uchar*, uint);
113*9a747e4fSDavid du Colombier uint	sizeD2M(Dir*);
114*9a747e4fSDavid du Colombier 
115*9a747e4fSDavid du Colombier int	fcallconv(va_list*, Fconv*);
116*9a747e4fSDavid du Colombier int	dirconv(va_list*, Fconv*);
117*9a747e4fSDavid du Colombier int	dirmodeconv(va_list*, Fconv*);
118*9a747e4fSDavid du Colombier 
119*9a747e4fSDavid du Colombier int	read9pmsg(int, void*, uint);
120*9a747e4fSDavid du Colombier 
121*9a747e4fSDavid du Colombier enum {
122*9a747e4fSDavid du Colombier 	NOFID = 0xFFFFFFFF,
123*9a747e4fSDavid du Colombier };
124