| #ifndef _FCALL_H_ |
| #define _FCALL_H_ 1 |
| #ifdef __cplusplus |
| extern "C" { |
| #endif |
| /* |
| #pragma src "/sys/src/libc/9sys" |
| #pragma lib "libc.a" |
| */ |
| |
| #define VERSION9P "9P2000" |
| #define MAXWELEM 16 |
| |
| typedef |
| struct Fcall |
| { |
| uchar type; |
| u32int fid; |
| ushort tag; |
| u32int msize; /* Tversion, Rversion */ |
| char *version; /* Tversion, Rversion */ |
| ushort oldtag; /* Tflush */ |
| char *ename; /* Rerror */ |
| Qid qid; /* Rattach, Ropen, Rcreate */ |
| u32int iounit; /* Ropen, Rcreate */ |
| Qid aqid; /* Rauth */ |
| u32int afid; /* Tauth, Tattach */ |
| char *uname; /* Tauth, Tattach */ |
| char *aname; /* Tauth, Tattach */ |
| u32int perm; /* Tcreate */ |
| char *name; /* Tcreate */ |
| uchar mode; /* Tcreate, Topen */ |
| u32int newfid; /* Twalk */ |
| ushort nwname; /* Twalk */ |
| char *wname[MAXWELEM]; /* Twalk */ |
| ushort nwqid; /* Rwalk */ |
| Qid wqid[MAXWELEM]; /* Rwalk */ |
| vlong offset; /* Tread, Twrite */ |
| u32int count; /* Tread, Twrite, Rread */ |
| char *data; /* Twrite, Rread */ |
| ushort nstat; /* Twstat, Rstat */ |
| uchar *stat; /* Twstat, Rstat */ |
| int unixfd; /* Ropenfd */ |
| |
| /* 9P2000.u extensions */ |
| int errornum; /* Rerror */ |
| int uidnum; /* Tattach, Tauth */ |
| char *extension; /* Tcreate */ |
| } Fcall; |
| |
| |
| #define GBIT8(p) ((p)[0]) |
| #define GBIT16(p) ((p)[0]|((p)[1]<<8)) |
| #define GBIT32(p) ((u32int)((p)[0]|((p)[1]<<8)|((p)[2]<<16)|((p)[3]<<24))) |
| #define GBIT64(p) ((u32int)((p)[0]|((p)[1]<<8)|((p)[2]<<16)|((p)[3]<<24)) |\ |
| ((vlong)((p)[4]|((p)[5]<<8)|((p)[6]<<16)|((p)[7]<<24)) << 32)) |
| |
| #define PBIT8(p,v) (p)[0]=(v) |
| #define PBIT16(p,v) (p)[0]=(v);(p)[1]=(v)>>8 |
| #define PBIT32(p,v) (p)[0]=(v);(p)[1]=(v)>>8;(p)[2]=(v)>>16;(p)[3]=(v)>>24 |
| #define PBIT64(p,v) (p)[0]=(v);(p)[1]=(v)>>8;(p)[2]=(v)>>16;(p)[3]=(v)>>24;\ |
| (p)[4]=(v)>>32;(p)[5]=(v)>>40;(p)[6]=(v)>>48;(p)[7]=(v)>>56 |
| |
| #define BIT8SZ 1 |
| #define BIT16SZ 2 |
| #define BIT32SZ 4 |
| #define BIT64SZ 8 |
| #define QIDSZ (BIT8SZ+BIT32SZ+BIT64SZ) |
| |
| /* STATFIXLEN includes leading 16-bit count */ |
| /* The count, however, excludes itself; total size is BIT16SZ+count */ |
| #define STATFIXLEN (BIT16SZ+QIDSZ+5*BIT16SZ+4*BIT32SZ+1*BIT64SZ) /* amount of fixed length data in a stat buffer */ |
| #define STATFIXLENU (STATFIXLEN+BIT16SZ+3*BIT32SZ) /* for 9P2000.u */ |
| |
| #define NOTAG (ushort)~0U /* Dummy tag */ |
| #define NOFID (u32int)~0U /* Dummy fid */ |
| #define NOUID (-1) /* Dummy uid */ |
| #define IOHDRSZ 24 /* ample room for Twrite/Rread header (iounit) */ |
| |
| enum |
| { |
| Tversion = 100, |
| Rversion, |
| Tauth = 102, |
| Rauth, |
| Tattach = 104, |
| Rattach, |
| Terror = 106, /* illegal */ |
| Rerror, |
| Tflush = 108, |
| Rflush, |
| Twalk = 110, |
| Rwalk, |
| Topen = 112, |
| Ropen, |
| Tcreate = 114, |
| Rcreate, |
| Tread = 116, |
| Rread, |
| Twrite = 118, |
| Rwrite, |
| Tclunk = 120, |
| Rclunk, |
| Tremove = 122, |
| Rremove, |
| Tstat = 124, |
| Rstat, |
| Twstat = 126, |
| Rwstat, |
| Tmax, |
| |
| Topenfd = 98, |
| Ropenfd |
| }; |
| |
| uint convM2S(uchar*, uint, Fcall*); |
| uint convS2M(Fcall*, uchar*, uint); |
| uint sizeS2M(Fcall*); |
| |
| int statcheck(uchar *abuf, uint nbuf); |
| uint convM2D(uchar*, uint, Dir*, char*); |
| uint convD2M(Dir*, uchar*, uint); |
| uint sizeD2M(Dir*); |
| |
| int fcallfmt(Fmt*); |
| int dirfmt(Fmt*); |
| int dirmodefmt(Fmt*); |
| |
| int read9pmsg(int, void*, uint); |
| |
| /* |
| #pragma varargck type "F" Fcall* |
| #pragma varargck type "M" ulong |
| #pragma varargck type "D" Dir* |
| */ |
| |
| #ifdef __cplusplus |
| } |
| #endif |
| #endif |