280 lines · 7.4 KB · C
RawDownload
/*  * This file is part of the UCB release of Plan 9. It is subject to the license * terms in the LICENSE file found in the top-level directory of this * distribution and at http://akaros.cs.berkeley.edu/files/Plan9License. No * part of the UCB release of Plan 9, including this file, may be copied, * modified, propagated, or distributed except according to the terms contained * in the LICENSE file. */ #pragma	lib	"liboventi.a"#pragma	src	"/sys/src/liboventi" typedef struct VtSession	VtSession;typedef struct VtSha1		VtSha1;typedef struct Packet		Packet;typedef struct VtLock 		VtLock;typedef struct VtRendez		VtRendez;typedef struct VtRoot		VtRoot;typedef struct VtEntry		VtEntry;typedef struct VtServerVtbl	VtServerVtbl; #pragma incomplete VtSession#pragma incomplete VtSha1#pragma incomplete Packet#pragma incomplete VtLock#pragma incomplete VtRendez enum {	VtScoreSize	= 20, /* Venti */	VtMaxLumpSize	= 56*1024,	VtPointerDepth	= 7,		VtEntrySize	= 40,	VtRootSize 	= 300,	VtMaxStringSize	= 1000,	VtAuthSize 	= 1024,  /* size of auth group - in bits - must be multiple of 8 */	MaxFragSize 	= 9*1024,	VtMaxFileSize	= (1ULL<<48) - 1,	VtRootVersion	= 2,}; /* crypto strengths */enum {	VtCryptoStrengthNone,	VtCryptoStrengthAuth,	VtCryptoStrengthWeak,	VtCryptoStrengthStrong,}; /* crypto suites */enum {	VtCryptoNone,	VtCryptoSSL3,	VtCryptoTLS1, 	VtCryptoMax}; /* codecs */enum {	VtCodecNone, 	VtCodecDeflate,	VtCodecThwack, 	VtCodecMax}; /* Lump Types */enum {	VtErrType,		/* illegal */ 	VtRootType,	VtDirType,	VtPointerType0,	VtPointerType1,	VtPointerType2,	VtPointerType3,	VtPointerType4,	VtPointerType5,	VtPointerType6,	VtPointerType7,		/* not used */	VtPointerType8,		/* not used */	VtPointerType9,		/* not used */	VtDataType, 	VtMaxType}; /* Dir Entry flags */enum {	VtEntryActive = (1<<0),		/* entry is in use */	VtEntryDir = (1<<1),		/* a directory */	VtEntryDepthShift = 2,		/* shift for pointer depth */	VtEntryDepthMask = (0x7<<2),	/* mask for pointer depth */	VtEntryLocal = (1<<5),		/* used for local storage: should not be set for Venti blocks */	VtEntryNoArchive = (1<<6),	/* used for local storage: should not be set for Venti blocks */}; struct VtRoot {	ushort version;	char name[128];	char type[128];	uchar score[VtScoreSize];	/* to a Dir block */	ushort blockSize;		/* maximum block size */	uchar prev[VtScoreSize];	/* last root block */}; struct VtEntry {	ulong gen;			/* generation number */	ushort psize;			/* pointer block size */	ushort dsize;			/* data block size */	uchar depth;			/* unpacked from flags */	uchar flags;	uvlong size;	uchar score[VtScoreSize];}; struct VtServerVtbl {	Packet *(*read)(VtSession*, uchar score[VtScoreSize], int type, int n);	int (*write)(VtSession*, uchar score[VtScoreSize], int type, Packet *p);	void (*closing)(VtSession*, int clean);	void (*sync)(VtSession*);}; /* versions */enum {	/* experimental versions */	VtVersion01 = 1,	VtVersion02,}; /* score of zero length block */extern uchar vtZeroScore[VtScoreSize];	 /* both sides */void vtAttach(void);void vtDetach(void);void vtClose(VtSession *s);void vtFree(VtSession *s);char *vtGetUid(VtSession *s);char *vtGetSid(VtSession *s);int vtSetDebug(VtSession *s, int);int vtGetDebug(VtSession *s);int vtSetFd(VtSession *s, int fd);int vtGetFd(VtSession *s);int vtConnect(VtSession *s, char *password);int vtSetCryptoStrength(VtSession *s, int);int vtGetCryptoStrength(VtSession *s);int vtSetCompression(VtSession *s, int);int vtGetCompression(VtSession *s);int vtGetCrypto(VtSession *s);int vtGetCodec(VtSession *s);char *vtGetVersion(VtSession *s);char *vtGetError(void);int vtErrFmt(Fmt *fmt);void vtDebug(VtSession*, char *, ...);void vtDebugMesg(VtSession *z, Packet *p, char *s); /* internal */VtSession *vtAlloc(void);void vtReset(VtSession*);int vtAddString(Packet*, char*);int vtGetString(Packet*, char**);int vtSendPacket(VtSession*, Packet*);Packet *vtRecvPacket(VtSession*);void vtDisconnect(VtSession*, int);int vtHello(VtSession*); /* client side */VtSession *vtClientAlloc(void);VtSession *vtDial(char *server, int canfail);int vtRedial(VtSession*, char *server);VtSession *vtStdioServer(char *server);int vtPing(VtSession *s);int vtSetUid(VtSession*, char *uid);int vtRead(VtSession*, uchar score[VtScoreSize], int type, uchar *buf, int n);int vtWrite(VtSession*, uchar score[VtScoreSize], int type, uchar *buf, int n);Packet *vtReadPacket(VtSession*, uchar score[VtScoreSize], int type, int n);int vtWritePacket(VtSession*, uchar score[VtScoreSize], int type, Packet *p);int vtSync(VtSession *s); int vtZeroExtend(int type, uchar *buf, int n, int nn);int vtZeroTruncate(int type, uchar *buf, int n);int vtParseScore(char*, uint, uchar[VtScoreSize]); void vtRootPack(VtRoot*, uchar*);int vtRootUnpack(VtRoot*, uchar*);void vtEntryPack(VtEntry*, uchar*, int index);int vtEntryUnpack(VtEntry*, uchar*, int index); /* server side */VtSession *vtServerAlloc(VtServerVtbl*);int vtSetSid(VtSession *s, char *sid);int vtExport(VtSession *s); /* sha1 */VtSha1* vtSha1Alloc(void);void vtSha1Free(VtSha1*);void vtSha1Init(VtSha1*);void vtSha1Update(VtSha1*, uchar *, int n);void vtSha1Final(VtSha1*, uchar sha1[VtScoreSize]);void vtSha1(uchar score[VtScoreSize], uchar *, int);int vtSha1Check(uchar score[VtScoreSize], uchar *, int);int vtScoreFmt(Fmt *fmt); /* Packet */Packet *packetAlloc(void);void packetFree(Packet*);Packet *packetForeign(uchar *buf, int n, void (*free)(void *a), void *a);Packet *packetDup(Packet*, int offset, int n);Packet *packetSplit(Packet*, int n);int packetConsume(Packet*, uchar *buf, int n);int packetTrim(Packet*, int offset, int n);uchar *packetHeader(Packet*, int n);uchar *packetTrailer(Packet*, int n);int packetPrefix(Packet*, uchar *buf, int n);int packetAppend(Packet*, uchar *buf, int n);int packetConcat(Packet*, Packet*);uchar *packetPeek(Packet*, uchar *buf, int offset, int n);int packetCopy(Packet*, uchar *buf, int offset, int n);int packetFragments(Packet*, IOchunk*, int nio, int offset);int packetSize(Packet*);int packetAllocatedSize(Packet*);void packetSha1(Packet*, uchar sha1[VtScoreSize]);int packetCompact(Packet*);int packetCmp(Packet*, Packet*);void packetStats(void); /* portability stuff - should be a seperate library */ void vtMemFree(void *);void *vtMemAlloc(int);void *vtMemAllocZ(int);void *vtMemRealloc(void *p, int);void *vtMemBrk(int n);char *vtStrDup(char *);void vtFatal(char *, ...);char *vtGetError(void);char *vtSetError(char *, ...);char *vtOSError(void); /* locking/threads */int vtThread(void (*f)(void*), void *rock);void vtThreadSetName(char*); VtLock *vtLockAlloc(void);/* void vtLockInit(VtLock**); */void vtLock(VtLock*);int vtCanLock(VtLock*);void vtRLock(VtLock*);int vtCanRLock(VtLock*);void vtUnlock(VtLock*);void vtRUnlock(VtLock*);void vtLockFree(VtLock*); VtRendez *vtRendezAlloc(VtLock*);void vtRendezFree(VtRendez*);int vtSleep(VtRendez*);int vtWakeup(VtRendez*);int vtWakeupAll(VtRendez*); /* fd functions - really network (socket) functions */void vtFdClose(int);int vtFdRead(int, uchar*, int);int vtFdReadFully(int, uchar*, int);int vtFdWrite(int, uchar*, int); /* * formatting * other than noted, these formats all ignore * the width and precision arguments, and all flags * * V	a venti score * R	venti error */#pragma	varargck	type	"V"		uchar*#pragma	varargck	type	"R"		void #pragma	varargck	argpos	vtSetError	1