2 |
- |
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 |
|