txio.c - plan9port - [fork] Plan 9 from user space
HTML git clone git://src.adamsgaard.dk/plan9port
DIR Log
DIR Files
DIR Refs
DIR README
DIR LICENSE
---
txio.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 }