xref: /plan9-contrib/sys/src/libventi/conn.c (revision 6021a96baaeac9e871b46f21935cdb441d5129f6)
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