#include <u.h>
#include <libc.h>
#include <venti.h>
int
vtsrvhello(VtConn *z)
{
VtFcall tx, rx;
Packet *p;
if((p = vtrecv(z)) == nil)
return -1;
if(vtfcallunpack(&tx, p) < 0){
packetfree(p);
return -1;
}
packetfree(p);
if(tx.msgtype != VtThello){
vtfcallclear(&tx);
werrstr("bad packet type %d; want Thello %d", tx.msgtype, VtThello);
return -1;
}
if(tx.tag != 0){
vtfcallclear(&tx);
werrstr("bad tag in hello");
return -1;
}
if(strcmp(tx.version, z->version) != 0){
vtfcallclear(&tx);
werrstr("bad version in hello");
return -1;
}
vtfree(z->uid);
z->uid = tx.uid;
tx.uid = nil;
vtfcallclear(&tx);
memset(&rx, 0, sizeof rx);
rx.msgtype = VtRhello;
rx.tag = tx.tag;
rx.sid = "anonymous";
if((p = vtfcallpack(&rx)) == nil)
return -1;
if(vtsend(z, p) < 0)
return -1;
return 0;
}
|