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