Blame


1 f3b8bf7f 2006-05-25 devnull #include <u.h>
2 f3b8bf7f 2006-05-25 devnull #include <libc.h>
3 f3b8bf7f 2006-05-25 devnull #include <thread.h>
4 f3b8bf7f 2006-05-25 devnull #include <9pclient.h>
5 f3b8bf7f 2006-05-25 devnull #include <acme.h>
6 f3b8bf7f 2006-05-25 devnull
7 f3b8bf7f 2006-05-25 devnull static CFsys *acmefs;
8 f3b8bf7f 2006-05-25 devnull static Win *windows;
9 f3b8bf7f 2006-05-25 devnull static Win *last;
10 f3b8bf7f 2006-05-25 devnull
11 f3b8bf7f 2006-05-25 devnull static void
12 f3b8bf7f 2006-05-25 devnull mountacme(void)
13 f3b8bf7f 2006-05-25 devnull {
14 f3b8bf7f 2006-05-25 devnull if(acmefs == nil){
15 f3b8bf7f 2006-05-25 devnull acmefs = nsmount("acme", nil);
16 f3b8bf7f 2006-05-25 devnull if(acmefs == nil)
17 f3b8bf7f 2006-05-25 devnull sysfatal("cannot mount acme: %r");
18 f3b8bf7f 2006-05-25 devnull }
19 f3b8bf7f 2006-05-25 devnull }
20 f3b8bf7f 2006-05-25 devnull
21 f3b8bf7f 2006-05-25 devnull Win*
22 f3b8bf7f 2006-05-25 devnull newwin(void)
23 f3b8bf7f 2006-05-25 devnull {
24 f3b8bf7f 2006-05-25 devnull CFid *fid;
25 f3b8bf7f 2006-05-25 devnull char buf[100];
26 f3b8bf7f 2006-05-25 devnull int id, n;
27 f3b8bf7f 2006-05-25 devnull
28 f3b8bf7f 2006-05-25 devnull mountacme();
29 f3b8bf7f 2006-05-25 devnull fid = fsopen(acmefs, "new/ctl", ORDWR);
30 f3b8bf7f 2006-05-25 devnull if(fid == nil)
31 f3b8bf7f 2006-05-25 devnull sysfatal("open new/ctl: %r");
32 f3b8bf7f 2006-05-25 devnull n = fsread(fid, buf, sizeof buf-1);
33 f3b8bf7f 2006-05-25 devnull if(n <= 0)
34 f3b8bf7f 2006-05-25 devnull sysfatal("read new/ctl: %r");
35 f3b8bf7f 2006-05-25 devnull buf[n] = 0;
36 f3b8bf7f 2006-05-25 devnull id = atoi(buf);
37 f3b8bf7f 2006-05-25 devnull if(id == 0)
38 f3b8bf7f 2006-05-25 devnull sysfatal("read new/ctl: malformed message: %s", buf);
39 f3b8bf7f 2006-05-25 devnull
40 f3b8bf7f 2006-05-25 devnull return openwin(id, fid);
41 f3b8bf7f 2006-05-25 devnull }
42 f3b8bf7f 2006-05-25 devnull
43 f3b8bf7f 2006-05-25 devnull Win*
44 f3b8bf7f 2006-05-25 devnull openwin(int id, CFid *ctl)
45 f3b8bf7f 2006-05-25 devnull {
46 f3b8bf7f 2006-05-25 devnull char buf[100];
47 f3b8bf7f 2006-05-25 devnull Win *w;
48 fa325e9b 2020-01-10 cross
49 f3b8bf7f 2006-05-25 devnull mountacme();
50 f3b8bf7f 2006-05-25 devnull if(ctl == nil){
51 f3b8bf7f 2006-05-25 devnull snprint(buf, sizeof buf, "%d/ctl", id);
52 f3b8bf7f 2006-05-25 devnull if((ctl = fsopen(acmefs, buf, ORDWR)) == nil)
53 f3b8bf7f 2006-05-25 devnull sysfatal("open %s: %r", buf);
54 f3b8bf7f 2006-05-25 devnull }
55 f3b8bf7f 2006-05-25 devnull w = emalloc(sizeof *w);
56 f3b8bf7f 2006-05-25 devnull w->id = id;
57 f3b8bf7f 2006-05-25 devnull w->ctl = ctl;
58 f3b8bf7f 2006-05-25 devnull w->next = nil;
59 f3b8bf7f 2006-05-25 devnull w->prev = last;
60 f3b8bf7f 2006-05-25 devnull if(last)
61 f3b8bf7f 2006-05-25 devnull last->next = w;
62 f3b8bf7f 2006-05-25 devnull else
63 f3b8bf7f 2006-05-25 devnull windows = w;
64 f3b8bf7f 2006-05-25 devnull last = w;
65 f3b8bf7f 2006-05-25 devnull return w;
66 f3b8bf7f 2006-05-25 devnull }
67 f3b8bf7f 2006-05-25 devnull
68 f3b8bf7f 2006-05-25 devnull void
69 f3b8bf7f 2006-05-25 devnull winclosefiles(Win *w)
70 f3b8bf7f 2006-05-25 devnull {
71 f3b8bf7f 2006-05-25 devnull if(w->ctl){
72 f3b8bf7f 2006-05-25 devnull fsclose(w->ctl);
73 f3b8bf7f 2006-05-25 devnull w->ctl = nil;
74 f3b8bf7f 2006-05-25 devnull }
75 f3b8bf7f 2006-05-25 devnull if(w->body){
76 f3b8bf7f 2006-05-25 devnull fsclose(w->body);
77 f3b8bf7f 2006-05-25 devnull w->body = nil;
78 f3b8bf7f 2006-05-25 devnull }
79 f3b8bf7f 2006-05-25 devnull if(w->addr){
80 f3b8bf7f 2006-05-25 devnull fsclose(w->addr);
81 f3b8bf7f 2006-05-25 devnull w->addr = nil;
82 f3b8bf7f 2006-05-25 devnull }
83 f3b8bf7f 2006-05-25 devnull if(w->tag){
84 f3b8bf7f 2006-05-25 devnull fsclose(w->tag);
85 f3b8bf7f 2006-05-25 devnull w->tag = nil;
86 f3b8bf7f 2006-05-25 devnull }
87 f3b8bf7f 2006-05-25 devnull if(w->event){
88 f3b8bf7f 2006-05-25 devnull fsclose(w->event);
89 f3b8bf7f 2006-05-25 devnull w->event = nil;
90 f3b8bf7f 2006-05-25 devnull }
91 f3b8bf7f 2006-05-25 devnull if(w->data){
92 f3b8bf7f 2006-05-25 devnull fsclose(w->data);
93 f3b8bf7f 2006-05-25 devnull w->data = nil;
94 f3b8bf7f 2006-05-25 devnull }
95 f3b8bf7f 2006-05-25 devnull if(w->xdata){
96 f3b8bf7f 2006-05-25 devnull fsclose(w->xdata);
97 f3b8bf7f 2006-05-25 devnull w->xdata = nil;
98 f3b8bf7f 2006-05-25 devnull }
99 f3b8bf7f 2006-05-25 devnull }
100 f3b8bf7f 2006-05-25 devnull
101 f3b8bf7f 2006-05-25 devnull void
102 f3b8bf7f 2006-05-25 devnull winfree(Win *w)
103 f3b8bf7f 2006-05-25 devnull {
104 f3b8bf7f 2006-05-25 devnull winclosefiles(w);
105 f3b8bf7f 2006-05-25 devnull if(w->c){
106 f3b8bf7f 2006-05-25 devnull chanfree(w->c);
107 f3b8bf7f 2006-05-25 devnull w->c = nil;
108 f3b8bf7f 2006-05-25 devnull }
109 f3b8bf7f 2006-05-25 devnull if(w->next)
110 f3b8bf7f 2006-05-25 devnull w->next->prev = w->prev;
111 f3b8bf7f 2006-05-25 devnull else
112 f3b8bf7f 2006-05-25 devnull last = w->prev;
113 f3b8bf7f 2006-05-25 devnull if(w->prev)
114 f3b8bf7f 2006-05-25 devnull w->prev->next = w->next;
115 f3b8bf7f 2006-05-25 devnull else
116 f3b8bf7f 2006-05-25 devnull windows = w->next;
117 f3b8bf7f 2006-05-25 devnull free(w);
118 f3b8bf7f 2006-05-25 devnull }
119 f3b8bf7f 2006-05-25 devnull
120 f3b8bf7f 2006-05-25 devnull void
121 f3b8bf7f 2006-05-25 devnull windeleteall(void)
122 f3b8bf7f 2006-05-25 devnull {
123 f3b8bf7f 2006-05-25 devnull Win *w, *next;
124 f3b8bf7f 2006-05-25 devnull
125 f3b8bf7f 2006-05-25 devnull for(w=windows; w; w=next){
126 f3b8bf7f 2006-05-25 devnull next = w->next;
127 f3b8bf7f 2006-05-25 devnull winctl(w, "delete");
128 f3b8bf7f 2006-05-25 devnull }
129 f3b8bf7f 2006-05-25 devnull }
130 f3b8bf7f 2006-05-25 devnull
131 f3b8bf7f 2006-05-25 devnull static CFid*
132 f3b8bf7f 2006-05-25 devnull wfid(Win *w, char *name)
133 f3b8bf7f 2006-05-25 devnull {
134 f3b8bf7f 2006-05-25 devnull char buf[100];
135 f3b8bf7f 2006-05-25 devnull CFid **fid;
136 f3b8bf7f 2006-05-25 devnull
137 f3b8bf7f 2006-05-25 devnull if(strcmp(name, "ctl") == 0)
138 f3b8bf7f 2006-05-25 devnull fid = &w->ctl;
139 f3b8bf7f 2006-05-25 devnull else if(strcmp(name, "body") == 0)
140 f3b8bf7f 2006-05-25 devnull fid = &w->body;
141 f3b8bf7f 2006-05-25 devnull else if(strcmp(name, "addr") == 0)
142 f3b8bf7f 2006-05-25 devnull fid = &w->addr;
143 f3b8bf7f 2006-05-25 devnull else if(strcmp(name, "tag") == 0)
144 f3b8bf7f 2006-05-25 devnull fid = &w->tag;
145 f3b8bf7f 2006-05-25 devnull else if(strcmp(name, "event") == 0)
146 f3b8bf7f 2006-05-25 devnull fid = &w->event;
147 f3b8bf7f 2006-05-25 devnull else if(strcmp(name, "data") == 0)
148 f3b8bf7f 2006-05-25 devnull fid = &w->data;
149 f3b8bf7f 2006-05-25 devnull else if(strcmp(name, "xdata") == 0)
150 f3b8bf7f 2006-05-25 devnull fid = &w->xdata;
151 f3b8bf7f 2006-05-25 devnull else{
152 f3b8bf7f 2006-05-25 devnull fid = 0;
153 f3b8bf7f 2006-05-25 devnull sysfatal("bad window file name %s", name);
154 f3b8bf7f 2006-05-25 devnull }
155 f3b8bf7f 2006-05-25 devnull
156 f3b8bf7f 2006-05-25 devnull if(*fid == nil){
157 f3b8bf7f 2006-05-25 devnull snprint(buf, sizeof buf, "acme/%d/%s", w->id, name);
158 f3b8bf7f 2006-05-25 devnull *fid = fsopen(acmefs, buf, ORDWR);
159 f3b8bf7f 2006-05-25 devnull if(*fid == nil)
160 f3b8bf7f 2006-05-25 devnull sysfatal("open %s: %r", buf);
161 f3b8bf7f 2006-05-25 devnull }
162 f3b8bf7f 2006-05-25 devnull return *fid;
163 f3b8bf7f 2006-05-25 devnull }
164 f3b8bf7f 2006-05-25 devnull
165 f3b8bf7f 2006-05-25 devnull int
166 f3b8bf7f 2006-05-25 devnull winopenfd(Win *w, char *name, int mode)
167 f3b8bf7f 2006-05-25 devnull {
168 f3b8bf7f 2006-05-25 devnull char buf[100];
169 fa325e9b 2020-01-10 cross
170 f3b8bf7f 2006-05-25 devnull snprint(buf, sizeof buf, "%d/%s", w->id, name);
171 f3b8bf7f 2006-05-25 devnull return fsopenfd(acmefs, buf, mode);
172 f3b8bf7f 2006-05-25 devnull }
173 f3b8bf7f 2006-05-25 devnull
174 f3b8bf7f 2006-05-25 devnull int
175 f3b8bf7f 2006-05-25 devnull winctl(Win *w, char *fmt, ...)
176 f3b8bf7f 2006-05-25 devnull {
177 f3b8bf7f 2006-05-25 devnull char *s;
178 f3b8bf7f 2006-05-25 devnull va_list arg;
179 f3b8bf7f 2006-05-25 devnull CFid *fid;
180 f3b8bf7f 2006-05-25 devnull int n;
181 f3b8bf7f 2006-05-25 devnull
182 f3b8bf7f 2006-05-25 devnull va_start(arg, fmt);
183 f3b8bf7f 2006-05-25 devnull s = evsmprint(fmt, arg);
184 f3b8bf7f 2006-05-25 devnull va_end(arg);
185 f3b8bf7f 2006-05-25 devnull
186 f3b8bf7f 2006-05-25 devnull fid = wfid(w, "ctl");
187 f3b8bf7f 2006-05-25 devnull n = fspwrite(fid, s, strlen(s), 0);
188 f3b8bf7f 2006-05-25 devnull free(s);
189 f3b8bf7f 2006-05-25 devnull return n;
190 f3b8bf7f 2006-05-25 devnull }
191 f3b8bf7f 2006-05-25 devnull
192 f3b8bf7f 2006-05-25 devnull int
193 f3b8bf7f 2006-05-25 devnull winname(Win *w, char *fmt, ...)
194 f3b8bf7f 2006-05-25 devnull {
195 f3b8bf7f 2006-05-25 devnull char *s;
196 f3b8bf7f 2006-05-25 devnull va_list arg;
197 f3b8bf7f 2006-05-25 devnull int n;
198 f3b8bf7f 2006-05-25 devnull
199 f3b8bf7f 2006-05-25 devnull va_start(arg, fmt);
200 f3b8bf7f 2006-05-25 devnull s = evsmprint(fmt, arg);
201 f3b8bf7f 2006-05-25 devnull va_end(arg);
202 f3b8bf7f 2006-05-25 devnull
203 f3b8bf7f 2006-05-25 devnull n = winctl(w, "name %s\n", s);
204 f3b8bf7f 2006-05-25 devnull free(s);
205 f3b8bf7f 2006-05-25 devnull return n;
206 f3b8bf7f 2006-05-25 devnull }
207 f3b8bf7f 2006-05-25 devnull
208 f3b8bf7f 2006-05-25 devnull int
209 f3b8bf7f 2006-05-25 devnull winprint(Win *w, char *name, char *fmt, ...)
210 f3b8bf7f 2006-05-25 devnull {
211 f3b8bf7f 2006-05-25 devnull char *s;
212 f3b8bf7f 2006-05-25 devnull va_list arg;
213 f3b8bf7f 2006-05-25 devnull int n;
214 f3b8bf7f 2006-05-25 devnull
215 f3b8bf7f 2006-05-25 devnull va_start(arg, fmt);
216 f3b8bf7f 2006-05-25 devnull s = evsmprint(fmt, arg);
217 f3b8bf7f 2006-05-25 devnull va_end(arg);
218 f3b8bf7f 2006-05-25 devnull
219 f3b8bf7f 2006-05-25 devnull n = fswrite(wfid(w, name), s, strlen(s));
220 f3b8bf7f 2006-05-25 devnull free(s);
221 f3b8bf7f 2006-05-25 devnull return n;
222 f3b8bf7f 2006-05-25 devnull }
223 f3b8bf7f 2006-05-25 devnull
224 f3b8bf7f 2006-05-25 devnull int
225 f3b8bf7f 2006-05-25 devnull winaddr(Win *w, char *fmt, ...)
226 f3b8bf7f 2006-05-25 devnull {
227 f3b8bf7f 2006-05-25 devnull char *s;
228 f3b8bf7f 2006-05-25 devnull va_list arg;
229 f3b8bf7f 2006-05-25 devnull int n;
230 f3b8bf7f 2006-05-25 devnull
231 f3b8bf7f 2006-05-25 devnull va_start(arg, fmt);
232 f3b8bf7f 2006-05-25 devnull s = evsmprint(fmt, arg);
233 f3b8bf7f 2006-05-25 devnull va_end(arg);
234 f3b8bf7f 2006-05-25 devnull
235 f3b8bf7f 2006-05-25 devnull n = fswrite(wfid(w, "addr"), s, strlen(s));
236 f3b8bf7f 2006-05-25 devnull free(s);
237 f3b8bf7f 2006-05-25 devnull return n;
238 f3b8bf7f 2006-05-25 devnull }
239 f3b8bf7f 2006-05-25 devnull
240 f3b8bf7f 2006-05-25 devnull int
241 f3b8bf7f 2006-05-25 devnull winreadaddr(Win *w, uint *q1)
242 f3b8bf7f 2006-05-25 devnull {
243 f3b8bf7f 2006-05-25 devnull char buf[40], *p;
244 f3b8bf7f 2006-05-25 devnull uint q0;
245 f3b8bf7f 2006-05-25 devnull int n;
246 fa325e9b 2020-01-10 cross
247 f3b8bf7f 2006-05-25 devnull n = fspread(wfid(w, "addr"), buf, sizeof buf-1, 0);
248 f3b8bf7f 2006-05-25 devnull if(n <= 0)
249 f3b8bf7f 2006-05-25 devnull return -1;
250 f3b8bf7f 2006-05-25 devnull buf[n] = 0;
251 f3b8bf7f 2006-05-25 devnull q0 = strtoul(buf, &p, 10);
252 f3b8bf7f 2006-05-25 devnull if(q1)
253 f3b8bf7f 2006-05-25 devnull *q1 = strtoul(p, nil, 10);
254 f3b8bf7f 2006-05-25 devnull return q0;
255 f3b8bf7f 2006-05-25 devnull }
256 f3b8bf7f 2006-05-25 devnull
257 f3b8bf7f 2006-05-25 devnull int
258 f3b8bf7f 2006-05-25 devnull winread(Win *w, char *file, void *a, int n)
259 f3b8bf7f 2006-05-25 devnull {
260 f3b8bf7f 2006-05-25 devnull return fsread(wfid(w, file), a, n);
261 f3b8bf7f 2006-05-25 devnull }
262 f3b8bf7f 2006-05-25 devnull
263 f3b8bf7f 2006-05-25 devnull int
264 f3b8bf7f 2006-05-25 devnull winwrite(Win *w, char *file, void *a, int n)
265 f3b8bf7f 2006-05-25 devnull {
266 f3b8bf7f 2006-05-25 devnull return fswrite(wfid(w, file), a, n);
267 f3b8bf7f 2006-05-25 devnull }
268 f3b8bf7f 2006-05-25 devnull
269 f3b8bf7f 2006-05-25 devnull char*
270 f3b8bf7f 2006-05-25 devnull winmread(Win *w, char *file)
271 f3b8bf7f 2006-05-25 devnull {
272 f3b8bf7f 2006-05-25 devnull char *buf;
273 f3b8bf7f 2006-05-25 devnull int n, tot, m;
274 fa325e9b 2020-01-10 cross
275 f3b8bf7f 2006-05-25 devnull m = 128;
276 f3b8bf7f 2006-05-25 devnull buf = emalloc(m+1);
277 f3b8bf7f 2006-05-25 devnull tot = 0;
278 f3b8bf7f 2006-05-25 devnull while((n = fsread(wfid(w, file), buf+tot, m-tot)) > 0){
279 f3b8bf7f 2006-05-25 devnull tot += n;
280 f3b8bf7f 2006-05-25 devnull if(tot >= m){
281 f3b8bf7f 2006-05-25 devnull m += 128;
282 f3b8bf7f 2006-05-25 devnull buf = erealloc(buf, m+1);
283 f3b8bf7f 2006-05-25 devnull }
284 f3b8bf7f 2006-05-25 devnull }
285 f3b8bf7f 2006-05-25 devnull if(n < 0){
286 f3b8bf7f 2006-05-25 devnull free(buf);
287 f3b8bf7f 2006-05-25 devnull return nil;
288 f3b8bf7f 2006-05-25 devnull }
289 f3b8bf7f 2006-05-25 devnull buf[tot] = 0;
290 f3b8bf7f 2006-05-25 devnull return buf;
291 f3b8bf7f 2006-05-25 devnull }
292 f3b8bf7f 2006-05-25 devnull
293 f3b8bf7f 2006-05-25 devnull int
294 f3b8bf7f 2006-05-25 devnull winseek(Win *w, char *file, int n, int off)
295 f3b8bf7f 2006-05-25 devnull {
296 f3b8bf7f 2006-05-25 devnull return fsseek(wfid(w, file), n, off);
297 f3b8bf7f 2006-05-25 devnull }
298 f3b8bf7f 2006-05-25 devnull
299 f3b8bf7f 2006-05-25 devnull int
300 f3b8bf7f 2006-05-25 devnull winwriteevent(Win *w, Event *e)
301 f3b8bf7f 2006-05-25 devnull {
302 f3b8bf7f 2006-05-25 devnull char buf[100];
303 f3b8bf7f 2006-05-25 devnull
304 f3b8bf7f 2006-05-25 devnull snprint(buf, sizeof buf, "%c%c%d %d \n", e->c1, e->c2, e->q0, e->q1);
305 f3b8bf7f 2006-05-25 devnull return fswrite(wfid(w, "event"), buf, strlen(buf));
306 f3b8bf7f 2006-05-25 devnull }
307 f3b8bf7f 2006-05-25 devnull
308 f3b8bf7f 2006-05-25 devnull int
309 f3b8bf7f 2006-05-25 devnull windel(Win *w, int sure)
310 f3b8bf7f 2006-05-25 devnull {
311 f3b8bf7f 2006-05-25 devnull return winctl(w, sure ? "delete" : "del");
312 f3b8bf7f 2006-05-25 devnull }
313 f3b8bf7f 2006-05-25 devnull
314 f3b8bf7f 2006-05-25 devnull int
315 f3b8bf7f 2006-05-25 devnull winfd(Win *w, char *name, int mode)
316 f3b8bf7f 2006-05-25 devnull {
317 f3b8bf7f 2006-05-25 devnull char buf[100];
318 f3b8bf7f 2006-05-25 devnull
319 f3b8bf7f 2006-05-25 devnull snprint(buf, sizeof buf, "acme/%d/%s", w->id, name);
320 f3b8bf7f 2006-05-25 devnull return fsopenfd(acmefs, buf, mode);
321 f3b8bf7f 2006-05-25 devnull }
322 f3b8bf7f 2006-05-25 devnull
323 f3b8bf7f 2006-05-25 devnull static void
324 f3b8bf7f 2006-05-25 devnull error(Win *w, char *msg)
325 f3b8bf7f 2006-05-25 devnull {
326 f3b8bf7f 2006-05-25 devnull if(msg == nil)
327 f3b8bf7f 2006-05-25 devnull longjmp(w->jmp, 1);
328 f3b8bf7f 2006-05-25 devnull fprint(2, "%s: win%d: %s\n", argv0, w->id, msg);
329 f3b8bf7f 2006-05-25 devnull longjmp(w->jmp, 2);
330 f3b8bf7f 2006-05-25 devnull }
331 f3b8bf7f 2006-05-25 devnull
332 f3b8bf7f 2006-05-25 devnull static int
333 f3b8bf7f 2006-05-25 devnull getec(Win *w, CFid *efd)
334 f3b8bf7f 2006-05-25 devnull {
335 f3b8bf7f 2006-05-25 devnull if(w->nbuf <= 0){
336 f3b8bf7f 2006-05-25 devnull w->nbuf = fsread(efd, w->buf, sizeof w->buf);
337 f3b8bf7f 2006-05-25 devnull if(w->nbuf <= 0)
338 f3b8bf7f 2006-05-25 devnull error(w, nil);
339 f3b8bf7f 2006-05-25 devnull w->bufp = w->buf;
340 f3b8bf7f 2006-05-25 devnull }
341 f3b8bf7f 2006-05-25 devnull --w->nbuf;
342 f3b8bf7f 2006-05-25 devnull return *w->bufp++;
343 f3b8bf7f 2006-05-25 devnull }
344 f3b8bf7f 2006-05-25 devnull
345 f3b8bf7f 2006-05-25 devnull static int
346 f3b8bf7f 2006-05-25 devnull geten(Win *w, CFid *efd)
347 f3b8bf7f 2006-05-25 devnull {
348 f3b8bf7f 2006-05-25 devnull int n, c;
349 f3b8bf7f 2006-05-25 devnull
350 f3b8bf7f 2006-05-25 devnull n = 0;
351 f3b8bf7f 2006-05-25 devnull while('0'<=(c=getec(w,efd)) && c<='9')
352 f3b8bf7f 2006-05-25 devnull n = n*10+(c-'0');
353 f3b8bf7f 2006-05-25 devnull if(c != ' ')
354 f3b8bf7f 2006-05-25 devnull error(w, "event number syntax");
355 f3b8bf7f 2006-05-25 devnull return n;
356 f3b8bf7f 2006-05-25 devnull }
357 f3b8bf7f 2006-05-25 devnull
358 f3b8bf7f 2006-05-25 devnull static int
359 f3b8bf7f 2006-05-25 devnull geter(Win *w, CFid *efd, char *buf, int *nb)
360 f3b8bf7f 2006-05-25 devnull {
361 f3b8bf7f 2006-05-25 devnull Rune r;
362 f3b8bf7f 2006-05-25 devnull int n;
363 f3b8bf7f 2006-05-25 devnull
364 f3b8bf7f 2006-05-25 devnull r = getec(w, efd);
365 f3b8bf7f 2006-05-25 devnull buf[0] = r;
366 f3b8bf7f 2006-05-25 devnull n = 1;
367 f3b8bf7f 2006-05-25 devnull if(r < Runeself)
368 f3b8bf7f 2006-05-25 devnull goto Return;
369 f3b8bf7f 2006-05-25 devnull while(!fullrune(buf, n))
370 f3b8bf7f 2006-05-25 devnull buf[n++] = getec(w, efd);
371 f3b8bf7f 2006-05-25 devnull chartorune(&r, buf);
372 f3b8bf7f 2006-05-25 devnull Return:
373 f3b8bf7f 2006-05-25 devnull *nb = n;
374 f3b8bf7f 2006-05-25 devnull return r;
375 f3b8bf7f 2006-05-25 devnull }
376 f3b8bf7f 2006-05-25 devnull
377 f3b8bf7f 2006-05-25 devnull static void
378 f3b8bf7f 2006-05-25 devnull gete(Win *w, CFid *efd, Event *e)
379 f3b8bf7f 2006-05-25 devnull {
380 f3b8bf7f 2006-05-25 devnull int i, nb;
381 f3b8bf7f 2006-05-25 devnull
382 f3b8bf7f 2006-05-25 devnull e->c1 = getec(w, efd);
383 f3b8bf7f 2006-05-25 devnull e->c2 = getec(w, efd);
384 f3b8bf7f 2006-05-25 devnull e->q0 = geten(w, efd);
385 f3b8bf7f 2006-05-25 devnull e->q1 = geten(w, efd);
386 f3b8bf7f 2006-05-25 devnull e->flag = geten(w, efd);
387 f3b8bf7f 2006-05-25 devnull e->nr = geten(w, efd);
388 f3b8bf7f 2006-05-25 devnull if(e->nr > EVENTSIZE)
389 f3b8bf7f 2006-05-25 devnull error(w, "event string too long");
390 f3b8bf7f 2006-05-25 devnull e->nb = 0;
391 f3b8bf7f 2006-05-25 devnull for(i=0; i<e->nr; i++){
392 f3b8bf7f 2006-05-25 devnull /* e->r[i] = */ geter(w, efd, e->text+e->nb, &nb);
393 f3b8bf7f 2006-05-25 devnull e->nb += nb;
394 f3b8bf7f 2006-05-25 devnull }
395 f3b8bf7f 2006-05-25 devnull /* e->r[e->nr] = 0; */
396 f3b8bf7f 2006-05-25 devnull e->text[e->nb] = 0;
397 f3b8bf7f 2006-05-25 devnull if(getec(w, efd) != '\n')
398 f3b8bf7f 2006-05-25 devnull error(w, "event syntax 2");
399 f3b8bf7f 2006-05-25 devnull }
400 f3b8bf7f 2006-05-25 devnull
401 f3b8bf7f 2006-05-25 devnull int
402 f3b8bf7f 2006-05-25 devnull winreadevent(Win *w, Event *e)
403 f3b8bf7f 2006-05-25 devnull {
404 f3b8bf7f 2006-05-25 devnull CFid *efd;
405 f3b8bf7f 2006-05-25 devnull int r;
406 f3b8bf7f 2006-05-25 devnull
407 f3b8bf7f 2006-05-25 devnull if((r = setjmp(w->jmp)) != 0){
408 f3b8bf7f 2006-05-25 devnull if(r == 1)
409 f3b8bf7f 2006-05-25 devnull return 0;
410 f3b8bf7f 2006-05-25 devnull return -1;
411 f3b8bf7f 2006-05-25 devnull }
412 f3b8bf7f 2006-05-25 devnull efd = wfid(w, "event");
413 f3b8bf7f 2006-05-25 devnull gete(w, efd, e);
414 e074ed0d 2006-06-25 devnull e->oq0 = e->q0;
415 e074ed0d 2006-06-25 devnull e->oq1 = e->q1;
416 f3b8bf7f 2006-05-25 devnull
417 f3b8bf7f 2006-05-25 devnull /* expansion */
418 f3b8bf7f 2006-05-25 devnull if(e->flag&2){
419 f3b8bf7f 2006-05-25 devnull gete(w, efd, &w->e2);
420 f3b8bf7f 2006-05-25 devnull if(e->q0==e->q1){
421 e074ed0d 2006-06-25 devnull w->e2.oq0 = e->q0;
422 e074ed0d 2006-06-25 devnull w->e2.oq1 = e->q1;
423 f3b8bf7f 2006-05-25 devnull w->e2.flag = e->flag;
424 f3b8bf7f 2006-05-25 devnull *e = w->e2;
425 f3b8bf7f 2006-05-25 devnull }
426 f3b8bf7f 2006-05-25 devnull }
427 f3b8bf7f 2006-05-25 devnull
428 f3b8bf7f 2006-05-25 devnull /* chorded argument */
429 f3b8bf7f 2006-05-25 devnull if(e->flag&8){
430 f3b8bf7f 2006-05-25 devnull gete(w, efd, &w->e3); /* arg */
431 f3b8bf7f 2006-05-25 devnull gete(w, efd, &w->e4); /* location */
432 f3b8bf7f 2006-05-25 devnull strcpy(e->arg, w->e3.text);
433 f3b8bf7f 2006-05-25 devnull strcpy(e->loc, w->e4.text);
434 f3b8bf7f 2006-05-25 devnull }
435 f3b8bf7f 2006-05-25 devnull
436 f3b8bf7f 2006-05-25 devnull return 1;
437 f3b8bf7f 2006-05-25 devnull }
438 f3b8bf7f 2006-05-25 devnull
439 f3b8bf7f 2006-05-25 devnull int
440 f3b8bf7f 2006-05-25 devnull eventfmt(Fmt *fmt)
441 f3b8bf7f 2006-05-25 devnull {
442 f3b8bf7f 2006-05-25 devnull Event *e;
443 f3b8bf7f 2006-05-25 devnull
444 f3b8bf7f 2006-05-25 devnull e = va_arg(fmt->args, Event*);
445 f3b8bf7f 2006-05-25 devnull return fmtprint(fmt, "%c%c %d %d %d %d %q", e->c1, e->c2, e->q0, e->q1, e->flag, e->nr, e->text);
446 f3b8bf7f 2006-05-25 devnull }
447 f3b8bf7f 2006-05-25 devnull
448 f3b8bf7f 2006-05-25 devnull void*
449 f3b8bf7f 2006-05-25 devnull emalloc(uint n)
450 f3b8bf7f 2006-05-25 devnull {
451 f3b8bf7f 2006-05-25 devnull void *v;
452 f3b8bf7f 2006-05-25 devnull
453 f3b8bf7f 2006-05-25 devnull v = mallocz(n, 1);
454 f3b8bf7f 2006-05-25 devnull if(v == nil)
455 f3b8bf7f 2006-05-25 devnull sysfatal("out of memory");
456 f3b8bf7f 2006-05-25 devnull return v;
457 f3b8bf7f 2006-05-25 devnull }
458 f3b8bf7f 2006-05-25 devnull
459 f3b8bf7f 2006-05-25 devnull void*
460 f3b8bf7f 2006-05-25 devnull erealloc(void *v, uint n)
461 f3b8bf7f 2006-05-25 devnull {
462 f3b8bf7f 2006-05-25 devnull v = realloc(v, n);
463 f3b8bf7f 2006-05-25 devnull if(v == nil)
464 f3b8bf7f 2006-05-25 devnull sysfatal("out of memory");
465 f3b8bf7f 2006-05-25 devnull return v;
466 f3b8bf7f 2006-05-25 devnull }
467 f3b8bf7f 2006-05-25 devnull
468 f3b8bf7f 2006-05-25 devnull char*
469 f3b8bf7f 2006-05-25 devnull estrdup(char *s)
470 f3b8bf7f 2006-05-25 devnull {
471 f3b8bf7f 2006-05-25 devnull s = strdup(s);
472 f3b8bf7f 2006-05-25 devnull if(s == nil)
473 f3b8bf7f 2006-05-25 devnull sysfatal("out of memory");
474 f3b8bf7f 2006-05-25 devnull return s;
475 f3b8bf7f 2006-05-25 devnull }
476 f3b8bf7f 2006-05-25 devnull
477 f3b8bf7f 2006-05-25 devnull char*
478 f3b8bf7f 2006-05-25 devnull evsmprint(char *s, va_list v)
479 f3b8bf7f 2006-05-25 devnull {
480 f3b8bf7f 2006-05-25 devnull s = vsmprint(s, v);
481 f3b8bf7f 2006-05-25 devnull if(s == nil)
482 f3b8bf7f 2006-05-25 devnull sysfatal("out of memory");
483 f3b8bf7f 2006-05-25 devnull return s;
484 f3b8bf7f 2006-05-25 devnull }
485 f3b8bf7f 2006-05-25 devnull
486 f3b8bf7f 2006-05-25 devnull int
487 f3b8bf7f 2006-05-25 devnull pipewinto(Win *w, char *name, int errto, char *cmd, ...)
488 f3b8bf7f 2006-05-25 devnull {
489 f3b8bf7f 2006-05-25 devnull va_list arg;
490 f3b8bf7f 2006-05-25 devnull char *p;
491 f3b8bf7f 2006-05-25 devnull int fd[3], pid;
492 f3b8bf7f 2006-05-25 devnull
493 f3b8bf7f 2006-05-25 devnull va_start(arg, cmd);
494 f3b8bf7f 2006-05-25 devnull p = evsmprint(cmd, arg);
495 f3b8bf7f 2006-05-25 devnull va_end(arg);
496 f3b8bf7f 2006-05-25 devnull fd[0] = winfd(w, name, OREAD);
497 f3b8bf7f 2006-05-25 devnull fd[1] = dup(errto, -1);
498 f3b8bf7f 2006-05-25 devnull fd[2] = dup(errto, -1);
499 f3b8bf7f 2006-05-25 devnull pid = threadspawnl(fd, "rc", "rc", "-c", p, 0);
500 f3b8bf7f 2006-05-25 devnull free(p);
501 f3b8bf7f 2006-05-25 devnull return pid;
502 f3b8bf7f 2006-05-25 devnull }
503 f3b8bf7f 2006-05-25 devnull
504 f3b8bf7f 2006-05-25 devnull int
505 f3b8bf7f 2006-05-25 devnull pipetowin(Win *w, char *name, int errto, char *cmd, ...)
506 f3b8bf7f 2006-05-25 devnull {
507 f3b8bf7f 2006-05-25 devnull va_list arg;
508 f3b8bf7f 2006-05-25 devnull char *p;
509 f3b8bf7f 2006-05-25 devnull int fd[3], pid;
510 f3b8bf7f 2006-05-25 devnull
511 f3b8bf7f 2006-05-25 devnull va_start(arg, cmd);
512 f3b8bf7f 2006-05-25 devnull p = evsmprint(cmd, arg);
513 f3b8bf7f 2006-05-25 devnull va_end(arg);
514 f3b8bf7f 2006-05-25 devnull fd[0] = open("/dev/null", OREAD);
515 f3b8bf7f 2006-05-25 devnull fd[1] = winfd(w, name, OWRITE);
516 f3b8bf7f 2006-05-25 devnull if(errto == 0)
517 f3b8bf7f 2006-05-25 devnull fd[2] = dup(fd[1], -1);
518 f3b8bf7f 2006-05-25 devnull else
519 f3b8bf7f 2006-05-25 devnull fd[2] = dup(errto, -1);
520 f3b8bf7f 2006-05-25 devnull pid = threadspawnl(fd, "rc", "rc", "-c", p, 0);
521 f3b8bf7f 2006-05-25 devnull free(p);
522 f3b8bf7f 2006-05-25 devnull return pid;
523 f3b8bf7f 2006-05-25 devnull }
524 f3b8bf7f 2006-05-25 devnull
525 f3b8bf7f 2006-05-25 devnull char*
526 f3b8bf7f 2006-05-25 devnull sysrun(char *fmt, ...)
527 f3b8bf7f 2006-05-25 devnull {
528 e074ed0d 2006-06-25 devnull static char buf[1025];
529 f3b8bf7f 2006-05-25 devnull char *cmd;
530 f3b8bf7f 2006-05-25 devnull va_list arg;
531 f3b8bf7f 2006-05-25 devnull int n, fd[3], p[2], tot;
532 f3b8bf7f 2006-05-25 devnull
533 f3b8bf7f 2006-05-25 devnull #undef pipe
534 f3b8bf7f 2006-05-25 devnull if(pipe(p) < 0)
535 f3b8bf7f 2006-05-25 devnull sysfatal("pipe: %r");
536 f3b8bf7f 2006-05-25 devnull fd[0] = open("/dev/null", OREAD);
537 f3b8bf7f 2006-05-25 devnull fd[1] = p[1];
538 f3b8bf7f 2006-05-25 devnull fd[2] = dup(p[1], -1);
539 f3b8bf7f 2006-05-25 devnull
540 f3b8bf7f 2006-05-25 devnull va_start(arg, fmt);
541 f3b8bf7f 2006-05-25 devnull cmd = evsmprint(fmt, arg);
542 f3b8bf7f 2006-05-25 devnull va_end(arg);
543 f3b8bf7f 2006-05-25 devnull threadspawnl(fd, "rc", "rc", "-Ic", cmd, 0);
544 f3b8bf7f 2006-05-25 devnull
545 f3b8bf7f 2006-05-25 devnull tot = 0;
546 f3b8bf7f 2006-05-25 devnull while((n = read(p[0], buf+tot, sizeof buf-tot)) > 0)
547 f3b8bf7f 2006-05-25 devnull tot += n;
548 f3b8bf7f 2006-05-25 devnull close(p[0]);
549 f3b8bf7f 2006-05-25 devnull if(n < 0)
550 f3b8bf7f 2006-05-25 devnull return nil;
551 f3b8bf7f 2006-05-25 devnull free(cmd);
552 f3b8bf7f 2006-05-25 devnull if(tot == sizeof buf)
553 f3b8bf7f 2006-05-25 devnull tot--;
554 f3b8bf7f 2006-05-25 devnull buf[tot] = 0;
555 f3b8bf7f 2006-05-25 devnull while(tot > 0 && isspace(buf[tot-1]))
556 f3b8bf7f 2006-05-25 devnull tot--;
557 f3b8bf7f 2006-05-25 devnull buf[tot] = 0;
558 f3b8bf7f 2006-05-25 devnull if(tot == 0){
559 f3b8bf7f 2006-05-25 devnull werrstr("no output");
560 f3b8bf7f 2006-05-25 devnull return nil;
561 f3b8bf7f 2006-05-25 devnull }
562 f3b8bf7f 2006-05-25 devnull return buf;
563 f3b8bf7f 2006-05-25 devnull }
564 f3b8bf7f 2006-05-25 devnull
565 f3b8bf7f 2006-05-25 devnull static void
566 f3b8bf7f 2006-05-25 devnull eventreader(void *v)
567 f3b8bf7f 2006-05-25 devnull {
568 f3b8bf7f 2006-05-25 devnull Event e[2];
569 f3b8bf7f 2006-05-25 devnull Win *w;
570 f3b8bf7f 2006-05-25 devnull int i;
571 fa325e9b 2020-01-10 cross
572 f3b8bf7f 2006-05-25 devnull w = v;
573 f3b8bf7f 2006-05-25 devnull i = 0;
574 f3b8bf7f 2006-05-25 devnull for(;;){
575 f3b8bf7f 2006-05-25 devnull if(winreadevent(w, &e[i]) <= 0)
576 f3b8bf7f 2006-05-25 devnull break;
577 f3b8bf7f 2006-05-25 devnull sendp(w->c, &e[i]);
578 f3b8bf7f 2006-05-25 devnull i = 1-i; /* toggle */
579 f3b8bf7f 2006-05-25 devnull }
580 f3b8bf7f 2006-05-25 devnull sendp(w->c, nil);
581 f3b8bf7f 2006-05-25 devnull threadexits(nil);
582 f3b8bf7f 2006-05-25 devnull }
583 f3b8bf7f 2006-05-25 devnull
584 f3b8bf7f 2006-05-25 devnull Channel*
585 f3b8bf7f 2006-05-25 devnull wineventchan(Win *w)
586 f3b8bf7f 2006-05-25 devnull {
587 f3b8bf7f 2006-05-25 devnull if(w->c == nil){
588 f3b8bf7f 2006-05-25 devnull w->c = chancreate(sizeof(Event*), 0);
589 f3b8bf7f 2006-05-25 devnull threadcreate(eventreader, w, 32*1024);
590 f3b8bf7f 2006-05-25 devnull }
591 f3b8bf7f 2006-05-25 devnull return w->c;
592 f3b8bf7f 2006-05-25 devnull }