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