18ccd4a63SDavid du Colombier #define VERSION9P "9P2000" 28ccd4a63SDavid du Colombier 38ccd4a63SDavid du Colombier #define MAXWELEM 16 48ccd4a63SDavid du Colombier 58ccd4a63SDavid du Colombier typedef 68ccd4a63SDavid du Colombier struct Fcall 78ccd4a63SDavid du Colombier { 88ccd4a63SDavid du Colombier uchar type; 98ccd4a63SDavid du Colombier u32int fid; 108ccd4a63SDavid du Colombier ushort tag; 118ccd4a63SDavid du Colombier u32int msize; /* Tversion, Rversion */ 128ccd4a63SDavid du Colombier char *version; /* Tversion, Rversion */ 138ccd4a63SDavid du Colombier ushort oldtag; /* Tflush */ 148ccd4a63SDavid du Colombier char *ename; /* Rerror */ 158ccd4a63SDavid du Colombier Qid qid; /* Rattach, Ropen, Rcreate */ 168ccd4a63SDavid du Colombier u32int iounit; /* Ropen, Rcreate */ 178ccd4a63SDavid du Colombier Qid aqid; /* Rauth */ 188ccd4a63SDavid du Colombier u32int afid; /* Tauth, Tattach */ 198ccd4a63SDavid du Colombier char *uname; /* Tauth, Tattach */ 208ccd4a63SDavid du Colombier char *aname; /* Tauth, Tattach */ 218ccd4a63SDavid du Colombier u32int perm; /* Tcreate */ 228ccd4a63SDavid du Colombier char *name; /* Tcreate */ 238ccd4a63SDavid du Colombier uchar mode; /* Tcreate, Topen */ 248ccd4a63SDavid du Colombier u32int newfid; /* Twalk */ 258ccd4a63SDavid du Colombier ushort nwname; /* Twalk */ 268ccd4a63SDavid du Colombier char *wname[MAXWELEM]; /* Twalk */ 278ccd4a63SDavid du Colombier ushort nwqid; /* Rwalk */ 288ccd4a63SDavid du Colombier Qid wqid[MAXWELEM]; /* Rwalk */ 298ccd4a63SDavid du Colombier vlong offset; /* Tread, Twrite */ 308ccd4a63SDavid du Colombier u32int count; /* Tread, Twrite, Rread */ 318ccd4a63SDavid du Colombier char *data; /* Twrite, Rread */ 328ccd4a63SDavid du Colombier ushort nstat; /* Twstat, Rstat */ 338ccd4a63SDavid du Colombier uchar *stat; /* Twstat, Rstat */ 348ccd4a63SDavid du Colombier } Fcall; 358ccd4a63SDavid du Colombier 368ccd4a63SDavid du Colombier 378ccd4a63SDavid du Colombier #define GBIT8(p) ((p)[0]) 388ccd4a63SDavid du Colombier #define GBIT16(p) ((p)[0]|((p)[1]<<8)) 398ccd4a63SDavid du Colombier #define GBIT32(p) ((p)[0]|((p)[1]<<8)|((p)[2]<<16)|((p)[3]<<24)) 40*58da3067SDavid du Colombier #define GBIT64(p) ((vlong)((p)[0]|((p)[1]<<8)|((p)[2]<<16)|((p)[3]<<24)) |\ 418ccd4a63SDavid du Colombier ((vlong)((p)[4]|((p)[5]<<8)|((p)[6]<<16)|((p)[7]<<24)) << 32)) 428ccd4a63SDavid du Colombier 438ccd4a63SDavid du Colombier #define PBIT8(p,v) (p)[0]=(v) 448ccd4a63SDavid du Colombier #define PBIT16(p,v) (p)[0]=(v);(p)[1]=(v)>>8 458ccd4a63SDavid du Colombier #define PBIT32(p,v) (p)[0]=(v);(p)[1]=(v)>>8;(p)[2]=(v)>>16;(p)[3]=(v)>>24 468ccd4a63SDavid du Colombier #define PBIT64(p,v) (p)[0]=(v);(p)[1]=(v)>>8;(p)[2]=(v)>>16;(p)[3]=(v)>>24;\ 478ccd4a63SDavid du Colombier (p)[4]=(v)>>32;(p)[5]=(v)>>40;(p)[6]=(v)>>48;(p)[7]=(v)>>56 488ccd4a63SDavid du Colombier 498ccd4a63SDavid du Colombier #define BIT8SZ 1 508ccd4a63SDavid du Colombier #define BIT16SZ 2 518ccd4a63SDavid du Colombier #define BIT32SZ 4 528ccd4a63SDavid du Colombier #define BIT64SZ 8 538ccd4a63SDavid du Colombier #define QIDSZ (BIT8SZ+BIT32SZ+BIT64SZ) 548ccd4a63SDavid du Colombier 558ccd4a63SDavid du Colombier /* STATFIXLEN includes leading 16-bit count */ 568ccd4a63SDavid du Colombier /* The count, however, excludes itself; total size is BIT16SZ+count */ 578ccd4a63SDavid du Colombier #define STATFIXLEN (BIT16SZ+QIDSZ+5*BIT16SZ+4*BIT32SZ+1*BIT64SZ) /* amount of fixed length data in a stat buffer */ 588ccd4a63SDavid du Colombier 598ccd4a63SDavid du Colombier #define NOTAG (ushort)~0U /* Dummy tag */ 608ccd4a63SDavid du Colombier #define NOFID (u32int)~0U /* Dummy fid */ 618ccd4a63SDavid du Colombier #define IOHDRSZ 24 /* ample room for Twrite/Rread header (iounit) */ 628ccd4a63SDavid du Colombier 638ccd4a63SDavid du Colombier enum 648ccd4a63SDavid du Colombier { 658ccd4a63SDavid du Colombier Tversion = 100, 668ccd4a63SDavid du Colombier Rversion, 678ccd4a63SDavid du Colombier Tauth = 102, 688ccd4a63SDavid du Colombier Rauth, 698ccd4a63SDavid du Colombier Tattach = 104, 708ccd4a63SDavid du Colombier Rattach, 718ccd4a63SDavid du Colombier Terror = 106, /* illegal */ 728ccd4a63SDavid du Colombier Rerror, 738ccd4a63SDavid du Colombier Tflush = 108, 748ccd4a63SDavid du Colombier Rflush, 758ccd4a63SDavid du Colombier Twalk = 110, 768ccd4a63SDavid du Colombier Rwalk, 778ccd4a63SDavid du Colombier Topen = 112, 788ccd4a63SDavid du Colombier Ropen, 798ccd4a63SDavid du Colombier Tcreate = 114, 808ccd4a63SDavid du Colombier Rcreate, 818ccd4a63SDavid du Colombier Tread = 116, 828ccd4a63SDavid du Colombier Rread, 838ccd4a63SDavid du Colombier Twrite = 118, 848ccd4a63SDavid du Colombier Rwrite, 858ccd4a63SDavid du Colombier Tclunk = 120, 868ccd4a63SDavid du Colombier Rclunk, 878ccd4a63SDavid du Colombier Tremove = 122, 888ccd4a63SDavid du Colombier Rremove, 898ccd4a63SDavid du Colombier Tstat = 124, 908ccd4a63SDavid du Colombier Rstat, 918ccd4a63SDavid du Colombier Twstat = 126, 928ccd4a63SDavid du Colombier Rwstat, 938ccd4a63SDavid du Colombier Tmax, 948ccd4a63SDavid du Colombier }; 958ccd4a63SDavid du Colombier 968ccd4a63SDavid du Colombier uint convM2S(uchar*, uint, Fcall*); 978ccd4a63SDavid du Colombier uint convS2M(Fcall*, uchar*, uint); 988ccd4a63SDavid du Colombier uint sizeS2M(Fcall*); 998ccd4a63SDavid du Colombier 1008ccd4a63SDavid du Colombier int statcheck(uchar *abuf, uint nbuf); 1018ccd4a63SDavid du Colombier uint convM2D(uchar*, uint, Dir*, char*); 1028ccd4a63SDavid du Colombier uint convD2M(Dir*, uchar*, uint); 1038ccd4a63SDavid du Colombier uint sizeD2M(Dir*); 1048ccd4a63SDavid du Colombier 1058ccd4a63SDavid du Colombier int fcallfmt(Fmt*); 1068ccd4a63SDavid du Colombier int dirfmt(Fmt*); 1078ccd4a63SDavid du Colombier int dirmodefmt(Fmt*); 1088ccd4a63SDavid du Colombier 1098ccd4a63SDavid du Colombier int read9pmsg(int, void*, uint); 1108ccd4a63SDavid du Colombier 111