Blob
1 #include "std.h"2 #include "dat.h"4 static Ioproc *cache[5];5 static int ncache;7 static Ioproc*8 xioproc(void)9 {10 Ioproc *c;11 int i;13 for(i=0; i<ncache; i++){14 if(c = cache[i]){15 cache[i] = nil;16 return c;17 }18 }20 return ioproc();21 }23 static void24 closexioproc(Ioproc *io)25 {26 int i;28 for(i=0; i<ncache; i++)29 if(cache[i] == nil){30 cache[i] = io;31 return;32 }34 closeioproc(io);35 }37 int38 xiodial(char *ds, char *local, char *dir, int *cfdp)39 {40 int fd;41 Ioproc *io;43 if((io = xioproc()) == nil)44 return -1;45 fd = iodial(io, ds, local, dir, cfdp);46 closexioproc(io);47 return fd;48 }50 void51 xioclose(int fd)52 {53 Ioproc *io;55 if((io = xioproc()) == nil){56 close(fd);57 return;58 }60 ioclose(io, fd);61 closexioproc(io);62 }64 int65 xiowrite(int fd, void *v, int n)66 {67 int m;68 Ioproc *io;70 if((io = xioproc()) == nil)71 return -1;72 m = iowrite(io, fd, v, n);73 closexioproc(io);74 if(m != n)75 return -1;76 return n;77 }79 static long80 _ioauthdial(va_list *arg)81 {82 char *net;83 char *dom;84 int fd;86 net = va_arg(*arg, char*);87 dom = va_arg(*arg, char*);88 fd = _authdial(net, dom);89 if(fd < 0)90 fprint(2, "authdial: %r");91 return fd;92 }94 int95 xioauthdial(char *net, char *dom)96 {97 int fd;98 Ioproc *io;100 if((io = xioproc()) == nil)101 return -1;102 fd = iocall(io, _ioauthdial, net, dom);103 closexioproc(io);104 return fd;105 }107 static long108 _ioasrdresp(va_list *arg)109 {110 int fd;111 void *a;112 int n;114 fd = va_arg(*arg, int);115 a = va_arg(*arg, void*);116 n = va_arg(*arg, int);118 return _asrdresp(fd, a, n);119 }121 int122 xioasrdresp(int fd, void *a, int n)123 {124 Ioproc *io;126 if((io = xioproc()) == nil)127 return -1;129 n = iocall(io, _ioasrdresp, fd, a, n);130 closexioproc(io);131 return n;132 }134 static long135 _ioasgetticket(va_list *arg)136 {137 int asfd;138 char *trbuf;139 char *tbuf;141 asfd = va_arg(*arg, int);142 trbuf = va_arg(*arg, char*);143 tbuf = va_arg(*arg, char*);145 return _asgetticket(asfd, trbuf, tbuf);146 }148 int149 xioasgetticket(int fd, char *trbuf, char *tbuf)150 {151 int n;152 Ioproc *io;154 if((io = xioproc()) == nil)155 return -1;157 n = iocall(io, _ioasgetticket, fd, trbuf, tbuf);158 closexioproc(io);159 if(n != 2*TICKETLEN)160 n = -1;161 else162 n = 0;163 return n;164 }