#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\n");
	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;
}

