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 void
24 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 int
38 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 void
51 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 int
65 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 long
80 _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 int
95 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;
107 static long
108 _ioasrdresp(va_list *arg)
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);
121 int
122 xioasrdresp(int fd, void *a, int n)
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;
134 static long
135 _ioasgetticket(va_list *arg)
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);
148 int
149 xioasgetticket(int fd, char *trbuf, char *tbuf)
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 else
162 n = 0;
163 return n;