plan9/sys/include/oventi.h

281 lines
7.4 KiB
C

/*
* 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