text: #include <auth.h>
  #include <fcall.h>
  
  enum {
  	NFidHash	= 503,
  };
  
  typedef struct Con Con;
  typedef struct DirBuf DirBuf;
  typedef struct Excl Excl;
  typedef struct Fid Fid;
  typedef struct Fsys Fsys;
  typedef struct Msg Msg;
  
  #pragma incomplete DirBuf
  #pragma incomplete Excl
  #pragma incomplete Fsys
  
  struct Msg {
  	uchar*	data;
  	u32int	msize;			/* actual size of data */
  	Fcall	t;
  	Fcall	r;
  	Con*	con;
  
  	Msg*	anext;			/* allocation free list */
  
  	Msg*	mnext;			/* all active messsages on this Con */
  	Msg* 	mprev;
  
  	int	state;			/* */
  
  	Msg*	flush;			/* flushes waiting for this Msg */
  
  	Msg*	rwnext;			/* read/write queue */
  	int	nowq;			/* do not place on write queue */
  };
  
  enum {
  	MsgN		= 0,
  	MsgR		= 1,
  	Msg9		= 2,
  	MsgW		= 3,
  	MsgF		= 4,
  };
  
  enum {
  	ConNoneAllow	= 1<<0,
  	ConNoAuthCheck	= 1<<1,
  	ConNoPermCheck	= 1<<2,
  	ConWstatAllow	= 1<<3,
  	ConIPCheck	= 1<<4,
  };
  struct Con {
  	char*	name;
  	uchar*	data;			/* max, not negotiated */
  	int	isconsole;		/* immutable */
  	int	flags;			/* immutable */
  	char	remote[128];		/* immutable */
  	VtLock*	lock;
  	int	state;
  	int	fd;
  	Msg*	version;
  	u32int	msize;			/* negotiated with Tversion */
  	VtRendez* rendez;
  
  	Con*	anext;			/* alloc */
  	Con*	cnext;			/* in use */
  	Con*	cprev;
  
  	VtLock*	alock;
  	int	aok;			/* authentication done */
  
  	VtLock*	mlock;
  	Msg*	mhead;			/* all Msgs on this connection */
  	Msg*	mtail;
  	VtRendez* mrendez;
  
  	VtLock*	wlock;
  	Msg*	whead;			/* write queue */
  	Msg*	wtail;
  	VtRendez* wrendez;
  
  	VtLock*	fidlock;		/* */
  	Fid*	fidhash[NFidHash];
  	Fid*	fhead;
  	Fid*	ftail;
  	int	nfid;
  };
  
  enum {
  	ConDead		= 0,
  	ConNew		= 1,
  	ConDown		= 2,
  	ConInit		= 3,
  	ConUp		= 4,
  	ConMoribund	= 5,
  };
  
  struct Fid {
  	VtLock*	lock;
  	Con*	con;
  	u32int	fidno;
  	int	ref;			/* inc/dec under Con.fidlock */
  	int	flags;
  
  	int	open;
  	Fsys*	fsys;
  	File*	file;
  	Qid	qid;
  	char*	uid;
  	char*	uname;
  	DirBuf*	db;
  	Excl*	excl;
  
  	VtLock*	alock;			/* Tauth/Tattach */
  	AuthRpc* rpc;
  	char*	cuname;
  
  	Fid*	sort;			/* sorted by uname in cmdWho */
  	Fid*	hash;			/* lookup by fidno */
  	Fid*	next;			/* clunk session with Tversion */
  	Fid*	prev;
  };
  
  enum {					/* Fid.flags and fidGet(..., flags) */
  	FidFCreate	= 0x01,
  	FidFWlock	= 0x02,
  };
  
  enum {					/* Fid.open */
  	FidOCreate	= 0x01,
  	FidORead	= 0x02,
  	FidOWrite	= 0x04,
  	FidORclose	= 0x08,
  };
  
  /*
   * 9p.c
   */
  extern int (*rFcall[Tmax])(Msg*);
  extern int validFileName(char*);
  
  /*
   * 9auth.c
   */
  extern int authCheck(Fcall*, Fid*, Fsys*);
  extern int authRead(Fid*, void*, int);
  extern int authWrite(Fid*, void*, int);
  
  /*
   * 9dir.c
   */
  extern void dirBufFree(DirBuf*);
  extern int dirDe2M(DirEntry*, uchar*, int);
  extern int dirRead(Fid*, uchar*, int, vlong);
  
  /*
   * 9excl.c
   */
  extern int exclAlloc(Fid*);
  extern void exclFree(Fid*);
  extern void exclInit(void);
  extern int exclUpdate(Fid*);
  
  /*
   * 9fid.c
   */
  extern void fidClunk(Fid*);
  extern void fidClunkAll(Con*);
  extern Fid* fidGet(Con*, u32int, int);
  extern void fidInit(void);
  extern void fidPut(Fid*);
  
  /*
   * 9fsys.c
   */
  extern void fsysFsRlock(Fsys*);
  extern void fsysFsRUnlock(Fsys*);
  extern Fs* fsysGetFs(Fsys*);
  extern Fsys* fsysGet(char*);
  extern char* fsysGetName(Fsys*);
  extern File* fsysGetRoot(Fsys*, char*);
  extern Fsys* fsysIncRef(Fsys*);
  extern int fsysInit(void);
  extern int fsysNoAuthCheck(Fsys*);
  extern int fsysNoPermCheck(Fsys*);
  extern void fsysPut(Fsys*);
  extern int fsysWstatAllow(Fsys*);
  
  /*
   * 9lstn.c
   */
  extern int lstnInit(void);
  
  /*
   * 9proc.c
   */
  extern Con* conAlloc(int, char*, int);
  extern void conInit(void);
  extern void msgFlush(Msg*);
  extern void msgInit(void);
  
  /*
   * 9srv.c
   */
  extern int srvInit(void);
  
  /*
   * 9user.c
   */
  extern int groupLeader(char*, char*);
  extern int groupMember(char*, char*);
  extern int groupWriteMember(char*);
  extern char* unameByUid(char*);
  extern char* uidByUname(char*);
  extern int usersInit(void);
  extern int usersFileRead(char*);
  extern int validUserName(char*);
  
  extern char* uidadm;
  extern char* unamenone;
  extern char* uidnoworld;
  
  /*
   * Ccli.c
   */
  extern int cliAddCmd(char*, int (*)(int, char*[]));
  extern int cliError(char*, ...);
  extern int cliInit(void);
  extern int cliExec(char*);
  #pragma	varargck	argpos	cliError	1
  
  /*
   * Ccmd.c
   */
  extern int cmdInit(void);
  
  /*
   * Ccons.c
   */
  extern int consPrompt(char*);
  extern int consInit(void);
  extern int consOpen(int, int, int);
  extern int consTTY(void);
  extern int consWrite(char*, int);
  
  /*
   * Clog.c
   */
  extern int consPrint(char*, ...);
  extern int consVPrint(char*, va_list);
  #pragma	varargck	argpos	consPrint	1
  
  /*
   * fossil.c
   */
  extern int Dflag;
  