xref: /plan9/sys/include/9p.h (revision 431b537f89739e6d2b03b1e1ab5b5ede800a27c2)
17dd7cddfSDavid du Colombier #pragma src "/sys/src/lib9p"
27dd7cddfSDavid du Colombier #pragma lib "lib9p.a"
37dd7cddfSDavid du Colombier 
49a747e4fSDavid du Colombier /*
59a747e4fSDavid du Colombier  * Maps from ulongs to void*s.
69a747e4fSDavid du Colombier  */
79a747e4fSDavid du Colombier typedef struct Intmap	Intmap;
89a747e4fSDavid du Colombier 
912fd1c83SDavid du Colombier #pragma incomplete Intmap
1012fd1c83SDavid du Colombier 
119a747e4fSDavid du Colombier Intmap*	allocmap(void (*inc)(void*));
129a747e4fSDavid du Colombier void		freemap(Intmap*, void (*destroy)(void*));
139a747e4fSDavid du Colombier void*	lookupkey(Intmap*, ulong);
149a747e4fSDavid du Colombier void*	insertkey(Intmap*, ulong, void*);
159a747e4fSDavid du Colombier int		caninsertkey(Intmap*, ulong, void*);
169a747e4fSDavid du Colombier void*	deletekey(Intmap*, ulong);
179a747e4fSDavid du Colombier 
189a747e4fSDavid du Colombier /*
199a747e4fSDavid du Colombier  * Fid and Request structures.
209a747e4fSDavid du Colombier  */
217dd7cddfSDavid du Colombier typedef struct Fid		Fid;
229a747e4fSDavid du Colombier typedef struct Req		Req;
237dd7cddfSDavid du Colombier typedef struct Fidpool	Fidpool;
249a747e4fSDavid du Colombier typedef struct Reqpool	Reqpool;
257dd7cddfSDavid du Colombier typedef struct File		File;
267dd7cddfSDavid du Colombier typedef struct Filelist	Filelist;
277dd7cddfSDavid du Colombier typedef struct Tree		Tree;
289a747e4fSDavid du Colombier typedef struct Readdir	Readdir;
299a747e4fSDavid du Colombier typedef struct Srv Srv;
307dd7cddfSDavid du Colombier 
3112fd1c83SDavid du Colombier #pragma incomplete Filelist
3212fd1c83SDavid du Colombier #pragma incomplete Readdir
3312fd1c83SDavid du Colombier 
347dd7cddfSDavid du Colombier struct Fid
357dd7cddfSDavid du Colombier {
367dd7cddfSDavid du Colombier 	ulong	fid;
377dd7cddfSDavid du Colombier 	char		omode;	/* -1 = not open */
387dd7cddfSDavid du Colombier 	File*		file;
399a747e4fSDavid du Colombier 	char*	uid;
407dd7cddfSDavid du Colombier 	Qid		qid;
417dd7cddfSDavid du Colombier 	void*	aux;
427dd7cddfSDavid du Colombier 
437dd7cddfSDavid du Colombier /* below is implementation-specific; don't use */
449a747e4fSDavid du Colombier 	Readdir*	rdir;
457dd7cddfSDavid du Colombier 	Ref		ref;
467dd7cddfSDavid du Colombier 	Fidpool*	pool;
479a747e4fSDavid du Colombier 	vlong	diroffset;
489a747e4fSDavid du Colombier 	long		dirindex;
497dd7cddfSDavid du Colombier };
507dd7cddfSDavid du Colombier 
517dd7cddfSDavid du Colombier struct Req
527dd7cddfSDavid du Colombier {
537dd7cddfSDavid du Colombier 	ulong	tag;
547dd7cddfSDavid du Colombier 	void*	aux;
559a747e4fSDavid du Colombier 	Fcall		ifcall;
567dd7cddfSDavid du Colombier 	Fcall		ofcall;
579a747e4fSDavid du Colombier 	Dir		d;
589a747e4fSDavid du Colombier 	Req*		oldreq;
599a747e4fSDavid du Colombier 	Fid*		fid;
609a747e4fSDavid du Colombier 	Fid*		afid;
619a747e4fSDavid du Colombier 	Fid*		newfid;
629a747e4fSDavid du Colombier 	Srv*		srv;
637dd7cddfSDavid du Colombier 
647dd7cddfSDavid du Colombier /* below is implementation-specific; don't use */
657fd46167SDavid du Colombier 	QLock	lk;
667dd7cddfSDavid du Colombier 	Ref		ref;
677dd7cddfSDavid du Colombier 	Reqpool*	pool;
689a747e4fSDavid du Colombier 	uchar*	buf;
697dd7cddfSDavid du Colombier 	uchar	type;
707dd7cddfSDavid du Colombier 	uchar	responded;
717dd7cddfSDavid du Colombier 	char*	error;
7259cc4ca5SDavid du Colombier 	void*	rbuf;
737fd46167SDavid du Colombier 	Req**	flush;
747fd46167SDavid du Colombier 	int		nflush;
757dd7cddfSDavid du Colombier };
767dd7cddfSDavid du Colombier 
779a747e4fSDavid du Colombier /*
789a747e4fSDavid du Colombier  * Pools to maintain Fid <-> fid and Req <-> tag maps.
799a747e4fSDavid du Colombier  */
807dd7cddfSDavid du Colombier 
819a747e4fSDavid du Colombier struct Fidpool {
829a747e4fSDavid du Colombier 	Intmap	*map;
839a747e4fSDavid du Colombier 	void		(*destroy)(Fid*);
849a747e4fSDavid du Colombier 	Srv		*srv;
857dd7cddfSDavid du Colombier };
867dd7cddfSDavid du Colombier 
879a747e4fSDavid du Colombier struct Reqpool {
889a747e4fSDavid du Colombier 	Intmap	*map;
899a747e4fSDavid du Colombier 	void		(*destroy)(Req*);
909a747e4fSDavid du Colombier 	Srv		*srv;
919a747e4fSDavid du Colombier };
929a747e4fSDavid du Colombier 
939a747e4fSDavid du Colombier Fidpool*	allocfidpool(void (*destroy)(Fid*));
949a747e4fSDavid du Colombier void		freefidpool(Fidpool*);
959a747e4fSDavid du Colombier Fid*		allocfid(Fidpool*, ulong);
969a747e4fSDavid du Colombier Fid*		lookupfid(Fidpool*, ulong);
979a747e4fSDavid du Colombier void		closefid(Fid*);
989a747e4fSDavid du Colombier Fid*		removefid(Fidpool*, ulong);
999a747e4fSDavid du Colombier 
1009a747e4fSDavid du Colombier Reqpool*	allocreqpool(void (*destroy)(Req*));
1019a747e4fSDavid du Colombier void		freereqpool(Reqpool*);
1029a747e4fSDavid du Colombier Req*		allocreq(Reqpool*, ulong);
1039a747e4fSDavid du Colombier Req*		lookupreq(Reqpool*, ulong);
1049a747e4fSDavid du Colombier void		closereq(Req*);
1059a747e4fSDavid du Colombier Req*		removereq(Reqpool*, ulong);
1069a747e4fSDavid du Colombier 
1079a747e4fSDavid du Colombier typedef	int	Dirgen(int, Dir*, void*);
1089a747e4fSDavid du Colombier void		dirread9p(Req*, Dirgen*, void*);
1099a747e4fSDavid du Colombier 
1109a747e4fSDavid du Colombier /*
1119a747e4fSDavid du Colombier  * File trees.
1129a747e4fSDavid du Colombier  */
1137dd7cddfSDavid du Colombier struct File {
1149a747e4fSDavid du Colombier 	Ref;
1157dd7cddfSDavid du Colombier 	Dir;
1167dd7cddfSDavid du Colombier 	File *parent;
1177dd7cddfSDavid du Colombier 	void *aux;
1187dd7cddfSDavid du Colombier 
1197dd7cddfSDavid du Colombier /* below is implementation-specific; don't use */
1209a747e4fSDavid du Colombier 	RWLock;
1217dd7cddfSDavid du Colombier 	Filelist *filelist;
1227dd7cddfSDavid du Colombier 	Tree *tree;
1239a747e4fSDavid du Colombier 	int nchild;
1249a747e4fSDavid du Colombier 	int allocd;
1259d47229fSDavid du Colombier 	int nxchild;
1269d47229fSDavid du Colombier 	Ref readers;
1277dd7cddfSDavid du Colombier };
1287dd7cddfSDavid du Colombier 
1297dd7cddfSDavid du Colombier struct Tree {
1307dd7cddfSDavid du Colombier 	File *root;
1319a747e4fSDavid du Colombier 	void	(*destroy)(File *file);
1327dd7cddfSDavid du Colombier 
1337dd7cddfSDavid du Colombier /* below is implementation-specific; don't use */
1349a747e4fSDavid du Colombier 	Lock genlock;
1357dd7cddfSDavid du Colombier 	ulong qidgen;
1367dd7cddfSDavid du Colombier 	ulong dirqidgen;
1377dd7cddfSDavid du Colombier };
1387dd7cddfSDavid du Colombier 
1399a747e4fSDavid du Colombier Tree*	alloctree(char*, char*, ulong, void(*destroy)(File*));
1409a747e4fSDavid du Colombier void		freetree(Tree*);
1419a747e4fSDavid du Colombier File*		createfile(File*, char*, char*, ulong, void*);
1429a747e4fSDavid du Colombier int		removefile(File*);
1439a747e4fSDavid du Colombier void		closefile(File*);
1449a747e4fSDavid du Colombier File*		walkfile(File*, char*);
1459a747e4fSDavid du Colombier Readdir*	opendirfile(File*);
1469a747e4fSDavid du Colombier long		readdirfile(Readdir*, uchar*, long);
1479a747e4fSDavid du Colombier void		closedirfile(Readdir*);
1487dd7cddfSDavid du Colombier 
1499a747e4fSDavid du Colombier /*
1503ff48bf5SDavid du Colombier  * Kernel-style command parser
1513ff48bf5SDavid du Colombier  */
1523ff48bf5SDavid du Colombier typedef struct Cmdbuf Cmdbuf;
1533ff48bf5SDavid du Colombier typedef struct Cmdtab Cmdtab;
1543ff48bf5SDavid du Colombier Cmdbuf*		parsecmd(char *a, int n);
1553ff48bf5SDavid du Colombier void		respondcmderror(Req*, Cmdbuf*, char*, ...);
1563ff48bf5SDavid du Colombier Cmdtab*	lookupcmd(Cmdbuf*, Cmdtab*, int);
1573ff48bf5SDavid du Colombier #pragma varargck argpos respondcmderr 3
1583ff48bf5SDavid du Colombier struct Cmdbuf
1593ff48bf5SDavid du Colombier {
1603ff48bf5SDavid du Colombier 	char	*buf;
1613ff48bf5SDavid du Colombier 	char	**f;
1623ff48bf5SDavid du Colombier 	int	nf;
1633ff48bf5SDavid du Colombier };
1643ff48bf5SDavid du Colombier 
1653ff48bf5SDavid du Colombier struct Cmdtab
1663ff48bf5SDavid du Colombier {
1673ff48bf5SDavid du Colombier 	int	index;	/* used by client to switch on result */
1683ff48bf5SDavid du Colombier 	char	*cmd;	/* command name */
1693ff48bf5SDavid du Colombier 	int	narg;	/* expected #args; 0 ==> variadic */
1703ff48bf5SDavid du Colombier };
1713ff48bf5SDavid du Colombier 
1723ff48bf5SDavid du Colombier /*
1739a747e4fSDavid du Colombier  * File service loop.
1749a747e4fSDavid du Colombier  */
1759a747e4fSDavid du Colombier struct Srv {
1769a747e4fSDavid du Colombier 	Tree*	tree;
1779a747e4fSDavid du Colombier 	void		(*destroyfid)(Fid*);
1789a747e4fSDavid du Colombier 	void		(*destroyreq)(Req*);
1799a747e4fSDavid du Colombier 	void		(*end)(Srv*);
1809a747e4fSDavid du Colombier 	void*	aux;
1817dd7cddfSDavid du Colombier 
1829a747e4fSDavid du Colombier 	void		(*attach)(Req*);
1839a747e4fSDavid du Colombier 	void		(*auth)(Req*);
1849a747e4fSDavid du Colombier 	void		(*open)(Req*);
1859a747e4fSDavid du Colombier 	void		(*create)(Req*);
1869a747e4fSDavid du Colombier 	void		(*read)(Req*);
1879a747e4fSDavid du Colombier 	void		(*write)(Req*);
1889a747e4fSDavid du Colombier 	void		(*remove)(Req*);
1899a747e4fSDavid du Colombier 	void		(*flush)(Req*);
1909a747e4fSDavid du Colombier 	void		(*stat)(Req*);
1919a747e4fSDavid du Colombier 	void		(*wstat)(Req*);
1929a747e4fSDavid du Colombier 	void		(*walk)(Req*);
1939a747e4fSDavid du Colombier 	char*	(*clone)(Fid*, Fid*);
1949a747e4fSDavid du Colombier 	char*	(*walk1)(Fid*, char*, Qid*);
1957dd7cddfSDavid du Colombier 
1969a747e4fSDavid du Colombier 	int		infd;
1979a747e4fSDavid du Colombier 	int		outfd;
1989a747e4fSDavid du Colombier 	int		nopipe;
1999a747e4fSDavid du Colombier 	int		srvfd;
2002ebbfa15SDavid du Colombier 	int		leavefdsopen;	/* magic for acme win */
20122a127bbSDavid du Colombier 	char*	keyspec;
2027dd7cddfSDavid du Colombier 
2039a747e4fSDavid du Colombier /* below is implementation-specific; don't use */
2049a747e4fSDavid du Colombier 	Fidpool*	fpool;
2059a747e4fSDavid du Colombier 	Reqpool*	rpool;
2069a747e4fSDavid du Colombier 	uint		msize;
2079a747e4fSDavid du Colombier 
2089a747e4fSDavid du Colombier 	uchar*	rbuf;
2099a747e4fSDavid du Colombier 	QLock	rlock;
2109a747e4fSDavid du Colombier 	uchar*	wbuf;
2119a747e4fSDavid du Colombier 	QLock	wlock;
21222a127bbSDavid du Colombier 
21322a127bbSDavid du Colombier 	char*	addr;
2149a747e4fSDavid du Colombier };
2159a747e4fSDavid du Colombier 
2169a747e4fSDavid du Colombier void		srv(Srv*);
2177dd7cddfSDavid du Colombier void		postmountsrv(Srv*, char*, char*, int);
21822a127bbSDavid du Colombier void		_postmountsrv(Srv*, char*, char*, int);
21922a127bbSDavid du Colombier void		listensrv(Srv*, char*);
22022a127bbSDavid du Colombier void		_listensrv(Srv*, char*);
2219a747e4fSDavid du Colombier int 		postfd(char*, int);
2229a747e4fSDavid du Colombier int		chatty9p;
2237dd7cddfSDavid du Colombier void		respond(Req*, char*);
22422a127bbSDavid du Colombier void		responderror(Req*);
22580ee5cbfSDavid du Colombier void		threadpostmountsrv(Srv*, char*, char*, int);
226*431b537fSDavid du Colombier void		threadlistensrv(Srv *s, char *addr);
22759cc4ca5SDavid du Colombier 
2289a747e4fSDavid du Colombier /*
2299a747e4fSDavid du Colombier  * Helper.  Assumes user is same as group.
2309a747e4fSDavid du Colombier  */
2317dd7cddfSDavid du Colombier int		hasperm(File*, char*, int);
2327dd7cddfSDavid du Colombier 
2339a747e4fSDavid du Colombier void*	emalloc9p(ulong);
2349a747e4fSDavid du Colombier void*	erealloc9p(void*, ulong);
2359a747e4fSDavid du Colombier char*	estrdup9p(char*);
2367dd7cddfSDavid du Colombier 
2377dd7cddfSDavid du Colombier enum {
2387dd7cddfSDavid du Colombier 	OMASK = 3
2397dd7cddfSDavid du Colombier };
24059cc4ca5SDavid du Colombier 
2419a747e4fSDavid du Colombier void		readstr(Req*, char*);
2429a747e4fSDavid du Colombier void		readbuf(Req*, void*, long);
24322a127bbSDavid du Colombier void		walkandclone(Req*, char*(*walk1)(Fid*,char*,void*),
24422a127bbSDavid du Colombier 			char*(*clone)(Fid*,Fid*,void*), void*);
24522a127bbSDavid du Colombier 
24622a127bbSDavid du Colombier void		auth9p(Req*);
24722a127bbSDavid du Colombier void		authread(Req*);
24822a127bbSDavid du Colombier void		authwrite(Req*);
24922a127bbSDavid du Colombier void		authdestroy(Fid*);
25022a127bbSDavid du Colombier int		authattach(Req*);
25122a127bbSDavid du Colombier 
25222a127bbSDavid du Colombier extern void (*_forker)(void (*)(void*), void*, int);
2537fd46167SDavid du Colombier 
254