1368c31abSDavid du Colombier #include <u.h>
2368c31abSDavid du Colombier #include <libc.h>
3368c31abSDavid du Colombier #include <venti.h>
4368c31abSDavid du Colombier #include "queue.h"
5368c31abSDavid du Colombier
6368c31abSDavid du Colombier int chattyventi;
7368c31abSDavid du Colombier
8368c31abSDavid du Colombier VtConn*
vtconn(int infd,int outfd)9368c31abSDavid du Colombier vtconn(int infd, int outfd)
10368c31abSDavid du Colombier {
11368c31abSDavid du Colombier VtConn *z;
12368c31abSDavid du Colombier NetConnInfo *nci;
13368c31abSDavid du Colombier
14368c31abSDavid du Colombier z = vtmallocz(sizeof(VtConn));
15368c31abSDavid du Colombier z->tagrend.l = &z->lk;
16368c31abSDavid du Colombier z->rpcfork.l = &z->lk;
17368c31abSDavid du Colombier z->infd = infd;
18368c31abSDavid du Colombier z->outfd = outfd;
19368c31abSDavid du Colombier z->part = packetalloc();
20368c31abSDavid du Colombier nci = getnetconninfo(nil, infd);
21368c31abSDavid du Colombier if(nci == nil)
22368c31abSDavid du Colombier snprint(z->addr, sizeof z->addr, "/dev/fd/%d", infd);
23368c31abSDavid du Colombier else{
24368c31abSDavid du Colombier strecpy(z->addr, z->addr+sizeof z->addr, nci->raddr);
25368c31abSDavid du Colombier freenetconninfo(nci);
26368c31abSDavid du Colombier }
27368c31abSDavid du Colombier return z;
28368c31abSDavid du Colombier }
29368c31abSDavid du Colombier
30*6021a96bSDavid du Colombier int
vtreconn(VtConn * z,int infd,int outfd)31*6021a96bSDavid du Colombier vtreconn(VtConn *z, int infd, int outfd)
32*6021a96bSDavid du Colombier {
33*6021a96bSDavid du Colombier NetConnInfo *nci;
34*6021a96bSDavid du Colombier
35*6021a96bSDavid du Colombier z->state = VtStateAlloc;
36*6021a96bSDavid du Colombier if(z->infd >= 0)
37*6021a96bSDavid du Colombier close(z->infd);
38*6021a96bSDavid du Colombier z->infd = infd;
39*6021a96bSDavid du Colombier if(z->outfd >= 0)
40*6021a96bSDavid du Colombier close(z->outfd);
41*6021a96bSDavid du Colombier z->outfd = outfd;
42*6021a96bSDavid du Colombier nci = getnetconninfo(nil, infd);
43*6021a96bSDavid du Colombier if(nci == nil)
44*6021a96bSDavid du Colombier snprint(z->addr, sizeof z->addr, "/dev/fd/%d", infd);
45*6021a96bSDavid du Colombier else{
46*6021a96bSDavid du Colombier strecpy(z->addr, z->addr+sizeof z->addr, nci->raddr);
47*6021a96bSDavid du Colombier freenetconninfo(nci);
48*6021a96bSDavid du Colombier }
49*6021a96bSDavid du Colombier return 0;
50*6021a96bSDavid du Colombier }
51*6021a96bSDavid du Colombier
52368c31abSDavid du Colombier void
vtfreeconn(VtConn * z)53368c31abSDavid du Colombier vtfreeconn(VtConn *z)
54368c31abSDavid du Colombier {
55368c31abSDavid du Colombier vthangup(z);
56368c31abSDavid du Colombier qlock(&z->lk);
57368c31abSDavid du Colombier /*
58368c31abSDavid du Colombier * Wait for send and recv procs to notice
59368c31abSDavid du Colombier * the hangup and clear out the queues.
60368c31abSDavid du Colombier */
61368c31abSDavid du Colombier while(z->readq || z->writeq){
62368c31abSDavid du Colombier if(z->readq)
63368c31abSDavid du Colombier _vtqhangup(z->readq);
64368c31abSDavid du Colombier if(z->writeq)
65368c31abSDavid du Colombier _vtqhangup(z->writeq);
66368c31abSDavid du Colombier rsleep(&z->rpcfork);
67368c31abSDavid du Colombier }
68368c31abSDavid du Colombier packetfree(z->part);
69368c31abSDavid du Colombier vtfree(z->version);
70368c31abSDavid du Colombier vtfree(z->sid);
71368c31abSDavid du Colombier qunlock(&z->lk);
72368c31abSDavid du Colombier vtfree(z);
73368c31abSDavid du Colombier }
74