term% ls -F
term% cat index.txt
FCALL(2)                      System Calls Manual                     FCALL(2)

       Fcall,  convS2M,  convD2M,  convM2S, convM2D, getS, fcallconv, dirconv,
       dirmodeconv - interface to Plan 9 File protocol

       #include <u.h>
       #include <libc.h>
       #include <auth.h>
       #include <fcall.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)

       char *getS(int fd, char *ap, Fcall *f, long *lp)

       int dirconv(void *o, Fconv*)

       int fcallconv(void *o, Fconv*)

       int dirmodeconv(void *o, Fconv*)

       These routines convert messages in the  machine-independent  format  of
       the  Plan  9  file protocol, 9P, to and from a more convenient form, an
       Fcall structure:

       struct Fcall {
           char  type;
           short fid;
           short tag;
           union {
                 struct {
                      ushort                  oldtag;/* Tflush */
                      Qid   qid;              /* Rattach, Rwalk,
                                                  Ropen, Rcreate */
                      char  rauth[AUTHENTLEN];    /* Rattach */
                 struct {
                      char  uname[NAMELEN];   /* Tattach */
                      char  aname[NAMELEN];   /* Tattach */
                      char  ticket[TICKETLEN];    /* Tattach */
                      char  auth[AUTHENTLEN]; /* Tattach */
                 struct {
                      char  ename[ERRLEN];    /* Rerror */
                      char  authid[NAMELEN];  /* Rsession */
                      char  authdom[DOMLEN];  /* Rsession */
                      char  chal[CHALLEN];    /* Tsession/Rsession */
                 struct {
                      long  perm;             /* Tcreate */
                      short newfid;           /* Tclone, Tclwalk */
                      char  name[NAMELEN];    /* Twalk, Tclwalk,
                                                  Tcreate */
                      char  mode;             /* Tcreate, Topen */
                 struct {
                      long  offset;           /* Tread, Twrite */
                      long  count;            /* Tread, Twrite, Rread */
                      char  *data;            /* Twrite, Rread */
                 struct {
                      char  stat[DIRLEN];     /* Twstat, Rstat */
       } Fcall;

       This structure is defined in <fcall.h>.  See section 5 for a  full  de‐
       scription  of  9P  messages and their encoding.  For all message types,
       the type field of an Fcall holds one of Tnop, Rnop, Tsession, Rsession,
       etc. (defined in an enumerated type in <fcall.h>).  Fid is used by most
       messages, and tag is used by all messages.  The other fields  are  used
       selectively by the message types given in comments.

       ConvM2S  takes  a  9P message at ap of length n, and uses it to fill in
       Fcall structure f.  If the passed message including any data for Twrite
       and Rread messages is formatted properly, the return value is n; other‐
       wise it is 0.  For Twrite and Tread messages, data is set to a  pointer
       into the argument message, not a copy.

       ConvS2M  does the reverse conversion, turning f into a message starting
       at ap.  The length of the resulting message is  returned.   For  Twrite
       and  Rread  messages,  count bytes starting at data are copied into the

       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

       Another  structure  is  Dir, used by the routines described in stat(2).
       ConvM2D converts the machine-independent form starting at ap into d and
       returns  the length of the encoding.  ConvD2M does the reverse transla‐
       tion, also returning the length of the encoding.

       GetS reads a message from file descriptor fd into ap and  converts  the
       message using convM2S into the Fcall structure f.  The lp argument must
       point to a long holding the size of the ap buffer.  It is somewhat  re‐
       silient  to  transient  read  errors.   If convM2S succeeds, its return
       value is stored in *lp, and getS returns zero.  Otherwise getS  returns
       a string identifying the error.

       Dirconv,  fcallconv,  and dirmodeconv are formatting routines, suitable
       for fmtinstall (see print(2)).  They convert  Dir*,  Fcall*,  and  long
       values  into string representations of the directory buffer, Fcall buf‐
       fer, or file mode value.  Fcallconv assumes that dirconv has  been  in‐
       stalled with format letter


       intro(2), stat(2), intro(5)

       GetS sets errstr.

       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.