6 static char EAuthState[] = "bad authentication state";
7 static char ENotServer[] = "not a server session";
8 static char EVersion[] = "incorrect version number";
9 static char EProtocolBotch[] = "venti protocol botch";
12 vtServerAlloc(VtServerVtbl *vtbl)
14 VtSession *z = vtAlloc();
15 z->vtbl = vtMemAlloc(sizeof(VtServerVtbl));
16 setmalloctag(z->vtbl, getcallerpc(&vtbl));
22 srvHello(VtSession *z, char *version, char *uid, int , uchar *, int , uchar *, int )
25 if(z->auth.state != VtAuthHello) {
26 vtSetError(EAuthState);
29 if(strcmp(version, vtGetVersion(z)) != 0) {
34 z->uid = vtStrDup(uid);
35 z->auth.state = VtAuthOK;
39 z->auth.state = VtAuthFailed;
46 dispatchHello(VtSession *z, Packet **pkt)
49 uchar *crypto, *codec;
51 int ncrypto, ncodec, cryptoStrength;
63 if(!vtGetString(p, &version))
65 if(!vtGetString(p, &uid))
67 if(!packetConsume(p, buf, 2))
69 cryptoStrength = buf[0];
71 crypto = vtMemAlloc(ncrypto);
72 if(!packetConsume(p, crypto, ncrypto))
75 if(!packetConsume(p, buf, 1))
78 codec = vtMemAlloc(ncodec);
79 if(!packetConsume(p, codec, ncodec))
82 if(packetSize(p) != 0) {
83 vtSetError(EProtocolBotch);
86 if(!srvHello(z, version, uid, cryptoStrength, crypto, ncrypto, codec, ncodec)) {
90 if(!vtAddString(p, vtGetSid(z)))
92 buf[0] = vtGetCrypto(z);
93 buf[1] = vtGetCodec(z);
94 packetAppend(p, buf, 2);
106 dispatchRead(VtSession *z, Packet **pkt)
110 uchar score[VtScoreSize], buf[4];
113 if(!packetConsume(p, score, VtScoreSize))
115 if(!packetConsume(p, buf, 4))
118 n = (buf[2]<<8) | buf[3];
119 if(packetSize(p) != 0) {
120 vtSetError(EProtocolBotch);
124 *pkt = (*z->vtbl->read)(z, score, type, n);
129 dispatchWrite(VtSession *z, Packet **pkt)
133 uchar score[VtScoreSize], buf[4];
136 if(!packetConsume(p, buf, 4))
139 if(!(z->vtbl->write)(z, score, type, p)) {
142 *pkt = packetAlloc();
143 packetAppend(*pkt, score, VtScoreSize);
149 dispatchSync(VtSession *z, Packet **pkt)
152 if(packetSize(*pkt) != 0) {
153 vtSetError(EProtocolBotch);
160 vtExport(VtSession *z)
167 vtSetError(ENotServer);
172 switch(rfork(RFNOWAIT|RFMEM|RFPROC)){
186 if(!vtConnect(z, nil))
189 vtDebug(z, "server connected!\n");
190 if(0) vtSetDebug(z, 1);
197 vtDebug(z, "server recv: ");
198 vtDebugMesg(z, p, "\n");
200 if(!packetConsume(p, buf, 2)) {
201 vtSetError(EProtocolBotch);
208 vtSetError(EProtocolBotch);
216 if(!dispatchHello(z, &p))
220 if(!dispatchRead(z, &p))
224 if(!dispatchWrite(z, &p))
228 if(!dispatchSync(z, &p))
233 hdr = packetHeader(p, 2);
238 hdr = packetHeader(p, 2);
241 if(!vtAddString(p, vtGetError()))
245 vtDebug(z, "server send: ");
246 vtDebugMesg(z, p, "\n");
248 if(!vtSendPacket(z, p)) {
257 z->vtbl->closing(z, clean);
263 return 0; /* never gets here */