19a747e4fSDavid du Colombier #pragma src "/sys/src/libc/9sys" 23e12c5d1SDavid du Colombier #pragma lib "libc.a" 33e12c5d1SDavid du Colombier 49a747e4fSDavid du Colombier #define VERSION9P "9P2000" 59a747e4fSDavid du Colombier 69a747e4fSDavid du Colombier #define MAXWELEM 16 79a747e4fSDavid du Colombier 8219b2ee8SDavid du Colombier typedef 93e12c5d1SDavid du Colombier struct Fcall 103e12c5d1SDavid du Colombier { 119a747e4fSDavid du Colombier uchar type; 129a747e4fSDavid du Colombier u32int fid; 133e12c5d1SDavid du Colombier ushort tag; 143e12c5d1SDavid du Colombier union { 153e12c5d1SDavid du Colombier struct { 169a747e4fSDavid du Colombier u32int msize; /* Tversion, Rversion */ 179a747e4fSDavid du Colombier char *version; /* Tversion, Rversion */ 189a747e4fSDavid du Colombier }; 199a747e4fSDavid du Colombier struct { 203e12c5d1SDavid du Colombier ushort oldtag; /* Tflush */ 213e12c5d1SDavid du Colombier }; 223e12c5d1SDavid du Colombier struct { 239a747e4fSDavid du Colombier char *ename; /* Rerror */ 243e12c5d1SDavid du Colombier }; 253e12c5d1SDavid du Colombier struct { 269a747e4fSDavid du Colombier Qid qid; /* Rattach, Ropen, Rcreate */ 279a747e4fSDavid du Colombier u32int iounit; /* Ropen, Rcreate */ 283e12c5d1SDavid du Colombier }; 293e12c5d1SDavid du Colombier struct { 309a747e4fSDavid du Colombier Qid aqid; /* Rauth */ 319a747e4fSDavid du Colombier }; 329a747e4fSDavid du Colombier struct { 339a747e4fSDavid du Colombier u32int afid; /* Tauth, Tattach */ 349a747e4fSDavid du Colombier char *uname; /* Tauth, Tattach */ 359a747e4fSDavid du Colombier char *aname; /* Tauth, Tattach */ 369a747e4fSDavid du Colombier }; 379a747e4fSDavid du Colombier struct { 389a747e4fSDavid du Colombier u32int perm; /* Tcreate */ 399a747e4fSDavid du Colombier char *name; /* Tcreate */ 409a747e4fSDavid du Colombier uchar mode; /* Tcreate, Topen */ 419a747e4fSDavid du Colombier }; 429a747e4fSDavid du Colombier struct { 439a747e4fSDavid du Colombier u32int newfid; /* Twalk */ 449a747e4fSDavid du Colombier ushort nwname; /* Twalk */ 459a747e4fSDavid du Colombier char *wname[MAXWELEM]; /* Twalk */ 469a747e4fSDavid du Colombier }; 479a747e4fSDavid du Colombier struct { 489a747e4fSDavid du Colombier ushort nwqid; /* Rwalk */ 499a747e4fSDavid du Colombier Qid wqid[MAXWELEM]; /* Rwalk */ 503e12c5d1SDavid du Colombier }; 513e12c5d1SDavid du Colombier struct { 527dd7cddfSDavid du Colombier vlong offset; /* Tread, Twrite */ 539a747e4fSDavid du Colombier u32int count; /* Tread, Twrite, Rread */ 543e12c5d1SDavid du Colombier char *data; /* Twrite, Rread */ 553e12c5d1SDavid du Colombier }; 563e12c5d1SDavid du Colombier struct { 579a747e4fSDavid du Colombier ushort nstat; /* Twstat, Rstat */ 589a747e4fSDavid du Colombier uchar *stat; /* Twstat, Rstat */ 593e12c5d1SDavid du Colombier }; 603e12c5d1SDavid du Colombier }; 61219b2ee8SDavid du Colombier } Fcall; 623e12c5d1SDavid du Colombier 639a747e4fSDavid du Colombier 649a747e4fSDavid du Colombier #define GBIT8(p) ((p)[0]) 659a747e4fSDavid du Colombier #define GBIT16(p) ((p)[0]|((p)[1]<<8)) 669a747e4fSDavid du Colombier #define GBIT32(p) ((p)[0]|((p)[1]<<8)|((p)[2]<<16)|((p)[3]<<24)) 67*593dc095SDavid du Colombier #define GBIT64(p) ((u32int)((p)[0]|((p)[1]<<8)|((p)[2]<<16)|((p)[3]<<24)) |\ 689a747e4fSDavid du Colombier ((vlong)((p)[4]|((p)[5]<<8)|((p)[6]<<16)|((p)[7]<<24)) << 32)) 699a747e4fSDavid du Colombier 709a747e4fSDavid du Colombier #define PBIT8(p,v) (p)[0]=(v) 719a747e4fSDavid du Colombier #define PBIT16(p,v) (p)[0]=(v);(p)[1]=(v)>>8 729a747e4fSDavid du Colombier #define PBIT32(p,v) (p)[0]=(v);(p)[1]=(v)>>8;(p)[2]=(v)>>16;(p)[3]=(v)>>24 739a747e4fSDavid du Colombier #define PBIT64(p,v) (p)[0]=(v);(p)[1]=(v)>>8;(p)[2]=(v)>>16;(p)[3]=(v)>>24;\ 749a747e4fSDavid du Colombier (p)[4]=(v)>>32;(p)[5]=(v)>>40;(p)[6]=(v)>>48;(p)[7]=(v)>>56 759a747e4fSDavid du Colombier 769a747e4fSDavid du Colombier #define BIT8SZ 1 779a747e4fSDavid du Colombier #define BIT16SZ 2 789a747e4fSDavid du Colombier #define BIT32SZ 4 799a747e4fSDavid du Colombier #define BIT64SZ 8 809a747e4fSDavid du Colombier #define QIDSZ (BIT8SZ+BIT32SZ+BIT64SZ) 819a747e4fSDavid du Colombier 829a747e4fSDavid du Colombier /* STATFIXLEN includes leading 16-bit count */ 839a747e4fSDavid du Colombier /* The count, however, excludes itself; total size is BIT16SZ+count */ 849a747e4fSDavid du Colombier #define STATFIXLEN (BIT16SZ+QIDSZ+5*BIT16SZ+4*BIT32SZ+1*BIT64SZ) /* amount of fixed length data in a stat buffer */ 859a747e4fSDavid du Colombier 869a747e4fSDavid du Colombier #define NOTAG (ushort)~0U /* Dummy tag */ 879a747e4fSDavid du Colombier #define NOFID (u32int)~0U /* Dummy fid */ 889a747e4fSDavid du Colombier #define IOHDRSZ 24 /* ample room for Twrite/Rread header (iounit) */ 893e12c5d1SDavid du Colombier 903e12c5d1SDavid du Colombier enum 913e12c5d1SDavid du Colombier { 929a747e4fSDavid du Colombier Tversion = 100, 939a747e4fSDavid du Colombier Rversion, 949a747e4fSDavid du Colombier Tauth = 102, 959a747e4fSDavid du Colombier Rauth, 969a747e4fSDavid du Colombier Tattach = 104, 97219b2ee8SDavid du Colombier Rattach, 989a747e4fSDavid du Colombier Terror = 106, /* illegal */ 999a747e4fSDavid du Colombier Rerror, 1009a747e4fSDavid du Colombier Tflush = 108, 1019a747e4fSDavid du Colombier Rflush, 1029a747e4fSDavid du Colombier Twalk = 110, 1039a747e4fSDavid du Colombier Rwalk, 1049a747e4fSDavid du Colombier Topen = 112, 1059a747e4fSDavid du Colombier Ropen, 1069a747e4fSDavid du Colombier Tcreate = 114, 1079a747e4fSDavid du Colombier Rcreate, 1089a747e4fSDavid du Colombier Tread = 116, 1099a747e4fSDavid du Colombier Rread, 1109a747e4fSDavid du Colombier Twrite = 118, 1119a747e4fSDavid du Colombier Rwrite, 1129a747e4fSDavid du Colombier Tclunk = 120, 1139a747e4fSDavid du Colombier Rclunk, 1149a747e4fSDavid du Colombier Tremove = 122, 1159a747e4fSDavid du Colombier Rremove, 1169a747e4fSDavid du Colombier Tstat = 124, 1179a747e4fSDavid du Colombier Rstat, 1189a747e4fSDavid du Colombier Twstat = 126, 1199a747e4fSDavid du Colombier Rwstat, 1207dd7cddfSDavid du Colombier Tmax, 1213e12c5d1SDavid du Colombier }; 1223e12c5d1SDavid du Colombier 1239a747e4fSDavid du Colombier uint convM2S(uchar*, uint, Fcall*); 1249a747e4fSDavid du Colombier uint convS2M(Fcall*, uchar*, uint); 1255d459b5aSDavid du Colombier uint sizeS2M(Fcall*); 1263e12c5d1SDavid du Colombier 1279a747e4fSDavid du Colombier int statcheck(uchar *abuf, uint nbuf); 1289a747e4fSDavid du Colombier uint convM2D(uchar*, uint, Dir*, char*); 1299a747e4fSDavid du Colombier uint convD2M(Dir*, uchar*, uint); 1309a747e4fSDavid du Colombier uint sizeD2M(Dir*); 1313e12c5d1SDavid du Colombier 1329a747e4fSDavid du Colombier int fcallfmt(Fmt*); 1339a747e4fSDavid du Colombier int dirfmt(Fmt*); 1349a747e4fSDavid du Colombier int dirmodefmt(Fmt*); 1353e12c5d1SDavid du Colombier 1369a747e4fSDavid du Colombier int read9pmsg(int, void*, uint); 137219b2ee8SDavid du Colombier 1387dd7cddfSDavid du Colombier #pragma varargck type "F" Fcall* 1397dd7cddfSDavid du Colombier #pragma varargck type "M" ulong 1407dd7cddfSDavid du Colombier #pragma varargck type "D" Dir* 141