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