1*368c31abSDavid du Colombier #pragma lib "liboventi.a" 2*368c31abSDavid du Colombier #pragma src "/sys/src/liboventi" 3*368c31abSDavid du Colombier 4*368c31abSDavid du Colombier typedef struct VtSession VtSession; 5*368c31abSDavid du Colombier typedef struct VtSha1 VtSha1; 6*368c31abSDavid du Colombier typedef struct Packet Packet; 7*368c31abSDavid du Colombier typedef struct VtLock VtLock; 8*368c31abSDavid du Colombier typedef struct VtRendez VtRendez; 9*368c31abSDavid du Colombier typedef struct VtRoot VtRoot; 10*368c31abSDavid du Colombier typedef struct VtEntry VtEntry; 11*368c31abSDavid du Colombier typedef struct VtServerVtbl VtServerVtbl; 12*368c31abSDavid du Colombier 13*368c31abSDavid du Colombier #pragma incomplete VtSession 14*368c31abSDavid du Colombier #pragma incomplete VtSha1 15*368c31abSDavid du Colombier #pragma incomplete Packet 16*368c31abSDavid du Colombier #pragma incomplete VtLock 17*368c31abSDavid du Colombier #pragma incomplete VtRendez 18*368c31abSDavid du Colombier 19*368c31abSDavid du Colombier enum { 20*368c31abSDavid du Colombier VtScoreSize = 20, /* Venti */ 21*368c31abSDavid du Colombier VtMaxLumpSize = 56*1024, 22*368c31abSDavid du Colombier VtPointerDepth = 7, 23*368c31abSDavid du Colombier VtEntrySize = 40, 24*368c31abSDavid du Colombier VtRootSize = 300, 25*368c31abSDavid du Colombier VtMaxStringSize = 1000, 26*368c31abSDavid du Colombier VtAuthSize = 1024, /* size of auth group - in bits - must be multiple of 8 */ 27*368c31abSDavid du Colombier MaxFragSize = 9*1024, 28*368c31abSDavid du Colombier VtMaxFileSize = (1ULL<<48) - 1, 29*368c31abSDavid du Colombier VtRootVersion = 2, 30*368c31abSDavid du Colombier }; 31*368c31abSDavid du Colombier 32*368c31abSDavid du Colombier /* crypto strengths */ 33*368c31abSDavid du Colombier enum { 34*368c31abSDavid du Colombier VtCryptoStrengthNone, 35*368c31abSDavid du Colombier VtCryptoStrengthAuth, 36*368c31abSDavid du Colombier VtCryptoStrengthWeak, 37*368c31abSDavid du Colombier VtCryptoStrengthStrong, 38*368c31abSDavid du Colombier }; 39*368c31abSDavid du Colombier 40*368c31abSDavid du Colombier /* crypto suites */ 41*368c31abSDavid du Colombier enum { 42*368c31abSDavid du Colombier VtCryptoNone, 43*368c31abSDavid du Colombier VtCryptoSSL3, 44*368c31abSDavid du Colombier VtCryptoTLS1, 45*368c31abSDavid du Colombier 46*368c31abSDavid du Colombier VtCryptoMax 47*368c31abSDavid du Colombier }; 48*368c31abSDavid du Colombier 49*368c31abSDavid du Colombier /* codecs */ 50*368c31abSDavid du Colombier enum { 51*368c31abSDavid du Colombier VtCodecNone, 52*368c31abSDavid du Colombier 53*368c31abSDavid du Colombier VtCodecDeflate, 54*368c31abSDavid du Colombier VtCodecThwack, 55*368c31abSDavid du Colombier 56*368c31abSDavid du Colombier VtCodecMax 57*368c31abSDavid du Colombier }; 58*368c31abSDavid du Colombier 59*368c31abSDavid du Colombier /* Lump Types */ 60*368c31abSDavid du Colombier enum { 61*368c31abSDavid du Colombier VtErrType, /* illegal */ 62*368c31abSDavid du Colombier 63*368c31abSDavid du Colombier VtRootType, 64*368c31abSDavid du Colombier VtDirType, 65*368c31abSDavid du Colombier VtPointerType0, 66*368c31abSDavid du Colombier VtPointerType1, 67*368c31abSDavid du Colombier VtPointerType2, 68*368c31abSDavid du Colombier VtPointerType3, 69*368c31abSDavid du Colombier VtPointerType4, 70*368c31abSDavid du Colombier VtPointerType5, 71*368c31abSDavid du Colombier VtPointerType6, 72*368c31abSDavid du Colombier VtPointerType7, /* not used */ 73*368c31abSDavid du Colombier VtPointerType8, /* not used */ 74*368c31abSDavid du Colombier VtPointerType9, /* not used */ 75*368c31abSDavid du Colombier VtDataType, 76*368c31abSDavid du Colombier 77*368c31abSDavid du Colombier VtMaxType 78*368c31abSDavid du Colombier }; 79*368c31abSDavid du Colombier 80*368c31abSDavid du Colombier /* Dir Entry flags */ 81*368c31abSDavid du Colombier enum { 82*368c31abSDavid du Colombier VtEntryActive = (1<<0), /* entry is in use */ 83*368c31abSDavid du Colombier VtEntryDir = (1<<1), /* a directory */ 84*368c31abSDavid du Colombier VtEntryDepthShift = 2, /* shift for pointer depth */ 85*368c31abSDavid du Colombier VtEntryDepthMask = (0x7<<2), /* mask for pointer depth */ 86*368c31abSDavid du Colombier VtEntryLocal = (1<<5), /* used for local storage: should not be set for Venti blocks */ 87*368c31abSDavid du Colombier VtEntryNoArchive = (1<<6), /* used for local storage: should not be set for Venti blocks */ 88*368c31abSDavid du Colombier }; 89*368c31abSDavid du Colombier 90*368c31abSDavid du Colombier struct VtRoot { 91*368c31abSDavid du Colombier ushort version; 92*368c31abSDavid du Colombier char name[128]; 93*368c31abSDavid du Colombier char type[128]; 94*368c31abSDavid du Colombier uchar score[VtScoreSize]; /* to a Dir block */ 95*368c31abSDavid du Colombier ushort blockSize; /* maximum block size */ 96*368c31abSDavid du Colombier uchar prev[VtScoreSize]; /* last root block */ 97*368c31abSDavid du Colombier }; 98*368c31abSDavid du Colombier 99*368c31abSDavid du Colombier struct VtEntry { 100*368c31abSDavid du Colombier ulong gen; /* generation number */ 101*368c31abSDavid du Colombier ushort psize; /* pointer block size */ 102*368c31abSDavid du Colombier ushort dsize; /* data block size */ 103*368c31abSDavid du Colombier uchar depth; /* unpacked from flags */ 104*368c31abSDavid du Colombier uchar flags; 105*368c31abSDavid du Colombier uvlong size; 106*368c31abSDavid du Colombier uchar score[VtScoreSize]; 107*368c31abSDavid du Colombier }; 108*368c31abSDavid du Colombier 109*368c31abSDavid du Colombier struct VtServerVtbl { 110*368c31abSDavid du Colombier Packet *(*read)(VtSession*, uchar score[VtScoreSize], int type, int n); 111*368c31abSDavid du Colombier int (*write)(VtSession*, uchar score[VtScoreSize], int type, Packet *p); 112*368c31abSDavid du Colombier void (*closing)(VtSession*, int clean); 113*368c31abSDavid du Colombier void (*sync)(VtSession*); 114*368c31abSDavid du Colombier }; 115*368c31abSDavid du Colombier 116*368c31abSDavid du Colombier /* versions */ 117*368c31abSDavid du Colombier enum { 118*368c31abSDavid du Colombier /* experimental versions */ 119*368c31abSDavid du Colombier VtVersion01 = 1, 120*368c31abSDavid du Colombier VtVersion02, 121*368c31abSDavid du Colombier }; 122*368c31abSDavid du Colombier 123*368c31abSDavid du Colombier /* score of zero length block */ 124*368c31abSDavid du Colombier extern uchar vtZeroScore[VtScoreSize]; 125*368c31abSDavid du Colombier 126*368c31abSDavid du Colombier /* both sides */ 127*368c31abSDavid du Colombier void vtAttach(void); 128*368c31abSDavid du Colombier void vtDetach(void); 129*368c31abSDavid du Colombier void vtClose(VtSession *s); 130*368c31abSDavid du Colombier void vtFree(VtSession *s); 131*368c31abSDavid du Colombier char *vtGetUid(VtSession *s); 132*368c31abSDavid du Colombier char *vtGetSid(VtSession *s); 133*368c31abSDavid du Colombier int vtSetDebug(VtSession *s, int); 134*368c31abSDavid du Colombier int vtGetDebug(VtSession *s); 135*368c31abSDavid du Colombier int vtSetFd(VtSession *s, int fd); 136*368c31abSDavid du Colombier int vtGetFd(VtSession *s); 137*368c31abSDavid du Colombier int vtConnect(VtSession *s, char *password); 138*368c31abSDavid du Colombier int vtSetCryptoStrength(VtSession *s, int); 139*368c31abSDavid du Colombier int vtGetCryptoStrength(VtSession *s); 140*368c31abSDavid du Colombier int vtSetCompression(VtSession *s, int); 141*368c31abSDavid du Colombier int vtGetCompression(VtSession *s); 142*368c31abSDavid du Colombier int vtGetCrypto(VtSession *s); 143*368c31abSDavid du Colombier int vtGetCodec(VtSession *s); 144*368c31abSDavid du Colombier char *vtGetVersion(VtSession *s); 145*368c31abSDavid du Colombier char *vtGetError(void); 146*368c31abSDavid du Colombier int vtErrFmt(Fmt *fmt); 147*368c31abSDavid du Colombier void vtDebug(VtSession*, char *, ...); 148*368c31abSDavid du Colombier void vtDebugMesg(VtSession *z, Packet *p, char *s); 149*368c31abSDavid du Colombier 150*368c31abSDavid du Colombier /* internal */ 151*368c31abSDavid du Colombier VtSession *vtAlloc(void); 152*368c31abSDavid du Colombier void vtReset(VtSession*); 153*368c31abSDavid du Colombier int vtAddString(Packet*, char*); 154*368c31abSDavid du Colombier int vtGetString(Packet*, char**); 155*368c31abSDavid du Colombier int vtSendPacket(VtSession*, Packet*); 156*368c31abSDavid du Colombier Packet *vtRecvPacket(VtSession*); 157*368c31abSDavid du Colombier void vtDisconnect(VtSession*, int); 158*368c31abSDavid du Colombier int vtHello(VtSession*); 159*368c31abSDavid du Colombier 160*368c31abSDavid du Colombier /* client side */ 161*368c31abSDavid du Colombier VtSession *vtClientAlloc(void); 162*368c31abSDavid du Colombier VtSession *vtDial(char *server, int canfail); 163*368c31abSDavid du Colombier int vtRedial(VtSession*, char *server); 164*368c31abSDavid du Colombier VtSession *vtStdioServer(char *server); 165*368c31abSDavid du Colombier int vtPing(VtSession *s); 166*368c31abSDavid du Colombier int vtSetUid(VtSession*, char *uid); 167*368c31abSDavid du Colombier int vtRead(VtSession*, uchar score[VtScoreSize], int type, uchar *buf, int n); 168*368c31abSDavid du Colombier int vtWrite(VtSession*, uchar score[VtScoreSize], int type, uchar *buf, int n); 169*368c31abSDavid du Colombier Packet *vtReadPacket(VtSession*, uchar score[VtScoreSize], int type, int n); 170*368c31abSDavid du Colombier int vtWritePacket(VtSession*, uchar score[VtScoreSize], int type, Packet *p); 171*368c31abSDavid du Colombier int vtSync(VtSession *s); 172*368c31abSDavid du Colombier 173*368c31abSDavid du Colombier int vtZeroExtend(int type, uchar *buf, int n, int nn); 174*368c31abSDavid du Colombier int vtZeroTruncate(int type, uchar *buf, int n); 175*368c31abSDavid du Colombier int vtParseScore(char*, uint, uchar[VtScoreSize]); 176*368c31abSDavid du Colombier 177*368c31abSDavid du Colombier void vtRootPack(VtRoot*, uchar*); 178*368c31abSDavid du Colombier int vtRootUnpack(VtRoot*, uchar*); 179*368c31abSDavid du Colombier void vtEntryPack(VtEntry*, uchar*, int index); 180*368c31abSDavid du Colombier int vtEntryUnpack(VtEntry*, uchar*, int index); 181*368c31abSDavid du Colombier 182*368c31abSDavid du Colombier /* server side */ 183*368c31abSDavid du Colombier VtSession *vtServerAlloc(VtServerVtbl*); 184*368c31abSDavid du Colombier int vtSetSid(VtSession *s, char *sid); 185*368c31abSDavid du Colombier int vtExport(VtSession *s); 186*368c31abSDavid du Colombier 187*368c31abSDavid du Colombier /* sha1 */ 188*368c31abSDavid du Colombier VtSha1* vtSha1Alloc(void); 189*368c31abSDavid du Colombier void vtSha1Free(VtSha1*); 190*368c31abSDavid du Colombier void vtSha1Init(VtSha1*); 191*368c31abSDavid du Colombier void vtSha1Update(VtSha1*, uchar *, int n); 192*368c31abSDavid du Colombier void vtSha1Final(VtSha1*, uchar sha1[VtScoreSize]); 193*368c31abSDavid du Colombier void vtSha1(uchar score[VtScoreSize], uchar *, int); 194*368c31abSDavid du Colombier int vtSha1Check(uchar score[VtScoreSize], uchar *, int); 195*368c31abSDavid du Colombier int vtScoreFmt(Fmt *fmt); 196*368c31abSDavid du Colombier 197*368c31abSDavid du Colombier /* Packet */ 198*368c31abSDavid du Colombier Packet *packetAlloc(void); 199*368c31abSDavid du Colombier void packetFree(Packet*); 200*368c31abSDavid du Colombier Packet *packetForeign(uchar *buf, int n, void (*free)(void *a), void *a); 201*368c31abSDavid du Colombier Packet *packetDup(Packet*, int offset, int n); 202*368c31abSDavid du Colombier Packet *packetSplit(Packet*, int n); 203*368c31abSDavid du Colombier int packetConsume(Packet*, uchar *buf, int n); 204*368c31abSDavid du Colombier int packetTrim(Packet*, int offset, int n); 205*368c31abSDavid du Colombier uchar *packetHeader(Packet*, int n); 206*368c31abSDavid du Colombier uchar *packetTrailer(Packet*, int n); 207*368c31abSDavid du Colombier int packetPrefix(Packet*, uchar *buf, int n); 208*368c31abSDavid du Colombier int packetAppend(Packet*, uchar *buf, int n); 209*368c31abSDavid du Colombier int packetConcat(Packet*, Packet*); 210*368c31abSDavid du Colombier uchar *packetPeek(Packet*, uchar *buf, int offset, int n); 211*368c31abSDavid du Colombier int packetCopy(Packet*, uchar *buf, int offset, int n); 212*368c31abSDavid du Colombier int packetFragments(Packet*, IOchunk*, int nio, int offset); 213*368c31abSDavid du Colombier int packetSize(Packet*); 214*368c31abSDavid du Colombier int packetAllocatedSize(Packet*); 215*368c31abSDavid du Colombier void packetSha1(Packet*, uchar sha1[VtScoreSize]); 216*368c31abSDavid du Colombier int packetCompact(Packet*); 217*368c31abSDavid du Colombier int packetCmp(Packet*, Packet*); 218*368c31abSDavid du Colombier void packetStats(void); 219*368c31abSDavid du Colombier 220*368c31abSDavid du Colombier /* portability stuff - should be a seperate library */ 221*368c31abSDavid du Colombier 222*368c31abSDavid du Colombier void vtMemFree(void *); 223*368c31abSDavid du Colombier void *vtMemAlloc(int); 224*368c31abSDavid du Colombier void *vtMemAllocZ(int); 225*368c31abSDavid du Colombier void *vtMemRealloc(void *p, int); 226*368c31abSDavid du Colombier void *vtMemBrk(int n); 227*368c31abSDavid du Colombier char *vtStrDup(char *); 228*368c31abSDavid du Colombier void vtFatal(char *, ...); 229*368c31abSDavid du Colombier char *vtGetError(void); 230*368c31abSDavid du Colombier char *vtSetError(char *, ...); 231*368c31abSDavid du Colombier char *vtOSError(void); 232*368c31abSDavid du Colombier 233*368c31abSDavid du Colombier /* locking/threads */ 234*368c31abSDavid du Colombier int vtThread(void (*f)(void*), void *rock); 235*368c31abSDavid du Colombier void vtThreadSetName(char*); 236*368c31abSDavid du Colombier 237*368c31abSDavid du Colombier VtLock *vtLockAlloc(void); 238*368c31abSDavid du Colombier /* void vtLockInit(VtLock**); */ 239*368c31abSDavid du Colombier void vtLock(VtLock*); 240*368c31abSDavid du Colombier int vtCanLock(VtLock*); 241*368c31abSDavid du Colombier void vtRLock(VtLock*); 242*368c31abSDavid du Colombier int vtCanRLock(VtLock*); 243*368c31abSDavid du Colombier void vtUnlock(VtLock*); 244*368c31abSDavid du Colombier void vtRUnlock(VtLock*); 245*368c31abSDavid du Colombier void vtLockFree(VtLock*); 246*368c31abSDavid du Colombier 247*368c31abSDavid du Colombier VtRendez *vtRendezAlloc(VtLock*); 248*368c31abSDavid du Colombier void vtRendezFree(VtRendez*); 249*368c31abSDavid du Colombier int vtSleep(VtRendez*); 250*368c31abSDavid du Colombier int vtWakeup(VtRendez*); 251*368c31abSDavid du Colombier int vtWakeupAll(VtRendez*); 252*368c31abSDavid du Colombier 253*368c31abSDavid du Colombier /* fd functions - really network (socket) functions */ 254*368c31abSDavid du Colombier void vtFdClose(int); 255*368c31abSDavid du Colombier int vtFdRead(int, uchar*, int); 256*368c31abSDavid du Colombier int vtFdReadFully(int, uchar*, int); 257*368c31abSDavid du Colombier int vtFdWrite(int, uchar*, int); 258*368c31abSDavid du Colombier 259*368c31abSDavid du Colombier /* 260*368c31abSDavid du Colombier * formatting 261*368c31abSDavid du Colombier * other than noted, these formats all ignore 262*368c31abSDavid du Colombier * the width and precision arguments, and all flags 263*368c31abSDavid du Colombier * 264*368c31abSDavid du Colombier * V a venti score 265*368c31abSDavid du Colombier * R venti error 266*368c31abSDavid du Colombier */ 267*368c31abSDavid du Colombier #pragma varargck type "V" uchar* 268*368c31abSDavid du Colombier #pragma varargck type "R" void 269*368c31abSDavid du Colombier 270*368c31abSDavid du Colombier #pragma varargck argpos vtSetError 1 271*368c31abSDavid du Colombier 272