Blob
1 #include <u.h>2 #include <libc.h>3 #include <venti.h>4 #include "queue.h"6 int chattyventi;8 VtConn*9 vtconn(int infd, int outfd)10 {11 VtConn *z;12 NetConnInfo *nci;14 z = vtmallocz(sizeof(VtConn));15 z->tagrend.l = &z->lk;16 z->rpcfork.l = &z->lk;17 z->infd = infd;18 z->outfd = outfd;19 z->part = packetalloc();20 nci = getnetconninfo(nil, infd);21 if(nci == nil)22 snprint(z->addr, sizeof z->addr, "/dev/fd/%d", infd);23 else{24 strecpy(z->addr, z->addr+sizeof z->addr, nci->raddr);25 freenetconninfo(nci);26 }27 return z;28 }30 int31 vtreconn(VtConn *z, int infd, int outfd)32 {33 NetConnInfo *nci;35 z->state = VtStateAlloc;36 if(z->infd >= 0)37 close(z->infd);38 z->infd = infd;39 if(z->outfd >= 0)40 close(z->outfd);41 z->outfd = outfd;42 nci = getnetconninfo(nil, infd);43 if(nci == nil)44 snprint(z->addr, sizeof z->addr, "/dev/fd/%d", infd);45 else{46 strecpy(z->addr, z->addr+sizeof z->addr, nci->raddr);47 freenetconninfo(nci);48 }49 return 0;50 }52 void53 vtfreeconn(VtConn *z)54 {55 vthangup(z);56 qlock(&z->lk);57 /*58 * Wait for send and recv procs to notice59 * the hangup and clear out the queues.60 */61 while(z->readq || z->writeq){62 if(z->readq)63 _vtqhangup(z->readq);64 if(z->writeq)65 _vtqhangup(z->writeq);66 rsleep(&z->rpcfork);67 }68 packetfree(z->part);69 vtfree(z->version);70 vtfree(z->sid);71 qunlock(&z->lk);72 vtfree(z);73 }