#include "std.h"
#include "dat.h"

static Ioproc *cache[5];
static int ncache;

static Ioproc*
xioproc(void)
{
	Ioproc *c;
	int i;
	
	for(i=0; i<ncache; i++){
		if(c = cache[i]){
			cache[i] = nil;
			return c;
		}
	}

	return ioproc();
}

static void
closexioproc(Ioproc *io)
{
	int i;

	for(i=0; i<ncache; i++)
		if(cache[i] == nil){
			cache[i] = io;
			return;
		}

	closeioproc(io);
}

int
xiodial(char *ds, char *local, char *dir, int *cfdp)
{
	int fd;
	Ioproc *io;

	if((io = xioproc()) == nil)
		return -1;
	fd = iodial(io, ds, local, dir, cfdp);
	closexioproc(io);
	return fd;
}

void
xioclose(int fd)
{
	Ioproc *io;

	if((io = xioproc()) == nil){
		close(fd);
		return;
	}

	ioclose(io, fd);
	closexioproc(io);
}

int
xiowrite(int fd, void *v, int n)
{
	int m;
	Ioproc *io;

	if((io = xioproc()) == nil)
		return -1;
	m = iowrite(io, fd, v, n);
	closexioproc(io);
	if(m != n)
		return -1;
	return n;
}

static long
_ioauthdial(va_list *arg)
{
	char *net;
	char *dom;
	int fd;

	net = va_arg(*arg, char*);
	dom = va_arg(*arg, char*);
	fd = _authdial(net, dom);
	if(fd < 0)
		fprint(2, "authdial: %r");
	return fd;
}

int
xioauthdial(char *net, char *dom)
{
	int fd;
	Ioproc *io;

	if((io = xioproc()) == nil)
		return -1;
	fd = iocall(io, _ioauthdial, net, dom);
	closexioproc(io);
	return fd;
}

static long
_ioasrdresp(va_list *arg)
{
	int fd;
	void *a;
	int n;

	fd = va_arg(*arg, int);
	a = va_arg(*arg, void*);
	n = va_arg(*arg, int);

	return _asrdresp(fd, a, n);
}

int
xioasrdresp(int fd, void *a, int n)
{
	Ioproc *io;

	if((io = xioproc()) == nil)
		return -1;

	n = iocall(io, _ioasrdresp, fd, a, n);
	closexioproc(io);
	return n;
}

static long
_ioasgetticket(va_list *arg)
{
	int asfd;
	char *trbuf;
	char *tbuf;

	asfd = va_arg(*arg, int);
	trbuf = va_arg(*arg, char*);
	tbuf = va_arg(*arg, char*);

	return _asgetticket(asfd, trbuf, tbuf);
}

int
xioasgetticket(int fd, char *trbuf, char *tbuf)
{
	int n;
	Ioproc *io;

	if((io = xioproc()) == nil)
		return -1;

	n = iocall(io, _ioasgetticket, fd, trbuf, tbuf);
	closexioproc(io);
	if(n != 2*TICKETLEN)
		n = -1;
	else
		n = 0;
	return n;
}

