ref: d9b9e15d6bbdae625b3613bb0a704d269cc83098
dir: /sys/src/libventi/conn.c/
#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; } 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); }