ref: 7742661aebb96a26f1cb34a68bcf631065913806
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; } 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); }