Blob


1 #include <u.h>
2 #include <libc.h>
3 #include <venti.h>
5 int
6 vtsrvhello(VtConn *z)
7 {
8 VtFcall tx, rx;
9 Packet *p;
11 if((p = vtrecv(z)) == nil)
12 return 0;
14 if(vtfcallunpack(&tx, p) < 0){
15 packetfree(p);
16 return 0;
17 }
18 packetfree(p);
20 if(tx.type != VtThello){
21 vtfcallclear(&tx);
22 werrstr("bad packet type %d; want Thello %d", tx.type, VtThello);
23 return 0;
24 }
25 if(tx.tag != 0){
26 vtfcallclear(&tx);
27 werrstr("bad tag in hello");
28 return 0;
29 }
30 if(strcmp(tx.version, z->version) != 0){
31 vtfcallclear(&tx);
32 werrstr("bad version in hello");
33 return 0;
34 }
35 vtfree(z->uid);
36 z->uid = tx.uid;
37 tx.uid = nil;
38 vtfcallclear(&tx);
40 memset(&rx, 0, sizeof rx);
41 rx.type = VtRhello;
42 rx.tag = tx.tag;
43 rx.sid = "anonymous";
44 if((p = vtfcallpack(&rx)) == nil)
45 return 0;
46 if(vtsend(z, p) < 0)
47 return 0;
49 return 1;
50 }