xref: /inferno-os/module/styx.m (revision 46439007cf417cbd9ac8049bb4122c890097a0fa)
1*46439007SCharles.ForsythStyx: module
2*46439007SCharles.Forsyth{
3*46439007SCharles.Forsyth	PATH:	con "/dis/lib/styx.dis";
4*46439007SCharles.Forsyth	PATHV1:	con "/dis/lib/styx1.dis";
5*46439007SCharles.Forsyth
6*46439007SCharles.Forsyth	VERSION:	con "9P2000";
7*46439007SCharles.Forsyth	MAXWELEM:	con 16;
8*46439007SCharles.Forsyth
9*46439007SCharles.Forsyth	NOTAG:	con 16rFFFF;
10*46439007SCharles.Forsyth	NOFID:	con int ~0;	# 32 bits in this version of Styx
11*46439007SCharles.Forsyth
12*46439007SCharles.Forsyth	BIT8SZ:	con 1;
13*46439007SCharles.Forsyth	BIT16SZ:	con 2;
14*46439007SCharles.Forsyth	BIT32SZ:	con 4;
15*46439007SCharles.Forsyth	BIT64SZ:	con 8;
16*46439007SCharles.Forsyth	QIDSZ:	con BIT8SZ+BIT32SZ+BIT64SZ;
17*46439007SCharles.Forsyth
18*46439007SCharles.Forsyth	STATFIXLEN:	con BIT16SZ+QIDSZ+5*BIT16SZ+4*BIT32SZ+BIT64SZ;	# amount of fixed length data in a stat buffer
19*46439007SCharles.Forsyth	IOHDRSZ:	con 24;	# room for Twrite/Rread header
20*46439007SCharles.Forsyth	MAXFDATA: con 8192;	# `reasonable' iounit
21*46439007SCharles.Forsyth	MAXRPC:	con IOHDRSZ+MAXFDATA;	# usable default for fversion and iounit
22*46439007SCharles.Forsyth
23*46439007SCharles.Forsyth	Tversion,		# 100
24*46439007SCharles.Forsyth	Rversion,
25*46439007SCharles.Forsyth	Tauth,		# 102
26*46439007SCharles.Forsyth	Rauth,
27*46439007SCharles.Forsyth	Tattach,		# 104
28*46439007SCharles.Forsyth	Rattach,
29*46439007SCharles.Forsyth	Terror,		# 106, illegal
30*46439007SCharles.Forsyth	Rerror,
31*46439007SCharles.Forsyth	Tflush,		#108
32*46439007SCharles.Forsyth	Rflush,
33*46439007SCharles.Forsyth	Twalk,		# 110
34*46439007SCharles.Forsyth	Rwalk,
35*46439007SCharles.Forsyth	Topen,		# 112
36*46439007SCharles.Forsyth	Ropen,
37*46439007SCharles.Forsyth	Tcreate,		# 114
38*46439007SCharles.Forsyth	Rcreate,
39*46439007SCharles.Forsyth	Tread,		# 116
40*46439007SCharles.Forsyth	Rread,
41*46439007SCharles.Forsyth	Twrite,		# 118
42*46439007SCharles.Forsyth	Rwrite,
43*46439007SCharles.Forsyth	Tclunk,		# 120
44*46439007SCharles.Forsyth	Rclunk,
45*46439007SCharles.Forsyth	Tremove,		# 122
46*46439007SCharles.Forsyth	Rremove,
47*46439007SCharles.Forsyth	Tstat,		# 124
48*46439007SCharles.Forsyth	Rstat,
49*46439007SCharles.Forsyth	Twstat,		#126
50*46439007SCharles.Forsyth	Rwstat,
51*46439007SCharles.Forsyth	Tmax: con 100+iota;
52*46439007SCharles.Forsyth
53*46439007SCharles.Forsyth	ERRMAX:	con 128;
54*46439007SCharles.Forsyth
55*46439007SCharles.Forsyth	OREAD:	con 0; 		# open for read
56*46439007SCharles.Forsyth	OWRITE:	con 1; 		# write
57*46439007SCharles.Forsyth	ORDWR:	con 2; 		# read and write
58*46439007SCharles.Forsyth	OEXEC:	con 3; 		# execute, == read but check execute permission
59*46439007SCharles.Forsyth	OTRUNC:	con 16; 		# or'ed in (except for exec), truncate file first
60*46439007SCharles.Forsyth	ORCLOSE: con 64; 		# or'ed in, remove on close
61*46439007SCharles.Forsyth
62*46439007SCharles.Forsyth	# mode bits in Dir.mode used by the protocol
63*46439007SCharles.Forsyth	DMDIR:		con int 1<<31;		# mode bit for directory
64*46439007SCharles.Forsyth	DMAPPEND:	con int 1<<30;		# mode bit for append-only files
65*46439007SCharles.Forsyth	DMEXCL:		con int 1<<29;		# mode bit for exclusive use files
66*46439007SCharles.Forsyth	DMAUTH:		con int 1<<27;		# mode bit for authentication files
67*46439007SCharles.Forsyth
68*46439007SCharles.Forsyth	# Qid.qtype
69*46439007SCharles.Forsyth	QTDIR:	con 16r80;
70*46439007SCharles.Forsyth	QTAPPEND:	con 16r40;
71*46439007SCharles.Forsyth	QTEXCL:	con 16r20;
72*46439007SCharles.Forsyth	QTAUTH:	con 16r08;
73*46439007SCharles.Forsyth	QTFILE:	con 16r00;
74*46439007SCharles.Forsyth
75*46439007SCharles.Forsyth	Tmsg: adt {
76*46439007SCharles.Forsyth		tag: int;
77*46439007SCharles.Forsyth		pick {
78*46439007SCharles.Forsyth		Readerror =>
79*46439007SCharles.Forsyth			error: string;		# tag is unused in this case
80*46439007SCharles.Forsyth		Version =>
81*46439007SCharles.Forsyth			msize: int;
82*46439007SCharles.Forsyth			version: string;
83*46439007SCharles.Forsyth		Auth =>
84*46439007SCharles.Forsyth			afid: int;
85*46439007SCharles.Forsyth			uname, aname: string;
86*46439007SCharles.Forsyth		Attach =>
87*46439007SCharles.Forsyth			fid, afid: int;
88*46439007SCharles.Forsyth			uname, aname: string;
89*46439007SCharles.Forsyth		Flush =>
90*46439007SCharles.Forsyth			oldtag: int;
91*46439007SCharles.Forsyth		Walk =>
92*46439007SCharles.Forsyth			fid, newfid: int;
93*46439007SCharles.Forsyth			names: array of string;
94*46439007SCharles.Forsyth		Open =>
95*46439007SCharles.Forsyth			fid, mode: int;
96*46439007SCharles.Forsyth		Create =>
97*46439007SCharles.Forsyth			fid: int;
98*46439007SCharles.Forsyth			name: string;
99*46439007SCharles.Forsyth			perm, mode: int;
100*46439007SCharles.Forsyth		Read =>
101*46439007SCharles.Forsyth			fid: int;
102*46439007SCharles.Forsyth			offset: big;
103*46439007SCharles.Forsyth			count: int;
104*46439007SCharles.Forsyth		Write =>
105*46439007SCharles.Forsyth			fid: int;
106*46439007SCharles.Forsyth			offset: big;
107*46439007SCharles.Forsyth			data: array of byte;
108*46439007SCharles.Forsyth		Clunk or
109*46439007SCharles.Forsyth		Stat or
110*46439007SCharles.Forsyth		Remove =>
111*46439007SCharles.Forsyth			fid: int;
112*46439007SCharles.Forsyth		Wstat =>
113*46439007SCharles.Forsyth			fid: int;
114*46439007SCharles.Forsyth			stat: Sys->Dir;
115*46439007SCharles.Forsyth		}
116*46439007SCharles.Forsyth
117*46439007SCharles.Forsyth		read:	fn(fd: ref Sys->FD, msize: int): ref Tmsg;
118*46439007SCharles.Forsyth		unpack:	fn(a: array of byte): (int, ref Tmsg);
119*46439007SCharles.Forsyth		pack:	fn(nil: self ref Tmsg): array of byte;
120*46439007SCharles.Forsyth		packedsize:	fn(nil: self ref Tmsg): int;
121*46439007SCharles.Forsyth		text:	fn(nil: self ref Tmsg): string;
122*46439007SCharles.Forsyth		mtype: fn(nil: self ref Tmsg): int;
123*46439007SCharles.Forsyth	};
124*46439007SCharles.Forsyth
125*46439007SCharles.Forsyth	Rmsg: adt {
126*46439007SCharles.Forsyth		tag: int;
127*46439007SCharles.Forsyth		pick {
128*46439007SCharles.Forsyth		Readerror =>
129*46439007SCharles.Forsyth			error: string;		# tag is unused in this case
130*46439007SCharles.Forsyth		Version =>
131*46439007SCharles.Forsyth			msize: int;
132*46439007SCharles.Forsyth			version: string;
133*46439007SCharles.Forsyth		Auth =>
134*46439007SCharles.Forsyth			aqid: Sys->Qid;
135*46439007SCharles.Forsyth		Attach =>
136*46439007SCharles.Forsyth			qid: Sys->Qid;
137*46439007SCharles.Forsyth		Flush =>
138*46439007SCharles.Forsyth		Error =>
139*46439007SCharles.Forsyth			ename: string;
140*46439007SCharles.Forsyth		Clunk or
141*46439007SCharles.Forsyth		Remove or
142*46439007SCharles.Forsyth		Wstat =>
143*46439007SCharles.Forsyth		Walk =>
144*46439007SCharles.Forsyth			qids: array of Sys->Qid;
145*46439007SCharles.Forsyth		Create or
146*46439007SCharles.Forsyth		Open =>
147*46439007SCharles.Forsyth			qid: Sys->Qid;
148*46439007SCharles.Forsyth			iounit: int;
149*46439007SCharles.Forsyth		Read =>
150*46439007SCharles.Forsyth			data: array of byte;
151*46439007SCharles.Forsyth		Write =>
152*46439007SCharles.Forsyth			count: int;
153*46439007SCharles.Forsyth		Stat =>
154*46439007SCharles.Forsyth			stat: Sys->Dir;
155*46439007SCharles.Forsyth		}
156*46439007SCharles.Forsyth
157*46439007SCharles.Forsyth		read:	fn(fd: ref Sys->FD, msize: int): ref Rmsg;
158*46439007SCharles.Forsyth		unpack:	fn(a: array of byte): (int, ref Rmsg);
159*46439007SCharles.Forsyth		pack:	fn(nil: self ref Rmsg): array of byte;
160*46439007SCharles.Forsyth		packedsize:	fn(nil: self ref Rmsg): int;
161*46439007SCharles.Forsyth		text:	fn(nil: self ref Rmsg): string;
162*46439007SCharles.Forsyth		mtype: fn(nil: self ref Rmsg): int;
163*46439007SCharles.Forsyth	};
164*46439007SCharles.Forsyth
165*46439007SCharles.Forsyth	init:	fn();
166*46439007SCharles.Forsyth
167*46439007SCharles.Forsyth	readmsg:	fn(fd: ref Sys->FD, msize: int): (array of byte, string);
168*46439007SCharles.Forsyth	istmsg:	fn(f: array of byte): int;
169*46439007SCharles.Forsyth
170*46439007SCharles.Forsyth	compatible:	fn(t: ref Tmsg.Version, msize: int, version: string): (int, string);
171*46439007SCharles.Forsyth
172*46439007SCharles.Forsyth	packdirsize:	fn(d: Sys->Dir): int;
173*46439007SCharles.Forsyth	packdir:	fn(d: Sys->Dir): array of byte;
174*46439007SCharles.Forsyth	unpackdir: fn(f: array of byte): (int, Sys->Dir);
175*46439007SCharles.Forsyth	dir2text:	fn(d: Sys->Dir): string;
176*46439007SCharles.Forsyth	qid2text:	fn(q: Sys->Qid): string;
177*46439007SCharles.Forsyth
178*46439007SCharles.Forsyth	utflen:	fn(s: string): int;
179*46439007SCharles.Forsyth
180*46439007SCharles.Forsyth	# temporary undocumented compatibility function
181*46439007SCharles.Forsyth	write:	fn(fd: ref Sys->FD, a: array of byte, n: int): int;
182*46439007SCharles.Forsyth};
183