xref: /plan9/sys/src/libventi/conn.c (revision 368c31ab13393dea083228fdd1c3445076f83a4b)
1*368c31abSDavid du Colombier #include <u.h>
2*368c31abSDavid du Colombier #include <libc.h>
3*368c31abSDavid du Colombier #include <venti.h>
4*368c31abSDavid du Colombier #include "queue.h"
5*368c31abSDavid du Colombier 
6*368c31abSDavid du Colombier int chattyventi;
7*368c31abSDavid du Colombier 
8*368c31abSDavid du Colombier VtConn*
vtconn(int infd,int outfd)9*368c31abSDavid du Colombier vtconn(int infd, int outfd)
10*368c31abSDavid du Colombier {
11*368c31abSDavid du Colombier 	VtConn *z;
12*368c31abSDavid du Colombier 	NetConnInfo *nci;
13*368c31abSDavid du Colombier 
14*368c31abSDavid du Colombier 	z = vtmallocz(sizeof(VtConn));
15*368c31abSDavid du Colombier 	z->tagrend.l = &z->lk;
16*368c31abSDavid du Colombier 	z->rpcfork.l = &z->lk;
17*368c31abSDavid du Colombier 	z->infd = infd;
18*368c31abSDavid du Colombier 	z->outfd = outfd;
19*368c31abSDavid du Colombier 	z->part = packetalloc();
20*368c31abSDavid du Colombier 	nci = getnetconninfo(nil, infd);
21*368c31abSDavid du Colombier 	if(nci == nil)
22*368c31abSDavid du Colombier 		snprint(z->addr, sizeof z->addr, "/dev/fd/%d", infd);
23*368c31abSDavid du Colombier 	else{
24*368c31abSDavid du Colombier 		strecpy(z->addr, z->addr+sizeof z->addr, nci->raddr);
25*368c31abSDavid du Colombier 		freenetconninfo(nci);
26*368c31abSDavid du Colombier 	}
27*368c31abSDavid du Colombier 	return z;
28*368c31abSDavid du Colombier }
29*368c31abSDavid du Colombier 
30*368c31abSDavid du Colombier void
vtfreeconn(VtConn * z)31*368c31abSDavid du Colombier vtfreeconn(VtConn *z)
32*368c31abSDavid du Colombier {
33*368c31abSDavid du Colombier 	vthangup(z);
34*368c31abSDavid du Colombier 	qlock(&z->lk);
35*368c31abSDavid du Colombier 	/*
36*368c31abSDavid du Colombier 	 * Wait for send and recv procs to notice
37*368c31abSDavid du Colombier 	 * the hangup and clear out the queues.
38*368c31abSDavid du Colombier 	 */
39*368c31abSDavid du Colombier 	while(z->readq || z->writeq){
40*368c31abSDavid du Colombier 		if(z->readq)
41*368c31abSDavid du Colombier 			_vtqhangup(z->readq);
42*368c31abSDavid du Colombier 		if(z->writeq)
43*368c31abSDavid du Colombier 			_vtqhangup(z->writeq);
44*368c31abSDavid du Colombier 		rsleep(&z->rpcfork);
45*368c31abSDavid du Colombier 	}
46*368c31abSDavid du Colombier 	packetfree(z->part);
47*368c31abSDavid du Colombier 	vtfree(z->version);
48*368c31abSDavid du Colombier 	vtfree(z->sid);
49*368c31abSDavid du Colombier 	qunlock(&z->lk);
50*368c31abSDavid du Colombier 	vtfree(z);
51*368c31abSDavid du Colombier }
52