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 #include "queue.h" 5*368c31abSDavid du Colombier 6*368c31abSDavid du Colombier int chattyventi; 7*368c31abSDavid du Colombier 8*368c31abSDavid du Colombier VtConn* vtconn(int infd,int outfd)9*368c31abSDavid du Colombiervtconn(int infd, int outfd) 10*368c31abSDavid du Colombier { 11*368c31abSDavid du Colombier VtConn *z; 12*368c31abSDavid du Colombier NetConnInfo *nci; 13*368c31abSDavid du Colombier 14*368c31abSDavid du Colombier z = vtmallocz(sizeof(VtConn)); 15*368c31abSDavid du Colombier z->tagrend.l = &z->lk; 16*368c31abSDavid du Colombier z->rpcfork.l = &z->lk; 17*368c31abSDavid du Colombier z->infd = infd; 18*368c31abSDavid du Colombier z->outfd = outfd; 19*368c31abSDavid du Colombier z->part = packetalloc(); 20*368c31abSDavid du Colombier nci = getnetconninfo(nil, infd); 21*368c31abSDavid du Colombier if(nci == nil) 22*368c31abSDavid du Colombier snprint(z->addr, sizeof z->addr, "/dev/fd/%d", infd); 23*368c31abSDavid du Colombier else{ 24*368c31abSDavid du Colombier strecpy(z->addr, z->addr+sizeof z->addr, nci->raddr); 25*368c31abSDavid du Colombier freenetconninfo(nci); 26*368c31abSDavid du Colombier } 27*368c31abSDavid du Colombier return z; 28*368c31abSDavid du Colombier } 29*368c31abSDavid du Colombier 30*368c31abSDavid du Colombier void vtfreeconn(VtConn * z)31*368c31abSDavid du Colombiervtfreeconn(VtConn *z) 32*368c31abSDavid du Colombier { 33*368c31abSDavid du Colombier vthangup(z); 34*368c31abSDavid du Colombier qlock(&z->lk); 35*368c31abSDavid du Colombier /* 36*368c31abSDavid du Colombier * Wait for send and recv procs to notice 37*368c31abSDavid du Colombier * the hangup and clear out the queues. 38*368c31abSDavid du Colombier */ 39*368c31abSDavid du Colombier while(z->readq || z->writeq){ 40*368c31abSDavid du Colombier if(z->readq) 41*368c31abSDavid du Colombier _vtqhangup(z->readq); 42*368c31abSDavid du Colombier if(z->writeq) 43*368c31abSDavid du Colombier _vtqhangup(z->writeq); 44*368c31abSDavid du Colombier rsleep(&z->rpcfork); 45*368c31abSDavid du Colombier } 46*368c31abSDavid du Colombier packetfree(z->part); 47*368c31abSDavid du Colombier vtfree(z->version); 48*368c31abSDavid du Colombier vtfree(z->sid); 49*368c31abSDavid du Colombier qunlock(&z->lk); 50*368c31abSDavid du Colombier vtfree(z); 51*368c31abSDavid du Colombier } 52