xref: /plan9/sys/include/venti.h (revision 368c31ab13393dea083228fdd1c3445076f83a4b)
19a747e4fSDavid du Colombier #pragma lib "libventi.a"
29a747e4fSDavid du Colombier #pragma src "/sys/src/libventi"
39a747e4fSDavid du Colombier 
4*368c31abSDavid du Colombier 
5*368c31abSDavid du Colombier /* XXX should be own library? */
6*368c31abSDavid du Colombier /*
7*368c31abSDavid du Colombier  * Packets
8*368c31abSDavid du Colombier  */
9*368c31abSDavid du Colombier enum
10*368c31abSDavid du Colombier {
11*368c31abSDavid du Colombier 	MaxFragSize = 9*1024
12*368c31abSDavid du Colombier };
13*368c31abSDavid du Colombier 
149a747e4fSDavid du Colombier typedef struct Packet Packet;
1512fd1c83SDavid du Colombier #pragma incomplete Packet
1612fd1c83SDavid du Colombier 
17*368c31abSDavid du Colombier Packet*	packetalloc(void);
18*368c31abSDavid du Colombier void	packetappend(Packet*, uchar *buf, int n);
19*368c31abSDavid du Colombier uint	packetasize(Packet*);
20*368c31abSDavid du Colombier int	packetcmp(Packet*, Packet*);
21*368c31abSDavid du Colombier int	packetcompact(Packet*);
22*368c31abSDavid du Colombier void	packetconcat(Packet*, Packet*);
23*368c31abSDavid du Colombier int	packetconsume(Packet*, uchar *buf, int n);
24*368c31abSDavid du Colombier int	packetcopy(Packet*, uchar *buf, int offset, int n);
25*368c31abSDavid du Colombier Packet*	packetdup(Packet*, int offset, int n);
26*368c31abSDavid du Colombier Packet*	packetforeign(uchar *buf, int n, void (*free)(void *a), void *a);
27*368c31abSDavid du Colombier int	packetfragments(Packet*, IOchunk*, int nio, int offset);
28*368c31abSDavid du Colombier void	packetfree(Packet*);
29*368c31abSDavid du Colombier uchar*	packetheader(Packet*, int n);
30*368c31abSDavid du Colombier uchar*	packetpeek(Packet*, uchar *buf, int offset, int n);
31*368c31abSDavid du Colombier void	packetprefix(Packet*, uchar *buf, int n);
32*368c31abSDavid du Colombier void	packetsha1(Packet*, uchar sha1[20]);
33*368c31abSDavid du Colombier uint	packetsize(Packet*);
34*368c31abSDavid du Colombier Packet*	packetsplit(Packet*, int n);
35*368c31abSDavid du Colombier void	packetstats(void);
36*368c31abSDavid du Colombier uchar*	packettrailer(Packet*, int n);
37*368c31abSDavid du Colombier int	packettrim(Packet*, int offset, int n);
38*368c31abSDavid du Colombier 
39*368c31abSDavid du Colombier /* XXX should be own library? */
40*368c31abSDavid du Colombier /*
41*368c31abSDavid du Colombier  * Logging
42*368c31abSDavid du Colombier  */
43*368c31abSDavid du Colombier typedef struct VtLog VtLog;
44*368c31abSDavid du Colombier typedef struct VtLogChunk VtLogChunk;
45*368c31abSDavid du Colombier 
46*368c31abSDavid du Colombier struct VtLog
47*368c31abSDavid du Colombier {
48*368c31abSDavid du Colombier 	VtLog	*next;		/* in hash table */
49*368c31abSDavid du Colombier 	char	*name;
50*368c31abSDavid du Colombier 	VtLogChunk *chunk;
51*368c31abSDavid du Colombier 	uint	nchunk;
52*368c31abSDavid du Colombier 	VtLogChunk *w;
53*368c31abSDavid du Colombier 	QLock	lk;
54*368c31abSDavid du Colombier 	int	ref;
55*368c31abSDavid du Colombier };
56*368c31abSDavid du Colombier 
57*368c31abSDavid du Colombier struct VtLogChunk
58*368c31abSDavid du Colombier {
59*368c31abSDavid du Colombier 	char	*p;
60*368c31abSDavid du Colombier 	char	*ep;
61*368c31abSDavid du Colombier 	char	*wp;
62*368c31abSDavid du Colombier };
63*368c31abSDavid du Colombier 
64*368c31abSDavid du Colombier VtLog*	vtlogopen(char *name, uint size);
65*368c31abSDavid du Colombier void	vtlogprint(VtLog *log, char *fmt, ...);
66*368c31abSDavid du Colombier void	vtlog(char *name, char *fmt, ...);
67*368c31abSDavid du Colombier void	vtlogclose(VtLog*);
68*368c31abSDavid du Colombier void	vtlogremove(char *name);
69*368c31abSDavid du Colombier char**	vtlognames(int*);
70*368c31abSDavid du Colombier void	vtlogdump(int fd, VtLog*);
71*368c31abSDavid du Colombier 
72*368c31abSDavid du Colombier /* XXX begin actual venti.h */
73*368c31abSDavid du Colombier 
74*368c31abSDavid du Colombier typedef struct VtFcall VtFcall;
75*368c31abSDavid du Colombier typedef struct VtConn VtConn;
76*368c31abSDavid du Colombier typedef struct VtEntry VtEntry;
77*368c31abSDavid du Colombier typedef struct VtRoot VtRoot;
78*368c31abSDavid du Colombier 
79*368c31abSDavid du Colombier /*
80*368c31abSDavid du Colombier  * Fundamental constants.
81*368c31abSDavid du Colombier  */
82*368c31abSDavid du Colombier enum
83*368c31abSDavid du Colombier {
84*368c31abSDavid du Colombier 	VtScoreSize	= 20,
85*368c31abSDavid du Colombier 	VtMaxStringSize = 1024,
869a747e4fSDavid du Colombier 	VtMaxLumpSize	= 56*1024,
87*368c31abSDavid du Colombier 	VtPointerDepth	= 7
88*368c31abSDavid du Colombier };
89*368c31abSDavid du Colombier #define VtMaxFileSize ((1ULL<<48)-1)
90*368c31abSDavid du Colombier 
91*368c31abSDavid du Colombier 
92*368c31abSDavid du Colombier /*
93*368c31abSDavid du Colombier  * Strings in packets.
94*368c31abSDavid du Colombier  */
95*368c31abSDavid du Colombier int vtputstring(Packet*, char*);
96*368c31abSDavid du Colombier int vtgetstring(Packet*, char**);
97*368c31abSDavid du Colombier 
98*368c31abSDavid du Colombier /*
99*368c31abSDavid du Colombier  * Block types.
100*368c31abSDavid du Colombier  *
101*368c31abSDavid du Colombier  * The initial Venti protocol had a much
102*368c31abSDavid du Colombier  * less regular list of block types.
103*368c31abSDavid du Colombier  * VtToDiskType converts from new to old.
104*368c31abSDavid du Colombier  */
105*368c31abSDavid du Colombier enum
106*368c31abSDavid du Colombier {
107*368c31abSDavid du Colombier 	VtDataType	= 0<<3,
108*368c31abSDavid du Colombier 	/* VtDataType+1, ... */
109*368c31abSDavid du Colombier 	VtDirType	= 1<<3,
110*368c31abSDavid du Colombier 	/* VtDirType+1, ... */
111*368c31abSDavid du Colombier 	VtRootType	= 2<<3,
112*368c31abSDavid du Colombier 	VtMaxType,
113*368c31abSDavid du Colombier 	VtCorruptType = 0xFF,
114*368c31abSDavid du Colombier 
115*368c31abSDavid du Colombier 	VtTypeDepthMask = 7,
116*368c31abSDavid du Colombier 	VtTypeBaseMask = ~VtTypeDepthMask
1179a747e4fSDavid du Colombier };
1189a747e4fSDavid du Colombier 
119*368c31abSDavid du Colombier /* convert to/from on-disk type numbers */
120*368c31abSDavid du Colombier uint vttodisktype(uint);
121*368c31abSDavid du Colombier uint vtfromdisktype(uint);
122*368c31abSDavid du Colombier 
123*368c31abSDavid du Colombier /*
124*368c31abSDavid du Colombier  * VtEntry describes a Venti stream
125*368c31abSDavid du Colombier  *
126*368c31abSDavid du Colombier  * The _ enums are only used on the wire.
127*368c31abSDavid du Colombier  * They are not present in the VtEntry structure
128*368c31abSDavid du Colombier  * and should not be used by client programs.
129*368c31abSDavid du Colombier  * (The info is in the type field.)
130*368c31abSDavid du Colombier  */
131*368c31abSDavid du Colombier enum
132*368c31abSDavid du Colombier {
133*368c31abSDavid du Colombier 	VtEntryActive = 1<<0,		/* entry is in use */
134*368c31abSDavid du Colombier 	_VtEntryDir = 1<<1,		/* a directory */
135*368c31abSDavid du Colombier 	_VtEntryDepthShift = 2,		/* shift for pointer depth */
136*368c31abSDavid du Colombier 	_VtEntryDepthMask = 7<<2,	/* mask for pointer depth */
137*368c31abSDavid du Colombier 	VtEntryLocal = 1<<5		/* for local storage only */
1389a747e4fSDavid du Colombier };
139*368c31abSDavid du Colombier enum
140*368c31abSDavid du Colombier {
141*368c31abSDavid du Colombier 	VtEntrySize = 40
1429a747e4fSDavid du Colombier };
143*368c31abSDavid du Colombier struct VtEntry
144*368c31abSDavid du Colombier {
145d9306527SDavid du Colombier 	ulong	gen;			/* generation number */
146d9306527SDavid du Colombier 	ushort	psize;			/* pointer block size */
147d9306527SDavid du Colombier 	ushort	dsize;			/* data block size */
148*368c31abSDavid du Colombier 	uchar	type;
149d9306527SDavid du Colombier 	uchar	flags;
150d9306527SDavid du Colombier 	uvlong	size;
1519a747e4fSDavid du Colombier 	uchar	score[VtScoreSize];
1529a747e4fSDavid du Colombier };
1539a747e4fSDavid du Colombier 
154*368c31abSDavid du Colombier void vtentrypack(VtEntry*, uchar*, int index);
155*368c31abSDavid du Colombier int vtentryunpack(VtEntry*, uchar*, int index);
156*368c31abSDavid du Colombier 
157*368c31abSDavid du Colombier struct VtRoot
158*368c31abSDavid du Colombier {
159*368c31abSDavid du Colombier 	char	name[128];
160*368c31abSDavid du Colombier 	char	type[128];
161*368c31abSDavid du Colombier 	uchar	score[VtScoreSize];	/* to a Dir block */
162*368c31abSDavid du Colombier 	ushort	blocksize;		/* maximum block size */
163*368c31abSDavid du Colombier 	uchar	prev[VtScoreSize];	/* last root block */
1649a747e4fSDavid du Colombier };
1659a747e4fSDavid du Colombier 
166*368c31abSDavid du Colombier enum
167*368c31abSDavid du Colombier {
168*368c31abSDavid du Colombier 	VtRootSize = 300,
169*368c31abSDavid du Colombier 	VtRootVersion = 2
1709a747e4fSDavid du Colombier };
1719a747e4fSDavid du Colombier 
172*368c31abSDavid du Colombier void vtrootpack(VtRoot*, uchar*);
173*368c31abSDavid du Colombier int vtrootunpack(VtRoot*, uchar*);
1749a747e4fSDavid du Colombier 
175*368c31abSDavid du Colombier /*
176*368c31abSDavid du Colombier  * score of zero length block
177*368c31abSDavid du Colombier  */
178*368c31abSDavid du Colombier extern uchar vtzeroscore[VtScoreSize];
1799a747e4fSDavid du Colombier 
180*368c31abSDavid du Colombier /*
181*368c31abSDavid du Colombier  * zero extend and truncate blocks
182*368c31abSDavid du Colombier  */
183*368c31abSDavid du Colombier void vtzeroextend(int type, uchar *buf, uint n, uint nn);
184*368c31abSDavid du Colombier uint vtzerotruncate(int type, uchar *buf, uint n);
1859a747e4fSDavid du Colombier 
186*368c31abSDavid du Colombier /*
187*368c31abSDavid du Colombier  * parse score: mungs s
188*368c31abSDavid du Colombier  */
189*368c31abSDavid du Colombier int vtparsescore(char *s, char **prefix, uchar[VtScoreSize]);
1909a747e4fSDavid du Colombier 
1919a747e4fSDavid du Colombier /*
1929a747e4fSDavid du Colombier  * formatting
1939a747e4fSDavid du Colombier  * other than noted, these formats all ignore
1949a747e4fSDavid du Colombier  * the width and precision arguments, and all flags
1959a747e4fSDavid du Colombier  *
1969a747e4fSDavid du Colombier  * V	a venti score
1979a747e4fSDavid du Colombier  */
1989a747e4fSDavid du Colombier #pragma	varargck	type	"V"	uchar*
199*368c31abSDavid du Colombier #pragma	varargck	type	"F"	VtFcall*
200*368c31abSDavid du Colombier #pragma	varargck	type	"T"	void
201*368c31abSDavid du Colombier #pragma	varargck	type	"lT"	void
202d9306527SDavid du Colombier 
203*368c31abSDavid du Colombier int vtscorefmt(Fmt*);
2046b6b9ac8SDavid du Colombier 
205*368c31abSDavid du Colombier /*
206*368c31abSDavid du Colombier  * error-checking malloc et al.
207*368c31abSDavid du Colombier  */
208*368c31abSDavid du Colombier void	vtfree(void *);
209*368c31abSDavid du Colombier void*	vtmalloc(int);
210*368c31abSDavid du Colombier void*	vtmallocz(int);
211*368c31abSDavid du Colombier void*	vtrealloc(void *p, int);
212*368c31abSDavid du Colombier void*	vtbrk(int n);
213*368c31abSDavid du Colombier char*	vtstrdup(char *);
214*368c31abSDavid du Colombier 
215*368c31abSDavid du Colombier /*
216*368c31abSDavid du Colombier  * Venti protocol
217*368c31abSDavid du Colombier  */
218*368c31abSDavid du Colombier 
219*368c31abSDavid du Colombier /*
220*368c31abSDavid du Colombier  * Crypto strengths
221*368c31abSDavid du Colombier  */
222*368c31abSDavid du Colombier enum
223*368c31abSDavid du Colombier {
224*368c31abSDavid du Colombier 	VtCryptoStrengthNone,
225*368c31abSDavid du Colombier 	VtCryptoStrengthAuth,
226*368c31abSDavid du Colombier 	VtCryptoStrengthWeak,
227*368c31abSDavid du Colombier 	VtCryptoStrengthStrong
228*368c31abSDavid du Colombier };
229*368c31abSDavid du Colombier 
230*368c31abSDavid du Colombier /*
231*368c31abSDavid du Colombier  * Crypto suites
232*368c31abSDavid du Colombier  */
233*368c31abSDavid du Colombier enum
234*368c31abSDavid du Colombier {
235*368c31abSDavid du Colombier 	VtCryptoNone,
236*368c31abSDavid du Colombier 	VtCryptoSSL3,
237*368c31abSDavid du Colombier 	VtCryptoTLS1,
238*368c31abSDavid du Colombier 	VtCryptoMax
239*368c31abSDavid du Colombier };
240*368c31abSDavid du Colombier 
241*368c31abSDavid du Colombier /*
242*368c31abSDavid du Colombier  * Codecs
243*368c31abSDavid du Colombier  */
244*368c31abSDavid du Colombier enum
245*368c31abSDavid du Colombier {
246*368c31abSDavid du Colombier 	VtCodecNone,
247*368c31abSDavid du Colombier 	VtCodecDeflate,
248*368c31abSDavid du Colombier 	VtCodecThwack,
249*368c31abSDavid du Colombier 	VtCodecMax
250*368c31abSDavid du Colombier };
251*368c31abSDavid du Colombier 
252*368c31abSDavid du Colombier enum
253*368c31abSDavid du Colombier {
254*368c31abSDavid du Colombier 	VtRerror	= 1,
255*368c31abSDavid du Colombier 	VtTping		= 2,
256*368c31abSDavid du Colombier 	VtRping,
257*368c31abSDavid du Colombier 	VtThello	= 4,
258*368c31abSDavid du Colombier 	VtRhello,
259*368c31abSDavid du Colombier 	VtTgoodbye	= 6,
260*368c31abSDavid du Colombier 	VtRgoodbye,	/* not used */
261*368c31abSDavid du Colombier 	VtTauth0	= 8,
262*368c31abSDavid du Colombier 	VtRauth0,
263*368c31abSDavid du Colombier 	VtTauth1	= 10,
264*368c31abSDavid du Colombier 	VtRauth1,
265*368c31abSDavid du Colombier 	VtTread		= 12,
266*368c31abSDavid du Colombier 	VtRread,
267*368c31abSDavid du Colombier 	VtTwrite	= 14,
268*368c31abSDavid du Colombier 	VtRwrite,
269*368c31abSDavid du Colombier 	VtTsync		= 16,
270*368c31abSDavid du Colombier 	VtRsync,
271*368c31abSDavid du Colombier 
272*368c31abSDavid du Colombier 	VtTmax
273*368c31abSDavid du Colombier };
274*368c31abSDavid du Colombier 
275*368c31abSDavid du Colombier struct VtFcall
276*368c31abSDavid du Colombier {
277*368c31abSDavid du Colombier 	uchar	msgtype;
278*368c31abSDavid du Colombier 	uchar	tag;
279*368c31abSDavid du Colombier 
280*368c31abSDavid du Colombier 	char	*error;		/* Rerror */
281*368c31abSDavid du Colombier 
282*368c31abSDavid du Colombier 	char	*version;	/* Thello */
283*368c31abSDavid du Colombier 	char	*uid;		/* Thello */
284*368c31abSDavid du Colombier 	uchar	strength;	/* Thello */
285*368c31abSDavid du Colombier 	uchar	*crypto;	/* Thello */
286*368c31abSDavid du Colombier 	uint	ncrypto;	/* Thello */
287*368c31abSDavid du Colombier 	uchar	*codec;		/* Thello */
288*368c31abSDavid du Colombier 	uint	ncodec;		/* Thello */
289*368c31abSDavid du Colombier 	char	*sid;		/* Rhello */
290*368c31abSDavid du Colombier 	uchar	rcrypto;	/* Rhello */
291*368c31abSDavid du Colombier 	uchar	rcodec;		/* Rhello */
292*368c31abSDavid du Colombier 	uchar	*auth;		/* TauthX, RauthX */
293*368c31abSDavid du Colombier 	uint	nauth;		/* TauthX, RauthX */
294*368c31abSDavid du Colombier 	uchar	score[VtScoreSize];	/* Tread, Rwrite */
295*368c31abSDavid du Colombier 	uchar	blocktype;	/* Tread, Twrite */
296*368c31abSDavid du Colombier 	ushort	count;		/* Tread */
297*368c31abSDavid du Colombier 	Packet	*data;		/* Rread, Twrite */
298*368c31abSDavid du Colombier };
299*368c31abSDavid du Colombier 
300*368c31abSDavid du Colombier Packet*	vtfcallpack(VtFcall*);
301*368c31abSDavid du Colombier int	vtfcallunpack(VtFcall*, Packet*);
302*368c31abSDavid du Colombier void	vtfcallclear(VtFcall*);
303*368c31abSDavid du Colombier int	vtfcallfmt(Fmt*);
304*368c31abSDavid du Colombier 
305*368c31abSDavid du Colombier enum
306*368c31abSDavid du Colombier {
307*368c31abSDavid du Colombier 	VtStateAlloc,
308*368c31abSDavid du Colombier 	VtStateConnected,
309*368c31abSDavid du Colombier 	VtStateClosed
310*368c31abSDavid du Colombier };
311*368c31abSDavid du Colombier 
312*368c31abSDavid du Colombier struct VtConn
313*368c31abSDavid du Colombier {
314*368c31abSDavid du Colombier 	QLock	lk;
315*368c31abSDavid du Colombier 	QLock	inlk;
316*368c31abSDavid du Colombier 	QLock	outlk;
317*368c31abSDavid du Colombier 	int	debug;
318*368c31abSDavid du Colombier 	int	infd;
319*368c31abSDavid du Colombier 	int	outfd;
320*368c31abSDavid du Colombier 	int	muxer;
321*368c31abSDavid du Colombier 	void	*writeq;
322*368c31abSDavid du Colombier 	void	*readq;
323*368c31abSDavid du Colombier 	int	state;
324*368c31abSDavid du Colombier 	void	*wait[256];
325*368c31abSDavid du Colombier 	uint	ntag;
326*368c31abSDavid du Colombier 	uint	nsleep;
327*368c31abSDavid du Colombier 	Packet	*part;
328*368c31abSDavid du Colombier 	Rendez	tagrend;
329*368c31abSDavid du Colombier 	Rendez	rpcfork;
330*368c31abSDavid du Colombier 	char	*version;
331*368c31abSDavid du Colombier 	char	*uid;
332*368c31abSDavid du Colombier 	char	*sid;
333*368c31abSDavid du Colombier 	char	addr[256];	/* address of other side */
334*368c31abSDavid du Colombier };
335*368c31abSDavid du Colombier 
336*368c31abSDavid du Colombier VtConn*	vtconn(int infd, int outfd);
337*368c31abSDavid du Colombier VtConn*	vtdial(char*);
338*368c31abSDavid du Colombier void	vtfreeconn(VtConn*);
339*368c31abSDavid du Colombier int	vtsend(VtConn*, Packet*);
340*368c31abSDavid du Colombier Packet*	vtrecv(VtConn*);
341*368c31abSDavid du Colombier int	vtversion(VtConn* z);
342*368c31abSDavid du Colombier void	vtdebug(VtConn* z, char*, ...);
343*368c31abSDavid du Colombier void	vthangup(VtConn* z);
344*368c31abSDavid du Colombier int	vtgoodbye(VtConn* z);
345*368c31abSDavid du Colombier 
346*368c31abSDavid du Colombier /* #pragma varargck argpos vtdebug 2 */
347*368c31abSDavid du Colombier 
348*368c31abSDavid du Colombier /* server */
349*368c31abSDavid du Colombier typedef struct VtSrv VtSrv;
350*368c31abSDavid du Colombier #pragma incomplete VtSrv
351*368c31abSDavid du Colombier typedef struct VtReq VtReq;
352*368c31abSDavid du Colombier struct VtReq
353*368c31abSDavid du Colombier {
354*368c31abSDavid du Colombier 	VtFcall	tx;
355*368c31abSDavid du Colombier 	VtFcall	rx;
356*368c31abSDavid du Colombier /* private */
357*368c31abSDavid du Colombier 	VtSrv	*srv;
358*368c31abSDavid du Colombier 	void	*sc;
359*368c31abSDavid du Colombier };
360*368c31abSDavid du Colombier 
361*368c31abSDavid du Colombier int	vtsrvhello(VtConn*);
362*368c31abSDavid du Colombier VtSrv*	vtlisten(char *addr);
363*368c31abSDavid du Colombier VtReq*	vtgetreq(VtSrv*);
364*368c31abSDavid du Colombier void	vtrespond(VtReq*);
365*368c31abSDavid du Colombier 
366*368c31abSDavid du Colombier /* client */
367*368c31abSDavid du Colombier Packet*	vtrpc(VtConn*, Packet*);
368*368c31abSDavid du Colombier Packet*	_vtrpc(VtConn*, Packet*, VtFcall*);
369*368c31abSDavid du Colombier void	vtrecvproc(void*);	/* VtConn */
370*368c31abSDavid du Colombier void	vtsendproc(void*);	/* VtConn */
371*368c31abSDavid du Colombier 
372*368c31abSDavid du Colombier int	vtconnect(VtConn*);
373*368c31abSDavid du Colombier int	vthello(VtConn*);
374*368c31abSDavid du Colombier int	vtread(VtConn*, uchar score[VtScoreSize], uint type, uchar *buf, int n);
375*368c31abSDavid du Colombier int	vtwrite(VtConn*, uchar score[VtScoreSize], uint type, uchar *buf, int n);
376*368c31abSDavid du Colombier Packet*	vtreadpacket(VtConn*, uchar score[VtScoreSize], uint type, int n);
377*368c31abSDavid du Colombier int	vtwritepacket(VtConn*, uchar score[VtScoreSize], uint type, Packet *p);
378*368c31abSDavid du Colombier int	vtsync(VtConn*);
379*368c31abSDavid du Colombier int	vtping(VtConn*);
380*368c31abSDavid du Colombier 
381*368c31abSDavid du Colombier /*
382*368c31abSDavid du Colombier  * Data blocks and block cache.
383*368c31abSDavid du Colombier  */
384*368c31abSDavid du Colombier enum
385*368c31abSDavid du Colombier {
386*368c31abSDavid du Colombier 	NilBlock = ~0
387*368c31abSDavid du Colombier };
388*368c31abSDavid du Colombier 
389*368c31abSDavid du Colombier typedef struct VtBlock VtBlock;
390*368c31abSDavid du Colombier typedef struct VtCache VtCache;
391*368c31abSDavid du Colombier #pragma incomplete VtCache
392*368c31abSDavid du Colombier 
393*368c31abSDavid du Colombier struct VtBlock
394*368c31abSDavid du Colombier {
395*368c31abSDavid du Colombier 	VtCache	*c;
396*368c31abSDavid du Colombier 	QLock	lk;
397*368c31abSDavid du Colombier 
398*368c31abSDavid du Colombier 	uchar	*data;
399*368c31abSDavid du Colombier 	uchar	score[VtScoreSize];
400*368c31abSDavid du Colombier 	uchar	type;			/* BtXXX */
401*368c31abSDavid du Colombier 
402*368c31abSDavid du Colombier 	/* internal to cache */
403*368c31abSDavid du Colombier 	int	nlock;
404*368c31abSDavid du Colombier 	int	iostate;
405*368c31abSDavid du Colombier 	int	ref;
406*368c31abSDavid du Colombier 	u32int	heap;
407*368c31abSDavid du Colombier 	VtBlock	*next;
408*368c31abSDavid du Colombier 	VtBlock	**prev;
409*368c31abSDavid du Colombier 	u32int	used;
410*368c31abSDavid du Colombier 	u32int	used2;
411*368c31abSDavid du Colombier 	u32int	addr;
412*368c31abSDavid du Colombier 	uintptr	pc;
413*368c31abSDavid du Colombier };
414*368c31abSDavid du Colombier 
415*368c31abSDavid du Colombier u32int	vtglobaltolocal(uchar[VtScoreSize]);
416*368c31abSDavid du Colombier void	vtlocaltoglobal(u32int, uchar[VtScoreSize]);
417*368c31abSDavid du Colombier 
418*368c31abSDavid du Colombier VtCache*vtcachealloc(VtConn*, int blocksize, ulong nblocks);
419*368c31abSDavid du Colombier void	vtcachefree(VtCache*);
420*368c31abSDavid du Colombier VtBlock*vtcachelocal(VtCache*, u32int addr, int type);
421*368c31abSDavid du Colombier VtBlock*vtcacheglobal(VtCache*, uchar[VtScoreSize], int type);
422*368c31abSDavid du Colombier VtBlock*vtcacheallocblock(VtCache*, int type);
423*368c31abSDavid du Colombier void	vtcachesetwrite(VtCache*,
424*368c31abSDavid du Colombier 	int(*)(VtConn*, uchar[VtScoreSize], uint, uchar*, int));
425*368c31abSDavid du Colombier void	vtblockput(VtBlock*);
426*368c31abSDavid du Colombier u32int	vtcacheblocksize(VtCache*);
427*368c31abSDavid du Colombier int	vtblockwrite(VtBlock*);
428*368c31abSDavid du Colombier VtBlock*vtblockcopy(VtBlock*);
429*368c31abSDavid du Colombier void	vtblockduplock(VtBlock*);
430*368c31abSDavid du Colombier 
431*368c31abSDavid du Colombier extern int vtcachencopy, vtcachenread, vtcachenwrite;
432*368c31abSDavid du Colombier extern int vttracelevel;
433*368c31abSDavid du Colombier 
434*368c31abSDavid du Colombier /*
435*368c31abSDavid du Colombier  * Hash tree file tree.
436*368c31abSDavid du Colombier  */
437*368c31abSDavid du Colombier typedef struct VtFile VtFile;
438*368c31abSDavid du Colombier struct VtFile
439*368c31abSDavid du Colombier {
440*368c31abSDavid du Colombier 	QLock	lk;
441*368c31abSDavid du Colombier 	int	ref;
442*368c31abSDavid du Colombier 	int	local;
443*368c31abSDavid du Colombier 	VtBlock	*b;			/* block containing this file */
444*368c31abSDavid du Colombier 	uchar	score[VtScoreSize];	/* score of block containing this file */
445*368c31abSDavid du Colombier 
446*368c31abSDavid du Colombier /* immutable */
447*368c31abSDavid du Colombier 	VtCache	*c;
448*368c31abSDavid du Colombier 	int	mode;
449*368c31abSDavid du Colombier 	u32int	gen;
450*368c31abSDavid du Colombier 	int	dsize;
451*368c31abSDavid du Colombier 	int	psize;
452*368c31abSDavid du Colombier 	int	dir;
453*368c31abSDavid du Colombier 	VtFile	*parent;
454*368c31abSDavid du Colombier 	int	epb;			/* entries per block in parent */
455*368c31abSDavid du Colombier 	u32int	offset; 		/* entry offset in parent */
456*368c31abSDavid du Colombier };
457*368c31abSDavid du Colombier 
458*368c31abSDavid du Colombier enum
459*368c31abSDavid du Colombier {
460*368c31abSDavid du Colombier 	VtOREAD,
461*368c31abSDavid du Colombier 	VtOWRITE,
462*368c31abSDavid du Colombier 	VtORDWR
463*368c31abSDavid du Colombier };
464*368c31abSDavid du Colombier 
465*368c31abSDavid du Colombier VtBlock*vtfileblock(VtFile*, u32int, int mode);
466*368c31abSDavid du Colombier int	vtfileblockscore(VtFile*, u32int, uchar[VtScoreSize]);
467*368c31abSDavid du Colombier void	vtfileclose(VtFile*);
468*368c31abSDavid du Colombier VtFile*	_vtfilecreate(VtFile*, int offset, int psize, int dsize, int dir);
469*368c31abSDavid du Colombier VtFile*	vtfilecreate(VtFile*, int psize, int dsize, int dir);
470*368c31abSDavid du Colombier VtFile*	vtfilecreateroot(VtCache*, int psize, int dsize, int type);
471*368c31abSDavid du Colombier int	vtfileflush(VtFile*);
472*368c31abSDavid du Colombier int	vtfileflushbefore(VtFile*, u64int);
473*368c31abSDavid du Colombier u32int	vtfilegetdirsize(VtFile*);
474*368c31abSDavid du Colombier int	vtfilegetentry(VtFile*, VtEntry*);
475*368c31abSDavid du Colombier uvlong	vtfilegetsize(VtFile*);
476*368c31abSDavid du Colombier void	vtfileincref(VtFile*);
477*368c31abSDavid du Colombier int	vtfilelock2(VtFile*, VtFile*, int);
478*368c31abSDavid du Colombier int	vtfilelock(VtFile*, int);
479*368c31abSDavid du Colombier VtFile*	vtfileopen(VtFile*, u32int, int);
480*368c31abSDavid du Colombier VtFile*	vtfileopenroot(VtCache*, VtEntry*);
481*368c31abSDavid du Colombier long	vtfileread(VtFile*, void*, long, vlong);
482*368c31abSDavid du Colombier int	vtfileremove(VtFile*);
483*368c31abSDavid du Colombier int	vtfilesetdirsize(VtFile*, u32int);
484*368c31abSDavid du Colombier int	vtfilesetentry(VtFile*, VtEntry*);
485*368c31abSDavid du Colombier int	vtfilesetsize(VtFile*, u64int);
486*368c31abSDavid du Colombier int	vtfiletruncate(VtFile*);
487*368c31abSDavid du Colombier void	vtfileunlock(VtFile*);
488*368c31abSDavid du Colombier long	vtfilewrite(VtFile*, void*, long, vlong);
489*368c31abSDavid du Colombier 
490*368c31abSDavid du Colombier int	vttimefmt(Fmt*);
491*368c31abSDavid du Colombier 
492*368c31abSDavid du Colombier extern int chattyventi;
493*368c31abSDavid du Colombier extern int ventidoublechecksha1;
494*368c31abSDavid du Colombier extern int ventilogging;
495*368c31abSDavid du Colombier 
496*368c31abSDavid du Colombier extern char *VtServerLog;
497