xref: /inferno-os/module/styxservers.m (revision ad4c862fd80d3ad38a6464a9ea169a78354a77fc)
1Styxservers: module
2{
3	PATH: con "/dis/lib/styxservers.dis";
4
5	Fid: adt {
6		fid:		int;		# client's fid
7		path:		big;		# file's 64-bit unique path
8		qtype:	int;		# file's qid type (eg, Sys->QTDIR if directory)
9		isopen:	int;		# non-zero if file is open
10		mode:	int;		# if open, the open mode
11		doffset:	(int, int);	# (internal) cache of directory offset
12		uname:	string;	# user name from original attach
13		param:	string;	# attach aname from original attach
14		data:		array of byte;	# application data
15
16		clone:	fn(f: self ref Fid, nf: ref Fid): ref Fid;
17		open:	fn(f: self ref Fid, mode: int, qid: Sys->Qid);
18		walk:	fn(f: self ref Fid, qid: Sys->Qid);
19	};
20
21	Navigator: adt {
22		c:		chan of ref Navop;
23		reply:	chan of (ref Sys->Dir, string);
24
25		new:		fn(c: chan of ref Navop): ref Navigator;
26		stat:		fn(t: self ref Navigator, q: big): (ref Sys->Dir, string);
27		walk:	fn(t: self ref Navigator, parentq: big, name: string): (ref Sys->Dir, string);
28		readdir:	fn(t: self ref Navigator, q: big, offset, count: int): array of ref Sys->Dir;
29	};
30
31	Navop: adt {
32		reply:	chan of (ref Sys->Dir, string);	# channel for reply
33		path:		big;		# file or directory path
34		pick {
35		Stat =>
36		Walk =>
37			name: string;
38		Readdir =>
39			offset:	int;	# index (origin 0) of first directory entry to return
40			count: 	int;	# number of directory entries requested
41		}
42	};
43
44	Styxserver: adt {
45		fd:		ref Sys->FD;		# file server end of connection
46		fids:		array of list of ref Fid;	# hash table of fids
47		fidlock:	chan of int;
48		t:		ref Navigator;	# name space navigator for this server
49		rootpath:	big;		# Qid.path of root of its name space
50		msize:	int;		# negotiated Styx message size
51		replychan:	chan of ref Styx->Rmsg;
52
53		new:		fn(fd: ref Sys->FD, t: ref Navigator, rootpath: big): (chan of ref Styx->Tmsg, ref Styxserver);
54		reply:	fn(srv: self ref Styxserver, m: ref Styx->Rmsg): int;
55		replydirect:	fn(srv: self ref Styxserver, m: ref Styx->Rmsg): int;
56		error:	fn(srv: self ref Styxserver, m: ref Styx->Tmsg, msg: string);
57
58		# protocol operations
59		attach:	fn(srv: self ref Styxserver, m: ref Styx->Tmsg.Attach): ref Fid;
60		clunk:	fn(srv: self ref Styxserver, m: ref Styx->Tmsg.Clunk): ref Fid;
61		walk:	fn(srv: self ref Styxserver, m: ref Styx->Tmsg.Walk): ref Fid;
62		open:	fn(srv: self ref Styxserver, m: ref Styx->Tmsg.Open): ref Fid;
63		read:		fn(srv: self ref Styxserver, m: ref Styx->Tmsg.Read): ref Fid;
64		remove:	fn(srv: self ref Styxserver, m: ref Styx->Tmsg.Remove): ref Fid;
65		stat:		fn(srv: self ref Styxserver, m: ref Styx->Tmsg.Stat);
66
67		default:	fn(srv: self ref Styxserver, gm: ref Styx->Tmsg);
68
69		# check validity but don't reply
70		cancreate:	fn(srv: self ref Styxserver, m: ref Styx->Tmsg.Create): (ref Fid, int, ref Sys->Dir, string);
71		canopen:		fn(srv: self ref Styxserver, m: ref Styx->Tmsg.Open): (ref Fid, int, ref Sys->Dir, string);
72		canremove:	fn(srv: self ref Styxserver, m: ref Styx->Tmsg.Remove): (ref Fid, big, string);
73		canread:		fn(srv: self ref Styxserver, m: ref Styx->Tmsg.Read): (ref Fid, string);
74		canwrite:		fn(srv: self ref Styxserver, m: ref Styx->Tmsg.Write): (ref Fid, string);
75
76		# fid management
77		getfid:	fn(srv: self ref Styxserver, fid: int): ref Fid;
78		newfid:	fn(srv: self ref Styxserver, fid: int): ref Fid;
79		delfid:	fn(srv: self ref Styxserver, c: ref Fid);
80		allfids:	fn(srv: self ref Styxserver): list of ref Fid;
81
82		iounit:	fn(srv: self ref Styxserver): int;
83	};
84
85	init:		fn(styx: Styx);
86	traceset:	fn(on: int);
87
88	readbytes: fn(m: ref Styx->Tmsg.Read, d: array of byte): ref Styx->Rmsg.Read;
89	readstr: fn(m: ref Styx->Tmsg.Read, s: string): ref Styx->Rmsg.Read;
90
91	openok:	fn(uname: string, omode, perm: int, fuid, fgid: string): int;
92	openmode: fn(o: int): int;
93
94	Einuse:	con "fid already in use";
95	Ebadfid:	con "bad fid";
96	Eopen:	con "fid already opened";
97	Enotfound:	con "file does not exist";
98	Enotdir:	con "not a directory";
99	Eperm:	con "permission denied";
100	Ebadarg:	con "bad argument";
101	Eexists:	con "file already exists";
102	Emode:	con "open/create -- unknown mode";
103	Eoffset:	con "read/write -- bad offset";
104	Ecount:	con "read/write -- count negative or exceeds msgsize";
105	Enotopen: con "read/write -- on non open fid";
106	Eaccess:	con "read/write -- not open in suitable mode";
107	Ename:		con "bad character in file name";
108	Edot:		con ". and .. are illegal names";
109};
110
111Nametree: module {
112	PATH: con "/dis/lib/nametree.dis";
113	Tree: adt {
114		c:		chan of ref Treeop;
115		reply:	chan of string;
116
117		quit:		fn(t: self ref Tree);
118		create:	fn(t: self ref Tree, parent: big, d: Sys->Dir): string;
119		wstat:	fn(t: self ref Tree, path: big, d: Sys->Dir): string;
120		remove:	fn(t: self ref Tree, path: big): string;
121		getpath:	fn(t: self ref Tree, path: big): string;
122	};
123	Treeop: adt {
124		reply: chan of string;
125		q: big;
126		pick {
127		Create or
128		Wstat =>
129			d: Sys->Dir;
130		Remove =>
131		Getpath =>
132		}
133	};
134	init:		fn();
135	start:		fn(): (ref Tree, chan of ref Styxservers->Navop);
136};
137