xref: /plan9-contrib/sys/include/venti.h (revision 79ac6435dace661833c851541fd3da1286100104)
19a747e4fSDavid du Colombier #pragma lib "libventi.a"
29a747e4fSDavid du Colombier #pragma src "/sys/src/libventi"
39a747e4fSDavid du Colombier 
4368c31abSDavid du Colombier 
5368c31abSDavid du Colombier /* XXX should be own library? */
6368c31abSDavid du Colombier /*
7368c31abSDavid du Colombier  * Packets
8368c31abSDavid du Colombier  */
9368c31abSDavid du Colombier enum
10368c31abSDavid du Colombier {
11368c31abSDavid du Colombier 	MaxFragSize = 9*1024
12368c31abSDavid du Colombier };
13368c31abSDavid du Colombier 
149a747e4fSDavid du Colombier typedef struct Packet Packet;
1512fd1c83SDavid du Colombier #pragma incomplete Packet
1612fd1c83SDavid du Colombier 
17368c31abSDavid du Colombier Packet*	packetalloc(void);
18368c31abSDavid du Colombier void	packetappend(Packet*, uchar *buf, int n);
19368c31abSDavid du Colombier uint	packetasize(Packet*);
20368c31abSDavid du Colombier int	packetcmp(Packet*, Packet*);
21368c31abSDavid du Colombier int	packetcompact(Packet*);
22368c31abSDavid du Colombier void	packetconcat(Packet*, Packet*);
23368c31abSDavid du Colombier int	packetconsume(Packet*, uchar *buf, int n);
24368c31abSDavid du Colombier int	packetcopy(Packet*, uchar *buf, int offset, int n);
25368c31abSDavid du Colombier Packet*	packetdup(Packet*, int offset, int n);
26368c31abSDavid du Colombier Packet*	packetforeign(uchar *buf, int n, void (*free)(void *a), void *a);
27368c31abSDavid du Colombier int	packetfragments(Packet*, IOchunk*, int nio, int offset);
28368c31abSDavid du Colombier void	packetfree(Packet*);
29368c31abSDavid du Colombier uchar*	packetheader(Packet*, int n);
30368c31abSDavid du Colombier uchar*	packetpeek(Packet*, uchar *buf, int offset, int n);
31368c31abSDavid du Colombier void	packetprefix(Packet*, uchar *buf, int n);
32368c31abSDavid du Colombier void	packetsha1(Packet*, uchar sha1[20]);
33368c31abSDavid du Colombier uint	packetsize(Packet*);
34368c31abSDavid du Colombier Packet*	packetsplit(Packet*, int n);
35368c31abSDavid du Colombier void	packetstats(void);
36368c31abSDavid du Colombier uchar*	packettrailer(Packet*, int n);
37368c31abSDavid du Colombier int	packettrim(Packet*, int offset, int n);
38368c31abSDavid du Colombier 
39368c31abSDavid du Colombier /* XXX should be own library? */
40368c31abSDavid du Colombier /*
41368c31abSDavid du Colombier  * Logging
42368c31abSDavid du Colombier  */
43368c31abSDavid du Colombier typedef struct VtLog VtLog;
44368c31abSDavid du Colombier typedef struct VtLogChunk VtLogChunk;
45368c31abSDavid du Colombier 
46368c31abSDavid du Colombier struct VtLog
47368c31abSDavid du Colombier {
48368c31abSDavid du Colombier 	VtLog	*next;		/* in hash table */
49368c31abSDavid du Colombier 	char	*name;
50368c31abSDavid du Colombier 	VtLogChunk *chunk;
51368c31abSDavid du Colombier 	uint	nchunk;
52368c31abSDavid du Colombier 	VtLogChunk *w;
53368c31abSDavid du Colombier 	QLock	lk;
54368c31abSDavid du Colombier 	int	ref;
55368c31abSDavid du Colombier };
56368c31abSDavid du Colombier 
57368c31abSDavid du Colombier struct VtLogChunk
58368c31abSDavid du Colombier {
59368c31abSDavid du Colombier 	char	*p;
60368c31abSDavid du Colombier 	char	*ep;
61368c31abSDavid du Colombier 	char	*wp;
62368c31abSDavid du Colombier };
63368c31abSDavid du Colombier 
64368c31abSDavid du Colombier VtLog*	vtlogopen(char *name, uint size);
65368c31abSDavid du Colombier void	vtlogprint(VtLog *log, char *fmt, ...);
66368c31abSDavid du Colombier void	vtlog(char *name, char *fmt, ...);
67368c31abSDavid du Colombier void	vtlogclose(VtLog*);
68368c31abSDavid du Colombier void	vtlogremove(char *name);
69368c31abSDavid du Colombier char**	vtlognames(int*);
70368c31abSDavid du Colombier void	vtlogdump(int fd, VtLog*);
71368c31abSDavid du Colombier 
72368c31abSDavid du Colombier /* XXX begin actual venti.h */
73368c31abSDavid du Colombier 
74368c31abSDavid du Colombier typedef struct VtFcall VtFcall;
75368c31abSDavid du Colombier typedef struct VtConn VtConn;
76368c31abSDavid du Colombier typedef struct VtEntry VtEntry;
77368c31abSDavid du Colombier typedef struct VtRoot VtRoot;
78368c31abSDavid du Colombier 
79368c31abSDavid du Colombier /*
80368c31abSDavid du Colombier  * Fundamental constants.
81368c31abSDavid du Colombier  */
82368c31abSDavid du Colombier enum
83368c31abSDavid du Colombier {
84368c31abSDavid du Colombier 	VtScoreSize	= 20,
85368c31abSDavid du Colombier 	VtMaxStringSize = 1024,
869a747e4fSDavid du Colombier 	VtMaxLumpSize	= 56*1024,
87368c31abSDavid du Colombier 	VtPointerDepth	= 7
88368c31abSDavid du Colombier };
89368c31abSDavid du Colombier #define VtMaxFileSize ((1ULL<<48)-1)
90368c31abSDavid du Colombier 
91368c31abSDavid du Colombier 
92368c31abSDavid du Colombier /*
93368c31abSDavid du Colombier  * Strings in packets.
94368c31abSDavid du Colombier  */
95368c31abSDavid du Colombier int vtputstring(Packet*, char*);
96368c31abSDavid du Colombier int vtgetstring(Packet*, char**);
97368c31abSDavid du Colombier 
98368c31abSDavid du Colombier /*
99368c31abSDavid du Colombier  * Block types.
100368c31abSDavid du Colombier  *
101368c31abSDavid du Colombier  * The initial Venti protocol had a much
102368c31abSDavid du Colombier  * less regular list of block types.
103368c31abSDavid du Colombier  * VtToDiskType converts from new to old.
104368c31abSDavid du Colombier  */
105368c31abSDavid du Colombier enum
106368c31abSDavid du Colombier {
107368c31abSDavid du Colombier 	VtDataType	= 0<<3,
108368c31abSDavid du Colombier 	/* VtDataType+1, ... */
109368c31abSDavid du Colombier 	VtDirType	= 1<<3,
110368c31abSDavid du Colombier 	/* VtDirType+1, ... */
111368c31abSDavid du Colombier 	VtRootType	= 2<<3,
112368c31abSDavid du Colombier 	VtMaxType,
113368c31abSDavid du Colombier 	VtCorruptType = 0xFF,
114368c31abSDavid du Colombier 
115368c31abSDavid du Colombier 	VtTypeDepthMask = 7,
116368c31abSDavid du Colombier 	VtTypeBaseMask = ~VtTypeDepthMask
1179a747e4fSDavid du Colombier };
1189a747e4fSDavid du Colombier 
119368c31abSDavid du Colombier /* convert to/from on-disk type numbers */
120368c31abSDavid du Colombier uint vttodisktype(uint);
121368c31abSDavid du Colombier uint vtfromdisktype(uint);
122368c31abSDavid du Colombier 
123368c31abSDavid du Colombier /*
124368c31abSDavid du Colombier  * VtEntry describes a Venti stream
125368c31abSDavid du Colombier  *
126368c31abSDavid du Colombier  * The _ enums are only used on the wire.
127368c31abSDavid du Colombier  * They are not present in the VtEntry structure
128368c31abSDavid du Colombier  * and should not be used by client programs.
129368c31abSDavid du Colombier  * (The info is in the type field.)
130368c31abSDavid du Colombier  */
131368c31abSDavid du Colombier enum
132368c31abSDavid du Colombier {
133368c31abSDavid du Colombier 	VtEntryActive = 1<<0,		/* entry is in use */
134368c31abSDavid du Colombier 	_VtEntryDir = 1<<1,		/* a directory */
135368c31abSDavid du Colombier 	_VtEntryDepthShift = 2,		/* shift for pointer depth */
136368c31abSDavid du Colombier 	_VtEntryDepthMask = 7<<2,	/* mask for pointer depth */
137c7d707feSDavid du Colombier 	VtEntryLocal = 1<<5,		/* for local storage only */
138c7d707feSDavid du Colombier 	VtEntryNoArchive = 1<<6		/* for local storage only */
1399a747e4fSDavid du Colombier };
140368c31abSDavid du Colombier enum
141368c31abSDavid du Colombier {
142368c31abSDavid du Colombier 	VtEntrySize = 40
1439a747e4fSDavid du Colombier };
144368c31abSDavid du Colombier struct VtEntry
145368c31abSDavid du Colombier {
146d9306527SDavid du Colombier 	ulong	gen;			/* generation number */
147d9306527SDavid du Colombier 	ushort	psize;			/* pointer block size */
148d9306527SDavid du Colombier 	ushort	dsize;			/* data block size */
149368c31abSDavid du Colombier 	uchar	type;
150d9306527SDavid du Colombier 	uchar	flags;
151d9306527SDavid du Colombier 	uvlong	size;
1529a747e4fSDavid du Colombier 	uchar	score[VtScoreSize];
1539a747e4fSDavid du Colombier };
1549a747e4fSDavid du Colombier 
155368c31abSDavid du Colombier void vtentrypack(VtEntry*, uchar*, int index);
156368c31abSDavid du Colombier int vtentryunpack(VtEntry*, uchar*, int index);
157368c31abSDavid du Colombier 
158368c31abSDavid du Colombier struct VtRoot
159368c31abSDavid du Colombier {
160368c31abSDavid du Colombier 	char	name[128];
161368c31abSDavid du Colombier 	char	type[128];
162368c31abSDavid du Colombier 	uchar	score[VtScoreSize];	/* to a Dir block */
163368c31abSDavid du Colombier 	ushort	blocksize;		/* maximum block size */
164368c31abSDavid du Colombier 	uchar	prev[VtScoreSize];	/* last root block */
1659a747e4fSDavid du Colombier };
1669a747e4fSDavid du Colombier 
167368c31abSDavid du Colombier enum
168368c31abSDavid du Colombier {
169368c31abSDavid du Colombier 	VtRootSize = 300,
170368c31abSDavid du Colombier 	VtRootVersion = 2
1719a747e4fSDavid du Colombier };
1729a747e4fSDavid du Colombier 
173368c31abSDavid du Colombier void vtrootpack(VtRoot*, uchar*);
174368c31abSDavid du Colombier int vtrootunpack(VtRoot*, uchar*);
1759a747e4fSDavid du Colombier 
176368c31abSDavid du Colombier /*
177368c31abSDavid du Colombier  * score of zero length block
178368c31abSDavid du Colombier  */
179368c31abSDavid du Colombier extern uchar vtzeroscore[VtScoreSize];
1809a747e4fSDavid du Colombier 
181368c31abSDavid du Colombier /*
182368c31abSDavid du Colombier  * zero extend and truncate blocks
183368c31abSDavid du Colombier  */
184368c31abSDavid du Colombier void vtzeroextend(int type, uchar *buf, uint n, uint nn);
185368c31abSDavid du Colombier uint vtzerotruncate(int type, uchar *buf, uint n);
1869a747e4fSDavid du Colombier 
187368c31abSDavid du Colombier /*
188368c31abSDavid du Colombier  * parse score: mungs s
189368c31abSDavid du Colombier  */
190368c31abSDavid du Colombier int vtparsescore(char *s, char **prefix, uchar[VtScoreSize]);
1919a747e4fSDavid du Colombier 
1929a747e4fSDavid du Colombier /*
1939a747e4fSDavid du Colombier  * formatting
1949a747e4fSDavid du Colombier  * other than noted, these formats all ignore
1959a747e4fSDavid du Colombier  * the width and precision arguments, and all flags
1969a747e4fSDavid du Colombier  *
1979a747e4fSDavid du Colombier  * V	a venti score
1989a747e4fSDavid du Colombier  */
1999a747e4fSDavid du Colombier #pragma	varargck	type	"V"	uchar*
200368c31abSDavid du Colombier #pragma	varargck	type	"F"	VtFcall*
201368c31abSDavid du Colombier #pragma	varargck	type	"T"	void
202368c31abSDavid du Colombier #pragma	varargck	type	"lT"	void
203d9306527SDavid du Colombier 
204368c31abSDavid du Colombier int vtscorefmt(Fmt*);
2056b6b9ac8SDavid du Colombier 
206368c31abSDavid du Colombier /*
207368c31abSDavid du Colombier  * error-checking malloc et al.
208368c31abSDavid du Colombier  */
209368c31abSDavid du Colombier void	vtfree(void *);
210368c31abSDavid du Colombier void*	vtmalloc(int);
211368c31abSDavid du Colombier void*	vtmallocz(int);
212368c31abSDavid du Colombier void*	vtrealloc(void *p, int);
213368c31abSDavid du Colombier void*	vtbrk(int n);
214368c31abSDavid du Colombier char*	vtstrdup(char *);
215368c31abSDavid du Colombier 
216368c31abSDavid du Colombier /*
217368c31abSDavid du Colombier  * Venti protocol
218368c31abSDavid du Colombier  */
219368c31abSDavid du Colombier 
220368c31abSDavid du Colombier /*
221368c31abSDavid du Colombier  * Crypto strengths
222368c31abSDavid du Colombier  */
223368c31abSDavid du Colombier enum
224368c31abSDavid du Colombier {
225368c31abSDavid du Colombier 	VtCryptoStrengthNone,
226368c31abSDavid du Colombier 	VtCryptoStrengthAuth,
227368c31abSDavid du Colombier 	VtCryptoStrengthWeak,
228368c31abSDavid du Colombier 	VtCryptoStrengthStrong
229368c31abSDavid du Colombier };
230368c31abSDavid du Colombier 
231368c31abSDavid du Colombier /*
232368c31abSDavid du Colombier  * Crypto suites
233368c31abSDavid du Colombier  */
234368c31abSDavid du Colombier enum
235368c31abSDavid du Colombier {
236368c31abSDavid du Colombier 	VtCryptoNone,
237368c31abSDavid du Colombier 	VtCryptoSSL3,
238368c31abSDavid du Colombier 	VtCryptoTLS1,
239368c31abSDavid du Colombier 	VtCryptoMax
240368c31abSDavid du Colombier };
241368c31abSDavid du Colombier 
242368c31abSDavid du Colombier /*
243368c31abSDavid du Colombier  * Codecs
244368c31abSDavid du Colombier  */
245368c31abSDavid du Colombier enum
246368c31abSDavid du Colombier {
247368c31abSDavid du Colombier 	VtCodecNone,
248368c31abSDavid du Colombier 	VtCodecDeflate,
249368c31abSDavid du Colombier 	VtCodecThwack,
250368c31abSDavid du Colombier 	VtCodecMax
251368c31abSDavid du Colombier };
252368c31abSDavid du Colombier 
253368c31abSDavid du Colombier enum
254368c31abSDavid du Colombier {
255368c31abSDavid du Colombier 	VtRerror	= 1,
256368c31abSDavid du Colombier 	VtTping		= 2,
257368c31abSDavid du Colombier 	VtRping,
258368c31abSDavid du Colombier 	VtThello	= 4,
259368c31abSDavid du Colombier 	VtRhello,
260368c31abSDavid du Colombier 	VtTgoodbye	= 6,
261368c31abSDavid du Colombier 	VtRgoodbye,	/* not used */
262368c31abSDavid du Colombier 	VtTauth0	= 8,
263368c31abSDavid du Colombier 	VtRauth0,
264368c31abSDavid du Colombier 	VtTauth1	= 10,
265368c31abSDavid du Colombier 	VtRauth1,
266368c31abSDavid du Colombier 	VtTread		= 12,
267368c31abSDavid du Colombier 	VtRread,
268368c31abSDavid du Colombier 	VtTwrite	= 14,
269368c31abSDavid du Colombier 	VtRwrite,
270368c31abSDavid du Colombier 	VtTsync		= 16,
271368c31abSDavid du Colombier 	VtRsync,
272368c31abSDavid du Colombier 
273368c31abSDavid du Colombier 	VtTmax
274368c31abSDavid du Colombier };
275368c31abSDavid du Colombier 
276368c31abSDavid du Colombier struct VtFcall
277368c31abSDavid du Colombier {
278368c31abSDavid du Colombier 	uchar	msgtype;
279368c31abSDavid du Colombier 	uchar	tag;
280368c31abSDavid du Colombier 
281368c31abSDavid du Colombier 	char	*error;		/* Rerror */
282368c31abSDavid du Colombier 
283368c31abSDavid du Colombier 	char	*version;	/* Thello */
284368c31abSDavid du Colombier 	char	*uid;		/* Thello */
285368c31abSDavid du Colombier 	uchar	strength;	/* Thello */
286368c31abSDavid du Colombier 	uchar	*crypto;	/* Thello */
287368c31abSDavid du Colombier 	uint	ncrypto;	/* Thello */
288368c31abSDavid du Colombier 	uchar	*codec;		/* Thello */
289368c31abSDavid du Colombier 	uint	ncodec;		/* Thello */
290368c31abSDavid du Colombier 	char	*sid;		/* Rhello */
291368c31abSDavid du Colombier 	uchar	rcrypto;	/* Rhello */
292368c31abSDavid du Colombier 	uchar	rcodec;		/* Rhello */
293368c31abSDavid du Colombier 	uchar	*auth;		/* TauthX, RauthX */
294368c31abSDavid du Colombier 	uint	nauth;		/* TauthX, RauthX */
295368c31abSDavid du Colombier 	uchar	score[VtScoreSize];	/* Tread, Rwrite */
296368c31abSDavid du Colombier 	uchar	blocktype;	/* Tread, Twrite */
297368c31abSDavid du Colombier 	ushort	count;		/* Tread */
298368c31abSDavid du Colombier 	Packet	*data;		/* Rread, Twrite */
299368c31abSDavid du Colombier };
300368c31abSDavid du Colombier 
301368c31abSDavid du Colombier Packet*	vtfcallpack(VtFcall*);
302368c31abSDavid du Colombier int	vtfcallunpack(VtFcall*, Packet*);
303368c31abSDavid du Colombier void	vtfcallclear(VtFcall*);
304368c31abSDavid du Colombier int	vtfcallfmt(Fmt*);
305368c31abSDavid du Colombier 
306368c31abSDavid du Colombier enum
307368c31abSDavid du Colombier {
308368c31abSDavid du Colombier 	VtStateAlloc,
309368c31abSDavid du Colombier 	VtStateConnected,
310368c31abSDavid du Colombier 	VtStateClosed
311368c31abSDavid du Colombier };
312368c31abSDavid du Colombier 
313368c31abSDavid du Colombier struct VtConn
314368c31abSDavid du Colombier {
315368c31abSDavid du Colombier 	QLock	lk;
316368c31abSDavid du Colombier 	QLock	inlk;
317368c31abSDavid du Colombier 	QLock	outlk;
318368c31abSDavid du Colombier 	int	debug;
319368c31abSDavid du Colombier 	int	infd;
320368c31abSDavid du Colombier 	int	outfd;
321368c31abSDavid du Colombier 	int	muxer;
322368c31abSDavid du Colombier 	void	*writeq;
323368c31abSDavid du Colombier 	void	*readq;
324368c31abSDavid du Colombier 	int	state;
325368c31abSDavid du Colombier 	void	*wait[256];
326368c31abSDavid du Colombier 	uint	ntag;
327368c31abSDavid du Colombier 	uint	nsleep;
328368c31abSDavid du Colombier 	Packet	*part;
329368c31abSDavid du Colombier 	Rendez	tagrend;
330368c31abSDavid du Colombier 	Rendez	rpcfork;
331368c31abSDavid du Colombier 	char	*version;
332368c31abSDavid du Colombier 	char	*uid;
333368c31abSDavid du Colombier 	char	*sid;
334368c31abSDavid du Colombier 	char	addr[256];	/* address of other side */
335368c31abSDavid du Colombier };
336368c31abSDavid du Colombier 
337368c31abSDavid du Colombier VtConn*	vtconn(int infd, int outfd);
3386021a96bSDavid du Colombier int	vtreconn(VtConn*, int, int);
339368c31abSDavid du Colombier VtConn*	vtdial(char*);
3406021a96bSDavid du Colombier int	vtredial(VtConn*, char*);
341368c31abSDavid du Colombier void	vtfreeconn(VtConn*);
342368c31abSDavid du Colombier int	vtsend(VtConn*, Packet*);
343368c31abSDavid du Colombier Packet*	vtrecv(VtConn*);
344368c31abSDavid du Colombier int	vtversion(VtConn* z);
345368c31abSDavid du Colombier void	vtdebug(VtConn* z, char*, ...);
346368c31abSDavid du Colombier void	vthangup(VtConn* z);
347368c31abSDavid du Colombier int	vtgoodbye(VtConn* z);
348368c31abSDavid du Colombier 
349368c31abSDavid du Colombier /* #pragma varargck argpos vtdebug 2 */
350368c31abSDavid du Colombier 
351368c31abSDavid du Colombier /* server */
352368c31abSDavid du Colombier typedef struct VtSrv VtSrv;
353368c31abSDavid du Colombier #pragma incomplete VtSrv
354368c31abSDavid du Colombier typedef struct VtReq VtReq;
355368c31abSDavid du Colombier struct VtReq
356368c31abSDavid du Colombier {
357368c31abSDavid du Colombier 	VtFcall	tx;
358368c31abSDavid du Colombier 	VtFcall	rx;
359368c31abSDavid du Colombier /* private */
360368c31abSDavid du Colombier 	VtSrv	*srv;
361368c31abSDavid du Colombier 	void	*sc;
362368c31abSDavid du Colombier };
363368c31abSDavid du Colombier 
364368c31abSDavid du Colombier int	vtsrvhello(VtConn*);
365368c31abSDavid du Colombier VtSrv*	vtlisten(char *addr);
366368c31abSDavid du Colombier VtReq*	vtgetreq(VtSrv*);
367368c31abSDavid du Colombier void	vtrespond(VtReq*);
368368c31abSDavid du Colombier 
369368c31abSDavid du Colombier /* client */
370368c31abSDavid du Colombier Packet*	vtrpc(VtConn*, Packet*);
371368c31abSDavid du Colombier Packet*	_vtrpc(VtConn*, Packet*, VtFcall*);
372368c31abSDavid du Colombier void	vtrecvproc(void*);	/* VtConn */
373368c31abSDavid du Colombier void	vtsendproc(void*);	/* VtConn */
374368c31abSDavid du Colombier 
375368c31abSDavid du Colombier int	vtconnect(VtConn*);
376368c31abSDavid du Colombier int	vthello(VtConn*);
377368c31abSDavid du Colombier int	vtread(VtConn*, uchar score[VtScoreSize], uint type, uchar *buf, int n);
378368c31abSDavid du Colombier int	vtwrite(VtConn*, uchar score[VtScoreSize], uint type, uchar *buf, int n);
379368c31abSDavid du Colombier Packet*	vtreadpacket(VtConn*, uchar score[VtScoreSize], uint type, int n);
380368c31abSDavid du Colombier int	vtwritepacket(VtConn*, uchar score[VtScoreSize], uint type, Packet *p);
381368c31abSDavid du Colombier int	vtsync(VtConn*);
382368c31abSDavid du Colombier int	vtping(VtConn*);
383368c31abSDavid du Colombier 
384*79ac6435SDavid du Colombier /* sha1 */
385*79ac6435SDavid du Colombier void	vtsha1(uchar score[VtScoreSize], uchar*, int);
386*79ac6435SDavid du Colombier int	vtsha1check(uchar score[VtScoreSize], uchar*, int);
387*79ac6435SDavid du Colombier 
388368c31abSDavid du Colombier /*
389368c31abSDavid du Colombier  * Data blocks and block cache.
390368c31abSDavid du Colombier  */
391368c31abSDavid du Colombier enum
392368c31abSDavid du Colombier {
393368c31abSDavid du Colombier 	NilBlock = ~0
394368c31abSDavid du Colombier };
395368c31abSDavid du Colombier 
396368c31abSDavid du Colombier typedef struct VtBlock VtBlock;
397368c31abSDavid du Colombier typedef struct VtCache VtCache;
398368c31abSDavid du Colombier #pragma incomplete VtCache
399368c31abSDavid du Colombier 
400368c31abSDavid du Colombier struct VtBlock
401368c31abSDavid du Colombier {
402368c31abSDavid du Colombier 	VtCache	*c;
403368c31abSDavid du Colombier 	QLock	lk;
404368c31abSDavid du Colombier 
405368c31abSDavid du Colombier 	uchar	*data;
406368c31abSDavid du Colombier 	uchar	score[VtScoreSize];
407368c31abSDavid du Colombier 	uchar	type;			/* BtXXX */
408368c31abSDavid du Colombier 
409368c31abSDavid du Colombier 	/* internal to cache */
410368c31abSDavid du Colombier 	int	nlock;
411368c31abSDavid du Colombier 	int	iostate;
412368c31abSDavid du Colombier 	int	ref;
413368c31abSDavid du Colombier 	u32int	heap;
414368c31abSDavid du Colombier 	VtBlock	*next;
415368c31abSDavid du Colombier 	VtBlock	**prev;
416368c31abSDavid du Colombier 	u32int	used;
417368c31abSDavid du Colombier 	u32int	used2;
418368c31abSDavid du Colombier 	u32int	addr;
419368c31abSDavid du Colombier 	uintptr	pc;
420368c31abSDavid du Colombier };
421368c31abSDavid du Colombier 
422368c31abSDavid du Colombier u32int	vtglobaltolocal(uchar[VtScoreSize]);
423368c31abSDavid du Colombier void	vtlocaltoglobal(u32int, uchar[VtScoreSize]);
424368c31abSDavid du Colombier 
425368c31abSDavid du Colombier VtCache*vtcachealloc(VtConn*, int blocksize, ulong nblocks);
426368c31abSDavid du Colombier void	vtcachefree(VtCache*);
427368c31abSDavid du Colombier VtBlock*vtcachelocal(VtCache*, u32int addr, int type);
428368c31abSDavid du Colombier VtBlock*vtcacheglobal(VtCache*, uchar[VtScoreSize], int type);
429368c31abSDavid du Colombier VtBlock*vtcacheallocblock(VtCache*, int type);
430368c31abSDavid du Colombier void	vtcachesetwrite(VtCache*,
431368c31abSDavid du Colombier 	int(*)(VtConn*, uchar[VtScoreSize], uint, uchar*, int));
432368c31abSDavid du Colombier void	vtblockput(VtBlock*);
433368c31abSDavid du Colombier u32int	vtcacheblocksize(VtCache*);
434368c31abSDavid du Colombier int	vtblockwrite(VtBlock*);
435368c31abSDavid du Colombier VtBlock*vtblockcopy(VtBlock*);
436368c31abSDavid du Colombier void	vtblockduplock(VtBlock*);
437368c31abSDavid du Colombier 
438368c31abSDavid du Colombier extern int vtcachencopy, vtcachenread, vtcachenwrite;
439368c31abSDavid du Colombier extern int vttracelevel;
440368c31abSDavid du Colombier 
441368c31abSDavid du Colombier /*
442368c31abSDavid du Colombier  * Hash tree file tree.
443368c31abSDavid du Colombier  */
444368c31abSDavid du Colombier typedef struct VtFile VtFile;
445368c31abSDavid du Colombier struct VtFile
446368c31abSDavid du Colombier {
447368c31abSDavid du Colombier 	QLock	lk;
448368c31abSDavid du Colombier 	int	ref;
449368c31abSDavid du Colombier 	int	local;
450368c31abSDavid du Colombier 	VtBlock	*b;			/* block containing this file */
451368c31abSDavid du Colombier 	uchar	score[VtScoreSize];	/* score of block containing this file */
452368c31abSDavid du Colombier 
453368c31abSDavid du Colombier /* immutable */
454368c31abSDavid du Colombier 	VtCache	*c;
455368c31abSDavid du Colombier 	int	mode;
456368c31abSDavid du Colombier 	u32int	gen;
457368c31abSDavid du Colombier 	int	dsize;
458368c31abSDavid du Colombier 	int	psize;
459368c31abSDavid du Colombier 	int	dir;
460368c31abSDavid du Colombier 	VtFile	*parent;
461368c31abSDavid du Colombier 	int	epb;			/* entries per block in parent */
462368c31abSDavid du Colombier 	u32int	offset; 		/* entry offset in parent */
463368c31abSDavid du Colombier };
464368c31abSDavid du Colombier 
465368c31abSDavid du Colombier enum
466368c31abSDavid du Colombier {
467368c31abSDavid du Colombier 	VtOREAD,
468368c31abSDavid du Colombier 	VtOWRITE,
469368c31abSDavid du Colombier 	VtORDWR
470368c31abSDavid du Colombier };
471368c31abSDavid du Colombier 
472368c31abSDavid du Colombier VtBlock*vtfileblock(VtFile*, u32int, int mode);
473368c31abSDavid du Colombier int	vtfileblockscore(VtFile*, u32int, uchar[VtScoreSize]);
474368c31abSDavid du Colombier void	vtfileclose(VtFile*);
475368c31abSDavid du Colombier VtFile*	_vtfilecreate(VtFile*, int offset, int psize, int dsize, int dir);
476368c31abSDavid du Colombier VtFile*	vtfilecreate(VtFile*, int psize, int dsize, int dir);
477368c31abSDavid du Colombier VtFile*	vtfilecreateroot(VtCache*, int psize, int dsize, int type);
478368c31abSDavid du Colombier int	vtfileflush(VtFile*);
479368c31abSDavid du Colombier int	vtfileflushbefore(VtFile*, u64int);
480368c31abSDavid du Colombier u32int	vtfilegetdirsize(VtFile*);
481368c31abSDavid du Colombier int	vtfilegetentry(VtFile*, VtEntry*);
482368c31abSDavid du Colombier uvlong	vtfilegetsize(VtFile*);
483368c31abSDavid du Colombier void	vtfileincref(VtFile*);
484368c31abSDavid du Colombier int	vtfilelock2(VtFile*, VtFile*, int);
485368c31abSDavid du Colombier int	vtfilelock(VtFile*, int);
486368c31abSDavid du Colombier VtFile*	vtfileopen(VtFile*, u32int, int);
487368c31abSDavid du Colombier VtFile*	vtfileopenroot(VtCache*, VtEntry*);
488368c31abSDavid du Colombier long	vtfileread(VtFile*, void*, long, vlong);
489368c31abSDavid du Colombier int	vtfileremove(VtFile*);
490368c31abSDavid du Colombier int	vtfilesetdirsize(VtFile*, u32int);
491368c31abSDavid du Colombier int	vtfilesetentry(VtFile*, VtEntry*);
492368c31abSDavid du Colombier int	vtfilesetsize(VtFile*, u64int);
493368c31abSDavid du Colombier int	vtfiletruncate(VtFile*);
494368c31abSDavid du Colombier void	vtfileunlock(VtFile*);
495368c31abSDavid du Colombier long	vtfilewrite(VtFile*, void*, long, vlong);
496368c31abSDavid du Colombier 
497368c31abSDavid du Colombier int	vttimefmt(Fmt*);
498368c31abSDavid du Colombier 
499368c31abSDavid du Colombier extern int chattyventi;
500368c31abSDavid du Colombier extern int ventidoublechecksha1;
501368c31abSDavid du Colombier extern int ventilogging;
502368c31abSDavid du Colombier 
503368c31abSDavid du Colombier extern char *VtServerLog;
504