typedef struct Msg Msg;
struct Msg
{
       Msg *link;
       uchar *rp;
       uchar *ep;
};

typedef struct Client Client;
struct Client
{
       int moribund;
       int activethread;
       int num;
       int ref;
       int status;
       int pid;
       char *cmd;
       int fd[2];
       char err[ERRMAX];

       Req *execreq;
       Channel *execpid;

       Req *rq, **erq;         /* reading */
       Msg *mq, **emq;
       Ioproc *readerproc;

       Channel *writerkick;
       Req *wq, **ewq; /* writing */
       Req *curw;              /* currently writing */
       Ioproc *writerproc;     /* writing */
};
extern int nclient;
extern Client **client;
extern void dataread(Req*, Client*);
extern int newclient(void);
extern void closeclient(Client*);
extern void datawrite(Req*, Client*);
extern void ctlwrite(Req*, Client*);
extern void clientflush(Req*, Client*);

#define emalloc emalloc9p
#define estrdup estrdup9p
#define erealloc erealloc9p

extern Srv fs;
extern void initfs(void);
extern void setexecname(char*);

enum
{
       STACK = 8192,
};

enum    /* Client.status */
{
       Closed,
       Exec,
       Established,
       Hangup,
};