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 int
31 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 void
53 vtfreeconn(VtConn *z)
54 {
55 vthangup(z);
56 qlock(&z->lk);
57 /*
58 * Wait for send and recv procs to notice
59 * 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 }