xref: /plan9/sys/include/oventi.h (revision 368c31ab13393dea083228fdd1c3445076f83a4b)
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