xref: /plan9/sys/include/fcall.h (revision 593dc095aefb2a85c828727bbfa9da139a49bdf4)
19a747e4fSDavid du Colombier #pragma	src	"/sys/src/libc/9sys"
23e12c5d1SDavid du Colombier #pragma	lib	"libc.a"
33e12c5d1SDavid du Colombier 
49a747e4fSDavid du Colombier #define	VERSION9P	"9P2000"
59a747e4fSDavid du Colombier 
69a747e4fSDavid du Colombier #define	MAXWELEM	16
79a747e4fSDavid du Colombier 
8219b2ee8SDavid du Colombier typedef
93e12c5d1SDavid du Colombier struct	Fcall
103e12c5d1SDavid du Colombier {
119a747e4fSDavid du Colombier 	uchar	type;
129a747e4fSDavid du Colombier 	u32int	fid;
133e12c5d1SDavid du Colombier 	ushort	tag;
143e12c5d1SDavid du Colombier 	union {
153e12c5d1SDavid du Colombier 		struct {
169a747e4fSDavid du Colombier 			u32int	msize;		/* Tversion, Rversion */
179a747e4fSDavid du Colombier 			char	*version;	/* Tversion, Rversion */
189a747e4fSDavid du Colombier 		};
199a747e4fSDavid du Colombier 		struct {
203e12c5d1SDavid du Colombier 			ushort	oldtag;		/* Tflush */
213e12c5d1SDavid du Colombier 		};
223e12c5d1SDavid du Colombier 		struct {
239a747e4fSDavid du Colombier 			char	*ename;		/* Rerror */
243e12c5d1SDavid du Colombier 		};
253e12c5d1SDavid du Colombier 		struct {
269a747e4fSDavid du Colombier 			Qid	qid;		/* Rattach, Ropen, Rcreate */
279a747e4fSDavid du Colombier 			u32int	iounit;		/* Ropen, Rcreate */
283e12c5d1SDavid du Colombier 		};
293e12c5d1SDavid du Colombier 		struct {
309a747e4fSDavid du Colombier 			Qid	aqid;		/* Rauth */
319a747e4fSDavid du Colombier 		};
329a747e4fSDavid du Colombier 		struct {
339a747e4fSDavid du Colombier 			u32int	afid;		/* Tauth, Tattach */
349a747e4fSDavid du Colombier 			char	*uname;		/* Tauth, Tattach */
359a747e4fSDavid du Colombier 			char	*aname;		/* Tauth, Tattach */
369a747e4fSDavid du Colombier 		};
379a747e4fSDavid du Colombier 		struct {
389a747e4fSDavid du Colombier 			u32int	perm;		/* Tcreate */
399a747e4fSDavid du Colombier 			char	*name;		/* Tcreate */
409a747e4fSDavid du Colombier 			uchar	mode;		/* Tcreate, Topen */
419a747e4fSDavid du Colombier 		};
429a747e4fSDavid du Colombier 		struct {
439a747e4fSDavid du Colombier 			u32int	newfid;		/* Twalk */
449a747e4fSDavid du Colombier 			ushort	nwname;		/* Twalk */
459a747e4fSDavid du Colombier 			char	*wname[MAXWELEM];	/* Twalk */
469a747e4fSDavid du Colombier 		};
479a747e4fSDavid du Colombier 		struct {
489a747e4fSDavid du Colombier 			ushort	nwqid;		/* Rwalk */
499a747e4fSDavid du Colombier 			Qid	wqid[MAXWELEM];		/* Rwalk */
503e12c5d1SDavid du Colombier 		};
513e12c5d1SDavid du Colombier 		struct {
527dd7cddfSDavid du Colombier 			vlong	offset;		/* Tread, Twrite */
539a747e4fSDavid du Colombier 			u32int	count;		/* Tread, Twrite, Rread */
543e12c5d1SDavid du Colombier 			char	*data;		/* Twrite, Rread */
553e12c5d1SDavid du Colombier 		};
563e12c5d1SDavid du Colombier 		struct {
579a747e4fSDavid du Colombier 			ushort	nstat;		/* Twstat, Rstat */
589a747e4fSDavid du Colombier 			uchar	*stat;		/* Twstat, Rstat */
593e12c5d1SDavid du Colombier 		};
603e12c5d1SDavid du Colombier 	};
61219b2ee8SDavid du Colombier } Fcall;
623e12c5d1SDavid du Colombier 
639a747e4fSDavid du Colombier 
649a747e4fSDavid du Colombier #define	GBIT8(p)	((p)[0])
659a747e4fSDavid du Colombier #define	GBIT16(p)	((p)[0]|((p)[1]<<8))
669a747e4fSDavid du Colombier #define	GBIT32(p)	((p)[0]|((p)[1]<<8)|((p)[2]<<16)|((p)[3]<<24))
67*593dc095SDavid du Colombier #define	GBIT64(p)	((u32int)((p)[0]|((p)[1]<<8)|((p)[2]<<16)|((p)[3]<<24)) |\
689a747e4fSDavid du Colombier 				((vlong)((p)[4]|((p)[5]<<8)|((p)[6]<<16)|((p)[7]<<24)) << 32))
699a747e4fSDavid du Colombier 
709a747e4fSDavid du Colombier #define	PBIT8(p,v)	(p)[0]=(v)
719a747e4fSDavid du Colombier #define	PBIT16(p,v)	(p)[0]=(v);(p)[1]=(v)>>8
729a747e4fSDavid du Colombier #define	PBIT32(p,v)	(p)[0]=(v);(p)[1]=(v)>>8;(p)[2]=(v)>>16;(p)[3]=(v)>>24
739a747e4fSDavid du Colombier #define	PBIT64(p,v)	(p)[0]=(v);(p)[1]=(v)>>8;(p)[2]=(v)>>16;(p)[3]=(v)>>24;\
749a747e4fSDavid du Colombier 			(p)[4]=(v)>>32;(p)[5]=(v)>>40;(p)[6]=(v)>>48;(p)[7]=(v)>>56
759a747e4fSDavid du Colombier 
769a747e4fSDavid du Colombier #define	BIT8SZ		1
779a747e4fSDavid du Colombier #define	BIT16SZ		2
789a747e4fSDavid du Colombier #define	BIT32SZ		4
799a747e4fSDavid du Colombier #define	BIT64SZ		8
809a747e4fSDavid du Colombier #define	QIDSZ	(BIT8SZ+BIT32SZ+BIT64SZ)
819a747e4fSDavid du Colombier 
829a747e4fSDavid du Colombier /* STATFIXLEN includes leading 16-bit count */
839a747e4fSDavid du Colombier /* The count, however, excludes itself; total size is BIT16SZ+count */
849a747e4fSDavid du Colombier #define STATFIXLEN	(BIT16SZ+QIDSZ+5*BIT16SZ+4*BIT32SZ+1*BIT64SZ)	/* amount of fixed length data in a stat buffer */
859a747e4fSDavid du Colombier 
869a747e4fSDavid du Colombier #define	NOTAG		(ushort)~0U	/* Dummy tag */
879a747e4fSDavid du Colombier #define	NOFID		(u32int)~0U	/* Dummy fid */
889a747e4fSDavid du Colombier #define	IOHDRSZ		24	/* ample room for Twrite/Rread header (iounit) */
893e12c5d1SDavid du Colombier 
903e12c5d1SDavid du Colombier enum
913e12c5d1SDavid du Colombier {
929a747e4fSDavid du Colombier 	Tversion =	100,
939a747e4fSDavid du Colombier 	Rversion,
949a747e4fSDavid du Colombier 	Tauth =		102,
959a747e4fSDavid du Colombier 	Rauth,
969a747e4fSDavid du Colombier 	Tattach =	104,
97219b2ee8SDavid du Colombier 	Rattach,
989a747e4fSDavid du Colombier 	Terror =	106,	/* illegal */
999a747e4fSDavid du Colombier 	Rerror,
1009a747e4fSDavid du Colombier 	Tflush =	108,
1019a747e4fSDavid du Colombier 	Rflush,
1029a747e4fSDavid du Colombier 	Twalk =		110,
1039a747e4fSDavid du Colombier 	Rwalk,
1049a747e4fSDavid du Colombier 	Topen =		112,
1059a747e4fSDavid du Colombier 	Ropen,
1069a747e4fSDavid du Colombier 	Tcreate =	114,
1079a747e4fSDavid du Colombier 	Rcreate,
1089a747e4fSDavid du Colombier 	Tread =		116,
1099a747e4fSDavid du Colombier 	Rread,
1109a747e4fSDavid du Colombier 	Twrite =	118,
1119a747e4fSDavid du Colombier 	Rwrite,
1129a747e4fSDavid du Colombier 	Tclunk =	120,
1139a747e4fSDavid du Colombier 	Rclunk,
1149a747e4fSDavid du Colombier 	Tremove =	122,
1159a747e4fSDavid du Colombier 	Rremove,
1169a747e4fSDavid du Colombier 	Tstat =		124,
1179a747e4fSDavid du Colombier 	Rstat,
1189a747e4fSDavid du Colombier 	Twstat =	126,
1199a747e4fSDavid du Colombier 	Rwstat,
1207dd7cddfSDavid du Colombier 	Tmax,
1213e12c5d1SDavid du Colombier };
1223e12c5d1SDavid du Colombier 
1239a747e4fSDavid du Colombier uint	convM2S(uchar*, uint, Fcall*);
1249a747e4fSDavid du Colombier uint	convS2M(Fcall*, uchar*, uint);
1255d459b5aSDavid du Colombier uint	sizeS2M(Fcall*);
1263e12c5d1SDavid du Colombier 
1279a747e4fSDavid du Colombier int	statcheck(uchar *abuf, uint nbuf);
1289a747e4fSDavid du Colombier uint	convM2D(uchar*, uint, Dir*, char*);
1299a747e4fSDavid du Colombier uint	convD2M(Dir*, uchar*, uint);
1309a747e4fSDavid du Colombier uint	sizeD2M(Dir*);
1313e12c5d1SDavid du Colombier 
1329a747e4fSDavid du Colombier int	fcallfmt(Fmt*);
1339a747e4fSDavid du Colombier int	dirfmt(Fmt*);
1349a747e4fSDavid du Colombier int	dirmodefmt(Fmt*);
1353e12c5d1SDavid du Colombier 
1369a747e4fSDavid du Colombier int	read9pmsg(int, void*, uint);
137219b2ee8SDavid du Colombier 
1387dd7cddfSDavid du Colombier #pragma	varargck	type	"F"	Fcall*
1397dd7cddfSDavid du Colombier #pragma	varargck	type	"M"	ulong
1407dd7cddfSDavid du Colombier #pragma	varargck	type	"D"	Dir*
141