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