blob: 2a8f67b9647c862ae6842fa7beaae9b8dbf2ca49 [file] [log] [blame]
#include <u.h>
#include <libc.h>
#include <venti.h>
#include "queue.h"
int chattyventi;
VtConn*
vtconn(int infd, int outfd)
{
VtConn *z;
NetConnInfo *nci;
z = vtmallocz(sizeof(VtConn));
z->tagrend.l = &z->lk;
z->rpcfork.l = &z->lk;
z->infd = infd;
z->outfd = outfd;
z->part = packetalloc();
nci = getnetconninfo(nil, infd);
if(nci == nil)
snprint(z->addr, sizeof z->addr, "/dev/fd/%d", infd);
else{
strecpy(z->addr, z->addr+sizeof z->addr, nci->raddr);
freenetconninfo(nci);
}
return z;
}
int
vtreconn(VtConn *z, int infd, int outfd)
{
NetConnInfo *nci;
z->state = VtStateAlloc;
if(z->infd >= 0)
close(z->infd);
z->infd = infd;
if(z->outfd >= 0)
close(z->outfd);
z->outfd = outfd;
nci = getnetconninfo(nil, infd);
if(nci == nil)
snprint(z->addr, sizeof z->addr, "/dev/fd/%d", infd);
else{
strecpy(z->addr, z->addr+sizeof z->addr, nci->raddr);
freenetconninfo(nci);
}
return 0;
}
void
vtfreeconn(VtConn *z)
{
vthangup(z);
qlock(&z->lk);
/*
* Wait for send and recv procs to notice
* the hangup and clear out the queues.
*/
while(z->readq || z->writeq){
if(z->readq)
_vtqhangup(z->readq);
if(z->writeq)
_vtqhangup(z->writeq);
rsleep(&z->rpcfork);
}
packetfree(z->part);
vtfree(z->version);
vtfree(z->sid);
qunlock(&z->lk);
vtfree(z);
}