9base

revived minimalist port of Plan 9 userland to Unix
git clone git://git.suckless.org/9base
Log | Files | Refs | README | LICENSE

fcall.h (3517B)


      1 #ifndef _FCALL_H_
      2 #define _FCALL_H_ 1
      3 #ifdef __cplusplus
      4 extern "C" {
      5 #endif
      6 /*
      7 #pragma	src	"/sys/src/libc/9sys"
      8 #pragma	lib	"libc.a"
      9 */
     10 
     11 #define	VERSION9P	"9P2000"
     12 #define	MAXWELEM	16
     13 
     14 typedef
     15 struct	Fcall
     16 {
     17 	uchar	type;
     18 	u32int	fid;
     19 	ushort	tag;
     20 	u32int	msize;		/* Tversion, Rversion */
     21 	char	*version;	/* Tversion, Rversion */
     22 	ushort	oldtag;		/* Tflush */
     23 	char	*ename;		/* Rerror */
     24 	Qid	qid;		/* Rattach, Ropen, Rcreate */
     25 	u32int	iounit;		/* Ropen, Rcreate */
     26 	Qid	aqid;		/* Rauth */
     27 	u32int	afid;		/* Tauth, Tattach */
     28 	char	*uname;		/* Tauth, Tattach */
     29 	char	*aname;		/* Tauth, Tattach */
     30 	u32int	perm;		/* Tcreate */ 
     31 	char	*name;		/* Tcreate */
     32 	uchar	mode;		/* Tcreate, Topen */
     33 	u32int	newfid;		/* Twalk */
     34 	ushort	nwname;		/* Twalk */
     35 	char	*wname[MAXWELEM];	/* Twalk */
     36 	ushort	nwqid;		/* Rwalk */
     37 	Qid	wqid[MAXWELEM];	/* Rwalk */
     38 	vlong	offset;		/* Tread, Twrite */
     39 	u32int	count;		/* Tread, Twrite, Rread */
     40 	char	*data;		/* Twrite, Rread */
     41 	ushort	nstat;		/* Twstat, Rstat */
     42 	uchar	*stat;		/* Twstat, Rstat */
     43 	int	unixfd;		/* Ropenfd */
     44 	
     45 	/* 9P2000.u extensions */
     46 	int	errornum;	/* Rerror */
     47 	int	uidnum;		/* Tattach, Tauth */
     48 	char	*extension;	/* Tcreate */
     49 } Fcall;
     50 
     51 
     52 #define	GBIT8(p)	((p)[0])
     53 #define	GBIT16(p)	((p)[0]|((p)[1]<<8))
     54 #define	GBIT32(p)	((u32int)((p)[0]|((p)[1]<<8)|((p)[2]<<16)|((p)[3]<<24)))
     55 #define	GBIT64(p)	((u32int)((p)[0]|((p)[1]<<8)|((p)[2]<<16)|((p)[3]<<24)) |\
     56 				((vlong)((p)[4]|((p)[5]<<8)|((p)[6]<<16)|((p)[7]<<24)) << 32))
     57 
     58 #define	PBIT8(p,v)	(p)[0]=(v)
     59 #define	PBIT16(p,v)	(p)[0]=(v);(p)[1]=(v)>>8
     60 #define	PBIT32(p,v)	(p)[0]=(v);(p)[1]=(v)>>8;(p)[2]=(v)>>16;(p)[3]=(v)>>24
     61 #define	PBIT64(p,v)	(p)[0]=(v);(p)[1]=(v)>>8;(p)[2]=(v)>>16;(p)[3]=(v)>>24;\
     62 			(p)[4]=(v)>>32;(p)[5]=(v)>>40;(p)[6]=(v)>>48;(p)[7]=(v)>>56
     63 
     64 #define	BIT8SZ		1
     65 #define	BIT16SZ		2
     66 #define	BIT32SZ		4
     67 #define	BIT64SZ		8
     68 #define	QIDSZ	(BIT8SZ+BIT32SZ+BIT64SZ)
     69 
     70 /* STATFIXLEN includes leading 16-bit count */
     71 /* The count, however, excludes itself; total size is BIT16SZ+count */
     72 #define STATFIXLEN	(BIT16SZ+QIDSZ+5*BIT16SZ+4*BIT32SZ+1*BIT64SZ)	/* amount of fixed length data in a stat buffer */
     73 #define STATFIXLENU	(STATFIXLEN+BIT16SZ+3*BIT32SZ)	/* for 9P2000.u */
     74 
     75 #define	NOTAG		(ushort)~0U	/* Dummy tag */
     76 #define	NOFID		(u32int)~0U	/* Dummy fid */
     77 #define	NOUID		(-1)	/* Dummy uid */
     78 #define	IOHDRSZ		24	/* ample room for Twrite/Rread header (iounit) */
     79 
     80 enum
     81 {
     82 	Tversion =	100,
     83 	Rversion,
     84 	Tauth =		102,
     85 	Rauth,
     86 	Tattach =	104,
     87 	Rattach,
     88 	Terror =	106,	/* illegal */
     89 	Rerror,
     90 	Tflush =	108,
     91 	Rflush,
     92 	Twalk =		110,
     93 	Rwalk,
     94 	Topen =		112,
     95 	Ropen,
     96 	Tcreate =	114,
     97 	Rcreate,
     98 	Tread =		116,
     99 	Rread,
    100 	Twrite =	118,
    101 	Rwrite,
    102 	Tclunk =	120,
    103 	Rclunk,
    104 	Tremove =	122,
    105 	Rremove,
    106 	Tstat =		124,
    107 	Rstat,
    108 	Twstat =	126,
    109 	Rwstat,
    110 	Tmax,
    111 
    112 	Topenfd = 	98,
    113 	Ropenfd
    114 };
    115 
    116 uint	convM2S(uchar*, uint, Fcall*);
    117 uint	convS2M(Fcall*, uchar*, uint);
    118 uint	sizeS2M(Fcall*);
    119 
    120 int	statcheck(uchar *abuf, uint nbuf);
    121 uint	convM2D(uchar*, uint, Dir*, char*);
    122 uint	convD2M(Dir*, uchar*, uint);
    123 uint	sizeD2M(Dir*);
    124 
    125 uint	convM2Su(uchar*, uint, Fcall*, int);
    126 uint	convS2Mu(Fcall*, uchar*, uint, int);
    127 uint	sizeS2Mu(Fcall*, int);
    128 
    129 int	statchecku(uchar *abuf, uint nbuf, int);
    130 uint	convM2Du(uchar*, uint, Dir*, char*, int);
    131 uint	convD2Mu(Dir*, uchar*, uint, int);
    132 uint	sizeD2Mu(Dir*, int);
    133 
    134 int	fcallfmt(Fmt*);
    135 int	dirfmt(Fmt*);
    136 int	dirmodefmt(Fmt*);
    137 
    138 int	read9pmsg(int, void*, uint);
    139 
    140 /*
    141 #pragma	varargck	type	"F"	Fcall*
    142 #pragma	varargck	type	"M"	ulong
    143 #pragma	varargck	type	"D"	Dir*
    144 */
    145 
    146 #ifdef __cplusplus
    147 }
    148 #endif
    149 #endif