blob: 1e6c8096365f31211a4ac8a7c240ea98704e2409 [file] [log] [blame]
rscf7012582003-11-25 01:40:27 +00001#ifndef _VENTI_H_
2#define _VENTI_H_ 1
rsc819822c2004-06-16 16:45:22 +00003#ifdef __cplusplus
rscf7012582003-11-25 01:40:27 +00004extern "C" {
5#endif
rsc1a0954a2005-01-04 21:18:08 +00006
rsc6c0209f2005-02-11 20:32:41 +00007#ifndef PLAN9PORT
8#pragma lib "libventi.a"
9#pragma src "/sys/src/libventi"
10#endif
11
rsc1a0954a2005-01-04 21:18:08 +000012AUTOLIB(venti)
13
rsc97a5e5f2003-11-23 18:25:35 +000014/* XXX should be own library? */
15/*
16 * Packets
17 */
18enum
19{
20 MaxFragSize = 9*1024,
21};
22
23typedef struct Packet Packet;
24Packet *packetalloc(void);
25void packetfree(Packet*);
26Packet *packetforeign(uchar *buf, int n, void (*free)(void *a), void *a);
27Packet *packetdup(Packet*, int offset, int n);
28Packet *packetsplit(Packet*, int n);
29int packetconsume(Packet*, uchar *buf, int n);
30int packettrim(Packet*, int offset, int n);
31uchar *packetheader(Packet*, int n);
32uchar *packettrailer(Packet*, int n);
rscd23a6172004-03-15 01:57:29 +000033void packetprefix(Packet*, uchar *buf, int n);
34void packetappend(Packet*, uchar *buf, int n);
35void packetconcat(Packet*, Packet*);
rsc97a5e5f2003-11-23 18:25:35 +000036uchar *packetpeek(Packet*, uchar *buf, int offset, int n);
37int packetcopy(Packet*, uchar *buf, int offset, int n);
38int packetfragments(Packet*, IOchunk*, int nio, int offset);
39uint packetsize(Packet*);
40uint packetasize(Packet*);
41int packetcompact(Packet*);
42int packetcmp(Packet*, Packet*);
43void packetstats(void);
44void packetsha1(Packet*, uchar sha1[20]);
45
rsc6c0209f2005-02-11 20:32:41 +000046/* XXX should be own library? */
47/*
48 * Logging
49 */
50typedef struct VtLog VtLog;
51typedef struct VtLogChunk VtLogChunk;
rsc97a5e5f2003-11-23 18:25:35 +000052
rsc6c0209f2005-02-11 20:32:41 +000053struct VtLog
54{
55 VtLog *next; /* in hash table */
rsc587f8f42005-02-13 18:32:06 +000056 char *name;
rsc6c0209f2005-02-11 20:32:41 +000057 VtLogChunk *chunk;
58 uint nchunk;
59 VtLogChunk *w;
60 QLock lk;
61 int ref;
62};
63
rsc587f8f42005-02-13 18:32:06 +000064struct VtLogChunk
rsc6c0209f2005-02-11 20:32:41 +000065{
rsc587f8f42005-02-13 18:32:06 +000066 char *p;
67 char *ep;
68 char *wp;
rsc6c0209f2005-02-11 20:32:41 +000069};
70
71VtLog *vtlogopen(char *name, uint size);
72void vtlogprint(VtLog *log, char *fmt, ...);
73void vtlog(char *name, char *fmt, ...);
rsc587f8f42005-02-13 18:32:06 +000074void vtlogclose(VtLog*);
rsc6c0209f2005-02-11 20:32:41 +000075void vtlogremove(char *name);
rsc1c485da2005-05-12 14:03:16 +000076char **vtlognames(int*);
rsc587f8f42005-02-13 18:32:06 +000077void vtlogdump(int fd, VtLog*);
rsc6c0209f2005-02-11 20:32:41 +000078
79/* XXX begin actual venti.h */
rsc97a5e5f2003-11-23 18:25:35 +000080
81typedef struct VtFcall VtFcall;
rsc97a5e5f2003-11-23 18:25:35 +000082typedef struct VtConn VtConn;
83typedef struct VtEntry VtEntry;
84typedef struct VtRoot VtRoot;
85
86/*
87 * Fundamental constants.
88 */
89enum
90{
91 VtScoreSize = 20,
92 VtMaxStringSize = 1024,
rsc97a5e5f2003-11-23 18:25:35 +000093 VtMaxLumpSize = 56*1024,
94 VtPointerDepth = 7,
95};
rsc2db9e482003-11-24 20:16:30 +000096#define VtMaxFileSize ((1ULL<<48)-1)
97
rsc97a5e5f2003-11-23 18:25:35 +000098
99/*
100 * Strings in packets.
101 */
102int vtputstring(Packet*, char*);
103int vtgetstring(Packet*, char**);
104
105/*
106 * Block types.
107 *
108 * The initial Venti protocol had a much
109 * less regular list of block types.
110 * VtToDiskType converts from new to old.
111 */
112enum
113{
114 VtDataType = 0<<3,
115 /* VtDataType+1, ... */
116 VtDirType = 1<<3,
117 /* VtDirType+1, ... */
118 VtRootType = 2<<3,
rsc97a5e5f2003-11-23 18:25:35 +0000119 VtMaxType,
rscd3232ca2004-06-14 21:43:32 +0000120 VtCorruptType = 0xFF,
rsc97a5e5f2003-11-23 18:25:35 +0000121
122 VtTypeDepthMask = 7,
rscd23a6172004-03-15 01:57:29 +0000123 VtTypeBaseMask = ~VtTypeDepthMask,
rsc97a5e5f2003-11-23 18:25:35 +0000124};
125
126/* convert to/from on-disk type numbers */
127uint vttodisktype(uint);
128uint vtfromdisktype(uint);
129
130/*
131 * VtEntry describes a Venti stream
rsceacbfb22004-03-15 01:58:31 +0000132 *
133 * The _ enums are only used on the wire.
134 * They are not present in the VtEntry structure
135 * and should not be used by client programs.
136 * (The info is in the type field.)
rsc97a5e5f2003-11-23 18:25:35 +0000137 */
138enum
139{
140 VtEntryActive = 1<<0, /* entry is in use */
rscd23a6172004-03-15 01:57:29 +0000141 _VtEntryDir = 1<<1, /* a directory */
142 _VtEntryDepthShift = 2, /* shift for pointer depth */
143 _VtEntryDepthMask = 7<<2, /* mask for pointer depth */
rsc97a5e5f2003-11-23 18:25:35 +0000144 VtEntryLocal = 1<<5, /* for local storage only */
145};
146enum
147{
148 VtEntrySize = 40,
149};
150struct VtEntry
151{
152 ulong gen; /* generation number */
153 ushort psize; /* pointer block size */
154 ushort dsize; /* data block size */
155 uchar type;
156 uchar flags;
157 uvlong size;
158 uchar score[VtScoreSize];
159};
160
161void vtentrypack(VtEntry*, uchar*, int index);
162int vtentryunpack(VtEntry*, uchar*, int index);
163
164struct VtRoot
165{
166 char name[128];
167 char type[128];
168 uchar score[VtScoreSize]; /* to a Dir block */
169 ushort blocksize; /* maximum block size */
170 uchar prev[VtScoreSize]; /* last root block */
171};
172
173enum
174{
175 VtRootSize = 300,
176 VtRootVersion = 2,
177};
178
179void vtrootpack(VtRoot*, uchar*);
180int vtrootunpack(VtRoot*, uchar*);
181
182/*
183 * score of zero length block
184 */
185extern uchar vtzeroscore[VtScoreSize];
186
187/*
188 * zero extend and truncate blocks
189 */
190void vtzeroextend(int type, uchar *buf, uint n, uint nn);
191uint vtzerotruncate(int type, uchar *buf, uint n);
192
193/*
194 * parse score: mungs s
195 */
rscd23a6172004-03-15 01:57:29 +0000196int vtparsescore(char *s, char **prefix, uchar[VtScoreSize]);
rsc97a5e5f2003-11-23 18:25:35 +0000197
198/*
199 * formatting
200 * other than noted, these formats all ignore
201 * the width and precision arguments, and all flags
202 *
203 * V a venti score
204 */
rsc819822c2004-06-16 16:45:22 +0000205#ifndef PLAN9PORT
206#pragma varargck type "V" uchar*
207#pragma varargck type "F" VtFcall*
208#endif
rsc97a5e5f2003-11-23 18:25:35 +0000209
210int vtscorefmt(Fmt*);
211
212/*
213 * error-checking malloc et al.
214 */
215void vtfree(void *);
216void *vtmalloc(int);
217void *vtmallocz(int);
218void *vtrealloc(void *p, int);
219void *vtbrk(int n);
220char *vtstrdup(char *);
221
222/*
223 * Venti protocol
224 */
225
226/*
227 * Crypto strengths
228 */
229enum
230{
231 VtCryptoStrengthNone,
232 VtCryptoStrengthAuth,
233 VtCryptoStrengthWeak,
234 VtCryptoStrengthStrong,
235};
236
237/*
238 * Crypto suites
239 */
240enum
241{
242 VtCryptoNone,
243 VtCryptoSSL3,
244 VtCryptoTLS1,
245 VtCryptoMax,
246};
247
248/*
249 * Codecs
250 */
251enum
252{
253 VtCodecNone,
254 VtCodecDeflate,
255 VtCodecThwack,
256 VtCodecMax
257};
258
259enum
260{
261 VtRerror = 1,
262 VtTping = 2,
263 VtRping,
264 VtThello = 4,
265 VtRhello,
266 VtTgoodbye = 6,
267 VtRgoodbye, /* not used */
268 VtTauth0 = 8,
269 VtRauth0,
270 VtTauth1 = 10,
271 VtRauth1,
272 VtTread = 12,
273 VtRread,
274 VtTwrite = 14,
275 VtRwrite,
276 VtTsync = 16,
277 VtRsync,
278
279 VtTmax
280};
281
282struct VtFcall
283{
284 uchar type;
285 uchar tag;
286
287 char *error; /* Rerror */
288
289 char *version; /* Thello */
290 char *uid; /* Thello */
291 uchar strength; /* Thello */
292 uchar *crypto; /* Thello */
293 uint ncrypto; /* Thello */
294 uchar *codec; /* Thello */
295 uint ncodec; /* Thello */
296 char *sid; /* Rhello */
297 uchar rcrypto; /* Rhello */
298 uchar rcodec; /* Rhello */
299 uchar *auth; /* TauthX, RauthX */
300 uint nauth; /* TauthX, RauthX */
301 uchar score[VtScoreSize]; /* Tread, Rwrite */
302 uchar dtype; /* Tread, Twrite */
303 ushort count; /* Tread */
304 Packet *data; /* Rread, Twrite */
305};
306
307Packet *vtfcallpack(VtFcall*);
308int vtfcallunpack(VtFcall*, Packet*);
309void vtfcallclear(VtFcall*);
310int vtfcallfmt(Fmt*);
311
312enum
313{
314 VtStateAlloc,
315 VtStateConnected,
316 VtStateClosed,
317};
318
319struct VtConn
320{
321 QLock lk;
322 QLock inlk;
323 QLock outlk;
324 int debug;
325 int infd;
326 int outfd;
327 int muxer;
328 void *writeq;
329 void *readq;
330 int state;
331 void *wait[256];
332 uint ntag;
333 uint nsleep;
334 Packet *part;
335 Rendez tagrend;
336 Rendez rpcfork;
337 char *version;
338 char *uid;
339 char *sid;
rsc587f8f42005-02-13 18:32:06 +0000340 char addr[256]; /* address of other side */
rsc97a5e5f2003-11-23 18:25:35 +0000341};
342
343VtConn *vtconn(int infd, int outfd);
344VtConn *vtdial(char*);
345void vtfreeconn(VtConn*);
346int vtsend(VtConn*, Packet*);
347Packet *vtrecv(VtConn*);
348int vtversion(VtConn *z);
349void vtdebug(VtConn *z, char*, ...);
350void vthangup(VtConn *z);
351/* #pragma varargck argpos vtdebug 2 */
352
353/* server */
354typedef struct VtSrv VtSrv;
355typedef struct VtReq VtReq;
356struct VtReq
357{
358 VtFcall tx;
359 VtFcall rx;
360/* private */
361 VtSrv *srv;
362 void *sc;
363};
364
365int vtsrvhello(VtConn*);
366VtSrv *vtlisten(char *addr);
367VtReq *vtgetreq(VtSrv*);
368void vtrespond(VtReq*);
369
370/* client */
371Packet *vtrpc(VtConn*, Packet*);
372void vtrecvproc(void*); /* VtConn* */
373void vtsendproc(void*); /* VtConn* */
374
375int vtconnect(VtConn*);
376int vthello(VtConn*);
377int vtread(VtConn*, uchar score[VtScoreSize], uint type, uchar *buf, int n);
378int vtwrite(VtConn*, uchar score[VtScoreSize], uint type, uchar *buf, int n);
379Packet *vtreadpacket(VtConn*, uchar score[VtScoreSize], uint type, int n);
380int vtwritepacket(VtConn*, uchar score[VtScoreSize], uint type, Packet *p);
381int vtsync(VtConn*);
382int vtping(VtConn*);
383
384/*
385 * Data blocks and block cache.
386 */
387enum
388{
389 NilBlock = ~0,
390};
391
392typedef struct VtBlock VtBlock;
393typedef struct VtCache VtCache;
394
395struct VtBlock
396{
397 VtCache *c;
398 QLock lk;
399
400 uchar *data;
401 uchar score[VtScoreSize];
402 uchar type; /* BtXXX */
403
404 /* internal to cache */
405 int nlock;
406 int iostate;
407 int ref;
408 u32int heap;
409 VtBlock *next;
410 VtBlock **prev;
411 u32int used;
412 u32int used2;
413 u32int addr;
414
415 /* internal to efile (HACK) */
416 int decrypted;
417};
418
419u32int vtglobaltolocal(uchar[VtScoreSize]);
420void vtlocaltoglobal(u32int, uchar[VtScoreSize]);
421
422VtCache *vtcachealloc(VtConn*, int blocksize, ulong nblocks, int mode);
423void vtcachefree(VtCache*);
424VtBlock *vtcachelocal(VtCache*, u32int addr, int type);
425VtBlock *vtcacheglobal(VtCache*, uchar[VtScoreSize], int type);
426VtBlock *vtcacheallocblock(VtCache*, int type);
rscb98ae9b2004-06-17 19:18:31 +0000427void vtcachesetwrite(VtCache*, int(*)(VtConn*,uchar[VtScoreSize],uint,uchar*,int));
rsc97a5e5f2003-11-23 18:25:35 +0000428void vtblockput(VtBlock*);
429u32int vtcacheblocksize(VtCache*);
430int vtblockwrite(VtBlock*);
431VtBlock *vtblockcopy(VtBlock*);
432void vtblockduplock(VtBlock*);
rscd23a6172004-03-15 01:57:29 +0000433int vtblockdirty(VtBlock*);
rsc97a5e5f2003-11-23 18:25:35 +0000434
435/*
436 * Hash tree file tree.
437 */
438typedef struct VtFile VtFile;
rscd23a6172004-03-15 01:57:29 +0000439struct VtFile
440{
441 QLock lk;
442 int ref;
443 int local;
444 VtBlock *b; /* block containing this file */
445 uchar score[VtScoreSize]; /* score of block containing this file */
446
447/* immutable */
448 VtCache *c;
449 int mode;
450 u32int gen;
451 int dsize;
452 int dir;
453 VtFile *parent;
454 int epb; /* entries per block in parent */
455 u32int offset; /* entry offset in parent */
456};
rsc97a5e5f2003-11-23 18:25:35 +0000457
458enum
459{
460 VtOREAD,
461 VtOWRITE,
462 VtORDWR,
463 VtOCREATE = 0x100,
464};
465
466VtFile *vtfileopenroot(VtCache*, VtEntry*);
467VtFile *vtfilecreateroot(VtCache*, int psize, int dsize, int type);
468VtFile *vtfileopen(VtFile*, u32int, int);
469VtFile *vtfilecreate(VtFile*, int psize, int dsize, int dir);
470VtBlock *vtfileblock(VtFile*, u32int, int mode);
rsc97a5e5f2003-11-23 18:25:35 +0000471long vtfileread(VtFile*, void*, long, vlong);
472long vtfilewrite(VtFile*, void*, long, vlong);
473int vtfileflush(VtFile*);
474void vtfileincref(VtFile*);
475void vtfileclose(VtFile*);
476int vtfilegetentry(VtFile*, VtEntry*);
rscd23a6172004-03-15 01:57:29 +0000477int vtfilesetentry(VtFile*, VtEntry*);
rsc97a5e5f2003-11-23 18:25:35 +0000478int vtfileblockscore(VtFile*, u32int, uchar[VtScoreSize]);
479u32int vtfilegetdirsize(VtFile*);
480int vtfilesetdirsize(VtFile*, u32int);
481void vtfileunlock(VtFile*);
482int vtfilelock(VtFile*, int);
483int vtfilelock2(VtFile*, VtFile*, int);
484int vtfileflushbefore(VtFile*, u64int);
rscd23a6172004-03-15 01:57:29 +0000485int vtfiletruncate(VtFile*);
486uvlong vtfilegetsize(VtFile*);
487int vtfilesetsize(VtFile*, uvlong);
488int vtfileremove(VtFile*);
rsc97a5e5f2003-11-23 18:25:35 +0000489
rsca09e80f2004-05-23 00:59:17 +0000490extern int chattyventi;
491extern int ventidoublechecksha1;
rsc5810cad2005-02-15 05:03:44 +0000492extern int ventilogging;
rsca09e80f2004-05-23 00:59:17 +0000493
rsc587f8f42005-02-13 18:32:06 +0000494extern char *VtServerLog;
495
rsc819822c2004-06-16 16:45:22 +0000496#ifdef __cplusplus
rscf7012582003-11-25 01:40:27 +0000497}
498#endif
499#endif