119 lines · 3.0 KB · C
RawDownload
 #define Qroot		0#define MSGMAX	((((8192+128)*2)+3) & ~3) extern char Enomem[];	/* out of memory */extern char Eperm[];		/* permission denied */extern char Enodev[];	/* no free devices */extern char Ehungup[];	/* i/o on hungup channel */extern char Eexist[];		/* file exists */extern char Enonexist[];	/* file does not exist */extern char Ebadcmd[];	/* bad command */extern char Ebadarg[];	/* bad arguments */ typedef uvlong	Path;typedef struct Ninepserver Ninepserver;typedef struct Ninepops Ninepops;typedef struct Ninepfile Ninepfile;typedef struct Client Client;typedef struct Pending Pending;typedef struct Fid Fid; struct Ninepserver{	Ninepops *ops;	Path qidgen;	int connfd;	int needfile;	Client *clients;	Client *curc;	Fcall fcall;	Ninepfile *root;	Ninepfile **ftab;	void	*priv;	/* private */}; struct Client{	Ninepserver *server;	Client *next;	int		fd;	char	msg[MSGMAX];	uint		nread;		/* valid bytes in msg (including nc)*/	int		nc;			/* bytes consumed from front of msg by convM2S */	char	data[MSGMAX];	/* Tread/Rread data */	int		state;	Fid		*fids;	Pending **pending;	char		*uname;	/* uid */	char		*aname;	/* attach name */	void		*u;}; struct Pending{	Client *c;	Fcall fcall;	int flushed;	Pending *next;}; struct Ninepops{	char *(*newclient)(Client *c);	char *(*freeclient)(Client *c); 	char *(*attach)(Qid *qid, char *uname, char *aname);	char *(*walk)(Qid *qid, char *name);	char *(*open)(Qid *qid, int mode);	char *(*create)(Qid *qid, char *name, int perm, int mode);	char *(*read)(Qid qid, char *buf, ulong *n, vlong offset);	char *(*write)(Qid qid, char *buf, ulong *n, vlong offset);	char *(*close)(Qid qid, int mode);	char *(*remove)(Qid qid);	char *(*stat)(Qid qid, Dir *d);	char *(*wstat)(Qid qid, Dir *d);}; struct Ninepfile{	Dir	d;	Ninepfile *parent;	Ninepfile *child;	Ninepfile *sibling;	Ninepfile *next;	Ninepfile *bind;	int ref;	int open;	void	*u;}; char* ninepsetowner(char* user);char *ninepnamespace(void);char *ninepinit(Ninepserver *server, Ninepops *ops, char *address, int perm, int needfile);char *ninepend(Ninepserver *server); char *ninepwait(Ninepserver *server); void nineplisten(Ninepserver *server, int fd);int ninepready(Ninepserver *server, int fd); void ninepdefault(Ninepserver *server);void nineperror(Ninepserver *server, char *err);void ninepreply(Ninepserver *server); Pending *ninepreplylater(Ninepserver *server);void ninepcompleted(Pending *pend); Ninepfile *ninepaddfile(Ninepserver *server, Path pqid, Path qid, char *name, int mode, char *owner);Ninepfile *ninepadddir(Ninepserver *server, Path pqid, Path qid, char *name, int mode, char *owner);Ninepfile *ninepbind(Ninepserver *server, Path pqid, Path qid);int nineprmfile(Ninepserver *server, Path qid);Ninepfile *ninepfindfile(Ninepserver *server, Path qid); int	ninepperm(Ninepfile *file, char *uid, int mode);long ninepreadstr(ulong off, char *buf, ulong n, char *str);Qid ninepqid(int path, int isdir);void *ninepmalloc(int n);void ninepfree(void *p);void ninepdebug(void);