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