xio.c (2116B)
1 #include "std.h" 2 #include "dat.h" 3 4 static Ioproc *cache[5]; 5 static int ncache; 6 7 static Ioproc* 8 xioproc(void) 9 { 10 Ioproc *c; 11 int i; 12 13 for(i=0; i<ncache; i++){ 14 if(c = cache[i]){ 15 cache[i] = nil; 16 return c; 17 } 18 } 19 20 return ioproc(); 21 } 22 23 static void 24 closexioproc(Ioproc *io) 25 { 26 int i; 27 28 for(i=0; i<ncache; i++) 29 if(cache[i] == nil){ 30 cache[i] = io; 31 return; 32 } 33 34 closeioproc(io); 35 } 36 37 int 38 xiodial(char *ds, char *local, char *dir, int *cfdp) 39 { 40 int fd; 41 Ioproc *io; 42 43 if((io = xioproc()) == nil) 44 return -1; 45 fd = iodial(io, ds, local, dir, cfdp); 46 closexioproc(io); 47 return fd; 48 } 49 50 void 51 xioclose(int fd) 52 { 53 Ioproc *io; 54 55 if((io = xioproc()) == nil){ 56 close(fd); 57 return; 58 } 59 60 ioclose(io, fd); 61 closexioproc(io); 62 } 63 64 int 65 xiowrite(int fd, void *v, int n) 66 { 67 int m; 68 Ioproc *io; 69 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 } 78 79 static long 80 _ioauthdial(va_list *arg) 81 { 82 char *net; 83 char *dom; 84 int fd; 85 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\n"); 91 return fd; 92 } 93 94 int 95 xioauthdial(char *net, char *dom) 96 { 97 int fd; 98 Ioproc *io; 99 100 if((io = xioproc()) == nil) 101 return -1; 102 fd = iocall(io, _ioauthdial, net, dom); 103 closexioproc(io); 104 return fd; 105 } 106 107 static long 108 _ioasrdresp(va_list *arg) 109 { 110 int fd; 111 void *a; 112 int n; 113 114 fd = va_arg(*arg, int); 115 a = va_arg(*arg, void*); 116 n = va_arg(*arg, int); 117 118 return _asrdresp(fd, a, n); 119 } 120 121 int 122 xioasrdresp(int fd, void *a, int n) 123 { 124 Ioproc *io; 125 126 if((io = xioproc()) == nil) 127 return -1; 128 129 n = iocall(io, _ioasrdresp, fd, a, n); 130 closexioproc(io); 131 return n; 132 } 133 134 static long 135 _ioasgetticket(va_list *arg) 136 { 137 int asfd; 138 char *trbuf; 139 char *tbuf; 140 141 asfd = va_arg(*arg, int); 142 trbuf = va_arg(*arg, char*); 143 tbuf = va_arg(*arg, char*); 144 145 return _asgetticket(asfd, trbuf, tbuf); 146 } 147 148 int 149 xioasgetticket(int fd, char *trbuf, char *tbuf) 150 { 151 int n; 152 Ioproc *io; 153 154 if((io = xioproc()) == nil) 155 return -1; 156 157 n = iocall(io, _ioasgetticket, fd, trbuf, tbuf); 158 closexioproc(io); 159 if(n != 2*TICKETLEN) 160 n = -1; 161 else 162 n = 0; 163 return n; 164 }