#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; }