STYX(10.2) STYX(10.2) NAME Fcall, convS2M, convD2M, convM2S, convM2D, fcallconv, dirconv - C interface to Inferno File protocol SYNOPSIS #include <styx.h> int convS2M(Fcall *f, char *ap) int convD2M(Dir *d, char *ap) int convM2S(char *ap, Fcall *f, int n) int convM2D(char *ap, Dir *d) int dirconv(Fmt*) int fcallconv(Fmt*) DESCRIPTION These routines convert messages in the machine-independent format of the Inferno file protocol, Styx (see section 5 of this manual) to and from a more convenient form, an Fcall structure: typedef struct Fcall { char type; short fid; ushort tag; ushort oldtag; /* T-Flush */ Qid qid; /* R-Attach, R-Walk, R-Open, R-Create */ char uname[NAMELEN]; /* T-Attach */ char aname[NAMELEN]; /* T-Attach */ char ename[ERRLEN]; /* R-Error */ long perm; /* T-Create */ short newfid; /* T-Clone */ char name[NAMELEN]; /* T-Walk, T-Create */ char mode; /* T-Create, T-Open */ long offset; /* T-Read, T-Write */ long count; /* T-Read, T-Write, R-Read */ char *data; /* T-Write, R-Read */ char stat[DIRLEN]; /* T-Wstat, R-Stat */ } Fcall; This structure is defined in <styx.h>. See the other pages in this section of the manual for a full description of Styx messages and their encoding. For all message types, the type field of an Fcall holds one of Tnop, Rnop, Tattach, Page 1 Plan 9 (printed 3/11/25) STYX(10.2) STYX(10.2) Rattach, etc. (defined in an enumerated type in <styx.h>). Fid is used by most messages, and tag is used by all mes- sages. The other fields are used selectively by the message types given in comments. ConvM2S takes a buffer ap of length n, and attempts to unpack a complete Styx message to fill in Fcall structure f. To help a caller that is reading and processing Styx mes- sages from an input stream that does not preserve message boundaries, the return value distinguishes three cases: - If the passed message, including any data for Twrite and Rread messages, forms a complete, properly format- ted Styx message, the return value is the number of bytes consumed. It can be less than n when further messages or partial messages remain in ap. For Twrite and Tread messages, f->data is set to a pointer into the argument message, not a copy. - If the message in ap is incomplete but valid thus far, the return value is 0; more bytes must be read and added to the buffer to complete the message. - If the message is invalid, the return value is -1. ConvS2M does the reverse conversion, turning f into a mes- sage starting at ap. The length of the resulting message is returned; it returns -1 if the message type is invalid. For Twrite and Rread messages, f->count bytes starting at f->data are copied into the message. The constant MAXMSG is the length of the longest message, excluding data; MAXFDATA (8192) is the maximum count in a read or write message. Thus messages are guaranteed to be shorter than MAXMSG+MAXFDATA bytes long. Another structure is Dir, used by the routines described in sys-stat(2). ConvM2D converts the machine-independent form starting at ap into d and returns the length of the encod- ing. ConvD2M does the reverse translation, also returning the length of the encoding. Dirconv and fcallconv are print(10.2) formatting routines. They convert Dir* and Fcall* values into string representa- tions of the directory buffer or Fcall buffer. Fcallconv is installed under format F in the Inferno emulator and kernel. SOURCE /include/styx.h SEE ALSO intro(2), styxlib(2), sys-stat(2), intro(5), intro(10), Page 2 Plan 9 (printed 3/11/25) STYX(10.2) STYX(10.2) print(10.2) BUGS The offset and directory length fields have 8 bytes in the protocol, but these routines assume they fit into a long. ConvS2M should check for counts exceeding MAXFMSG. Page 3 Plan 9 (printed 3/11/25)