| .TH FCALL 3 |
| .SH NAME |
| Fcall, convS2M, convD2M, convM2S, convM2D, fcallfmt, dirfmt, dirmodefmt, read9pmsg, statcheck, sizeS2M, sizeD2M \- interface to Plan 9 File protocol |
| .SH SYNOPSIS |
| .B #include <u.h> |
| .br |
| .B #include <libc.h> |
| .br |
| .br |
| .B #include <fcall.h> |
| .PP |
| .B |
| uint convS2M(Fcall *f, uchar *ap, uint nap) |
| .PP |
| .B |
| uint convD2M(Dir *d, uchar *ap, uint nap) |
| .PP |
| .B |
| uint convM2S(uchar *ap, uint nap, Fcall *f) |
| .PP |
| .B |
| uint convM2D(uchar *ap, uint nap, Dir *d, char *strs) |
| .PP |
| .B |
| int dirfmt(Fmt*) |
| .PP |
| .B |
| int fcallfmt(Fmt*) |
| .PP |
| .B |
| int dirmodefmt(Fmt*) |
| .PP |
| .B |
| int read9pmsg(int fd, uchar *buf, uint nbuf) |
| .PP |
| .B |
| int statcheck(uchar *buf, uint nbuf) |
| .PP |
| .B |
| uint sizeS2M(Fcall *f) |
| .PP |
| .B |
| uint sizeD2M(Dir *d) |
| .SH DESCRIPTION |
| These |
| routines convert messages in the machine-independent format of |
| the Plan 9 file protocol, |
| 9P, to and from a more convenient form, |
| an |
| .B Fcall |
| structure: |
| .PP |
| .EX |
| .if n .ta 4n +6n +5n +6n +18n +4n |
| .if t .ta \w'xxxx'u +\w'short 'u +\w'xxxx'u +\w'ushort 'u +\w'ticket[TICKETLEN]; 'u +\w'/* 'u |
| #define MAXWELEM 16 |
| |
| typedef |
| struct Fcall |
| { |
| uchar type; |
| u32int fid; |
| ushort tag; |
| union { |
| struct { |
| u32int msize; /* Tversion, Rversion */ |
| char *version; /* Tversion, Rversion */ |
| }; |
| struct { |
| ushort oldtag; /* Tflush */ |
| }; |
| struct { |
| char *ename; /* Rerror */ |
| }; |
| struct { |
| Qid qid; /* Rattach, Ropen, Rcreate */ |
| u32int iounit; /* Ropen, Rcreate */ |
| }; |
| struct { |
| Qid aqid; /* Rauth */ |
| }; |
| struct { |
| u32int afid; /* Tauth, Tattach */ |
| char *uname; /* Tauth, Tattach */ |
| char *aname; /* Tauth, Tattach */ |
| }; |
| struct { |
| u32int perm; /* Tcreate */ |
| char *name; /* Tcreate */ |
| uchar mode; /* Tcreate, Topen */ |
| }; |
| struct { |
| u32int newfid; /* Twalk */ |
| ushort nwname; /* Twalk */ |
| char *wname[MAXWELEM]; /* Twalk */ |
| }; |
| struct { |
| ushort nwqid; /* Rwalk */ |
| Qid wqid[MAXWELEM]; /* Rwalk */ |
| }; |
| struct { |
| vlong offset; /* Tread, Twrite */ |
| u32int count; /* Tread, Twrite, Rread */ |
| char *data; /* Twrite, Rread */ |
| }; |
| struct { |
| ushort nstat; /* Twstat, Rstat */ |
| uchar *stat; /* Twstat, Rstat */ |
| }; |
| }; |
| } Fcall; |
| .EE |
| .EX |
| |
| /* these are implemented as macros */ |
| |
| uchar GBIT8(uchar*) |
| ushort GBIT16(uchar*) |
| ulong GBIT32(uchar*) |
| vlong GBIT64(uchar*) |
| |
| void PBIT8(uchar*, uchar) |
| void PBIT16(uchar*, ushort) |
| void PBIT32(uchar*, ulong) |
| void PBIT64(uchar*, vlong) |
| |
| #define BIT8SZ 1 |
| #define BIT16SZ 2 |
| #define BIT32SZ 4 |
| #define BIT64SZ 8 |
| .EE |
| .PP |
| This structure is defined in |
| .BR <fcall.h> . |
| See section 5 |
| for a full description of 9P messages and their encoding. |
| For all message types, the |
| .B type |
| field of an |
| .B Fcall |
| holds one of |
| .BR Tversion , |
| .BR Rversion , |
| .BR Tattach , |
| .BR Rattach , |
| etc. (defined in an enumerated type in |
| .BR <fcall.h> ). |
| .B Fid |
| is used by most messages, and |
| .B tag |
| is used by all messages. |
| The other fields are used selectively by the message types |
| given in comments. |
| .PP |
| .I ConvM2S |
| takes a 9P message at |
| .I ap |
| of length |
| .IR nap , |
| and uses it to fill in |
| .B Fcall |
| structure |
| .IR f . |
| If the passed message |
| including any data for |
| .B Twrite |
| and |
| .B Rread |
| messages |
| is formatted properly, |
| the return value is the number of bytes the message occupied in the buffer |
| .IR ap , |
| which will always be less than or equal to |
| .IR nap ; |
| otherwise it is 0. |
| For |
| .B Twrite |
| and |
| .B Tread |
| messages, |
| .B data |
| is set to a pointer into the argument message, |
| not a copy. |
| .PP |
| .I ConvS2M |
| does the reverse conversion, turning |
| .I f |
| into a message starting at |
| .IR ap . |
| The length of the resulting message is returned. |
| For |
| .B Twrite |
| and |
| .B Rread |
| messages, |
| .B count |
| bytes starting at |
| .B data |
| are copied into the message. |
| .PP |
| The constant |
| .B IOHDRSZ |
| is a suitable amount of buffer to reserve for storing |
| the 9P header; |
| the data portion of a |
| .B Twrite |
| or |
| .B Rread |
| will be no more than the buffer size negotiated in the |
| .BR Tversion/Rversion |
| exchange, minus |
| .BR IOHDRSZ . |
| .PP |
| The routine |
| .I sizeS2M |
| returns the number of bytes required to store the machine-independent representation of the |
| .B Fcall |
| structure |
| .IR f , |
| including its initial 32-bit size field. |
| In other words, it reports the number of bytes produced |
| by a successful call to |
| .IR convS2M . |
| .PP |
| Another structure is |
| .BR Dir , |
| used by the routines described in |
| .IR stat (3). |
| .I ConvM2D |
| converts the machine-independent form starting at |
| .I ap |
| into |
| .IR d |
| and returns the length of the machine-independent encoding. |
| The strings in the returned |
| .B Dir |
| structure are stored at successive locations starting at |
| .BR strs . |
| Usually |
| .B strs |
| will point to storage immediately after the |
| .B Dir |
| itself. |
| It can also be a |
| .B nil |
| pointer, in which case the string pointers in the returned |
| .B Dir |
| are all |
| .BR nil ; |
| however, the return value still includes their length. |
| .PP |
| .I ConvD2M |
| does the reverse translation, |
| also returning the length of the encoding. |
| If the buffer is too short, the return value will be |
| .B BIT16SZ |
| and the correct size will be returned in the first |
| .B BIT16SZ |
| bytes. |
| (If the buffer is less that |
| .BR BIT16SZ , |
| the return value is zero; therefore a correct test for |
| complete packing of the message is that the return value is |
| greater than |
| .BR BIT16SZ ). |
| The macro |
| .B GBIT16 |
| can be used to extract the correct value. |
| The related macros with different sizes retrieve the corresponding-sized quantities. |
| .B PBIT16 |
| and its brethren place values in messages. |
| With the exception of handling short buffers in |
| .IR convD2M , |
| these macros are not usually needed except by internal routines. |
| .PP |
| Analogous to |
| .IR sizeS2M , |
| .I sizeD2M |
| returns the number of bytes required to store the machine-independent representation of the |
| .B Dir |
| structure |
| .IR d , |
| including its initial 16-bit size field. |
| .PP |
| The routine |
| .B statcheck |
| checks whether the |
| .I nbuf |
| bytes of |
| .I buf |
| contain a validly formatted machine-independent |
| .B Dir |
| entry suitable as an argument, for example, for the |
| .B wstat |
| (see |
| .IR stat (3)) |
| system call. |
| It checks that the sizes of all the elements of the the entry sum to exactly |
| .IR nbuf , |
| which is a simple but effective test of validity. |
| .I Nbuf |
| and |
| .I buf |
| should include the second two-byte (16-bit) length field that precedes the entry when |
| formatted in a 9P message (see |
| .IR stat (9p)); |
| in other words, |
| .I nbuf |
| is 2 plus the sum of the sizes of the entry itself. |
| .I Statcheck |
| also verifies that the length field has the correct value (that is, |
| .IB nbuf -2\f1). |
| It returns |
| .B 0 |
| for a valid entry and |
| .B -1 |
| for an incorrectly formatted entry. |
| .PP |
| .IR Dirfmt , |
| .IR fcallfmt , |
| and |
| .I dirmodefmt |
| are formatting routines, suitable for |
| .IR fmtinstall (3). |
| They convert |
| .BR Dir* , |
| .BR Fcall* , |
| and |
| .BR long |
| values into string representations of the directory buffer, |
| .B Fcall |
| buffer, |
| or file mode value. |
| .I Fcallfmt |
| assumes that |
| .I dirfmt |
| has been installed with format letter |
| .L D |
| and |
| .I dirmodefmt |
| with format letter |
| .LR M . |
| .PP |
| .I Read9pmsg |
| calls |
| .IR read (3) |
| multiple times, if necessary, to read an entire 9P message into |
| .BR buf . |
| The return value is 0 for end of file, or -1 for error; it does not return |
| partial messages. |
| .SH SOURCE |
| .B \*9/src/lib9 |
| .SH SEE ALSO |
| .IR intro (3), |
| .IR 9p (3), |
| .IR stat (3), |
| .IR intro (9p) |