#pragma lib     "libc.a"

typedef struct  Fcall   Fcall;

struct  Fcall
{
       char    type;
       short   fid;
       ushort  tag;
       union {
               struct {
                       ushort  oldtag;         /* Tflush */
                       Qid     qid;            /* Rattach, Rwalk, Ropen, Rcreate */
               };
               struct {
                       char    uname[NAMELEN]; /* Tauth, Tattach */
                       char    aname[NAMELEN]; /* Tattach */
                       char    auth[NAMELEN];  /* Tattach */
                       char    chal[8+NAMELEN];/* Tauth, Rauth */
               };
               struct {
                       char    ename[ERRLEN];  /* Rerror */
               };
               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 */
               };
       };
};

#define MAXFDATA        8192
#define MAXMSG          128     /* max header sans data */
#define NOTAG           0xFFFF  /* Dummy tag */

enum
{
       Tmux =          48,
       Rmux,                   /* illegal */
       Tnop =          50,
       Rnop,
       Tsession =      52,
       Rsession,
       Terror =        54,     /* illegal */
       Rerror,
       Tflush =        56,
       Rflush,
       Tattach =       58,
       Rattach,
       Tclone =        60,
       Rclone,
       Twalk =         62,
       Rwalk,
       Topen =         64,
       Ropen,
       Tcreate =       66,
       Rcreate,
       Tread =         68,
       Rread,
       Twrite =        70,
       Rwrite,
       Tclunk =        72,
       Rclunk,
       Tremove =       74,
       Rremove,
       Tstat =         76,
       Rstat,
       Twstat =        78,
       Rwstat,
       Tclwalk =       80,
       Rclwalk,
       Tauth =         82,
       Rauth,
};

int     convM2S(char*, Fcall*, int);
int     convS2M(Fcall*, char*);

int     convM2D(char*, Dir*);
int     convD2M(Dir*, char*);

int     fcallconv(void *, Fconv*);
int     dirconv(void *, Fconv*);
int     dirmodeconv(void *, Fconv*);

char*   getS(int, char*, Fcall*, long*);