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