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