50 lines · 833 B · C
RawDownload
#include <u.h>#include <libc.h>#include <venti.h> intvtsrvhello(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;}