Subversion Repositories planix.SVN

Rev

Blame | Last modification | View Log | RSS feed

#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;
}