73 lines
1.3 KiB
C
73 lines
1.3 KiB
C
#include <u.h>
|
|
#include <libc.h>
|
|
#include <venti.h>
|
|
#include "queue.h"
|
|
|
|
int chattyventi;
|
|
|
|
VtConn*
|
|
vtconn(int infd, int outfd)
|
|
{
|
|
VtConn *z;
|
|
NetConnInfo *nci;
|
|
|
|
z = vtmallocz(sizeof(VtConn));
|
|
z->tagrend.l = &z->lk;
|
|
z->rpcfork.l = &z->lk;
|
|
z->infd = infd;
|
|
z->outfd = outfd;
|
|
z->part = packetalloc();
|
|
nci = getnetconninfo(nil, infd);
|
|
if(nci == nil)
|
|
snprint(z->addr, sizeof z->addr, "/dev/fd/%d", infd);
|
|
else{
|
|
strecpy(z->addr, z->addr+sizeof z->addr, nci->raddr);
|
|
freenetconninfo(nci);
|
|
}
|
|
return z;
|
|
}
|
|
|
|
int
|
|
vtreconn(VtConn *z, int infd, int outfd)
|
|
{
|
|
NetConnInfo *nci;
|
|
|
|
z->state = VtStateAlloc;
|
|
if(z->infd >= 0)
|
|
close(z->infd);
|
|
z->infd = infd;
|
|
if(z->outfd >= 0)
|
|
close(z->outfd);
|
|
z->outfd = outfd;
|
|
nci = getnetconninfo(nil, infd);
|
|
if(nci == nil)
|
|
snprint(z->addr, sizeof z->addr, "/dev/fd/%d", infd);
|
|
else{
|
|
strecpy(z->addr, z->addr+sizeof z->addr, nci->raddr);
|
|
freenetconninfo(nci);
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
void
|
|
vtfreeconn(VtConn *z)
|
|
{
|
|
vthangup(z);
|
|
qlock(&z->lk);
|
|
/*
|
|
* Wait for send and recv procs to notice
|
|
* the hangup and clear out the queues.
|
|
*/
|
|
while(z->readq || z->writeq){
|
|
if(z->readq)
|
|
_vtqhangup(z->readq);
|
|
if(z->writeq)
|
|
_vtqhangup(z->writeq);
|
|
rsleep(&z->rpcfork);
|
|
}
|
|
packetfree(z->part);
|
|
vtfree(z->version);
|
|
vtfree(z->sid);
|
|
qunlock(&z->lk);
|
|
vtfree(z);
|
|
}
|