Blame


1 8ad51794 2004-03-25 devnull #include <u.h>
2 8ad51794 2004-03-25 devnull #include <libc.h>
3 8ad51794 2004-03-25 devnull #include <thread.h>
4 8ad51794 2004-03-25 devnull #include <fcall.h>
5 452c0935 2005-01-04 devnull #include <9pclient.h>
6 8ad51794 2004-03-25 devnull #include "term.h"
7 b4a659b6 2004-04-19 devnull
8 bf63f986 2013-08-06 rsc const char *termprog = "win";
9 8ad51794 2004-03-25 devnull
10 8ad51794 2004-03-25 devnull #define EVENTSIZE 256
11 8ad51794 2004-03-25 devnull #define STACK 32768
12 8ad51794 2004-03-25 devnull
13 8ad51794 2004-03-25 devnull typedef struct Event Event;
14 8ad51794 2004-03-25 devnull typedef struct Q Q;
15 8ad51794 2004-03-25 devnull
16 8ad51794 2004-03-25 devnull struct Event
17 8ad51794 2004-03-25 devnull {
18 8ad51794 2004-03-25 devnull int c1;
19 8ad51794 2004-03-25 devnull int c2;
20 8ad51794 2004-03-25 devnull int q0;
21 8ad51794 2004-03-25 devnull int q1;
22 8ad51794 2004-03-25 devnull int flag;
23 8ad51794 2004-03-25 devnull int nb;
24 8ad51794 2004-03-25 devnull int nr;
25 8ad51794 2004-03-25 devnull char b[EVENTSIZE*UTFmax+1];
26 8ad51794 2004-03-25 devnull Rune r[EVENTSIZE+1];
27 8ad51794 2004-03-25 devnull };
28 8ad51794 2004-03-25 devnull
29 8ad51794 2004-03-25 devnull Event blank = {
30 8ad51794 2004-03-25 devnull 'M',
31 8ad51794 2004-03-25 devnull 'X',
32 8ad51794 2004-03-25 devnull 0, 0, 0, 1, 1,
33 8ad51794 2004-03-25 devnull { ' ', 0 },
34 cbeb0b26 2006-04-01 devnull { ' ', 0 }
35 8ad51794 2004-03-25 devnull };
36 8ad51794 2004-03-25 devnull
37 8ad51794 2004-03-25 devnull struct Q
38 8ad51794 2004-03-25 devnull {
39 8ad51794 2004-03-25 devnull QLock lk;
40 8ad51794 2004-03-25 devnull int p;
41 8ad51794 2004-03-25 devnull int k;
42 8ad51794 2004-03-25 devnull };
43 8ad51794 2004-03-25 devnull
44 8ad51794 2004-03-25 devnull Q q;
45 8ad51794 2004-03-25 devnull
46 452c0935 2005-01-04 devnull CFid *eventfd;
47 452c0935 2005-01-04 devnull CFid *addrfd;
48 452c0935 2005-01-04 devnull CFid *datafd;
49 452c0935 2005-01-04 devnull CFid *ctlfd;
50 cbeb0b26 2006-04-01 devnull /* int bodyfd; */
51 8ad51794 2004-03-25 devnull
52 8ad51794 2004-03-25 devnull char *typing;
53 8ad51794 2004-03-25 devnull int ntypeb;
54 8ad51794 2004-03-25 devnull int ntyper;
55 8ad51794 2004-03-25 devnull int ntypebreak;
56 8ad51794 2004-03-25 devnull int debug;
57 8ad51794 2004-03-25 devnull int rcfd;
58 c8471ac5 2010-10-13 rsc int cook = 1;
59 c8471ac5 2010-10-13 rsc int password;
60 c8471ac5 2010-10-13 rsc int israw(int);
61 8ad51794 2004-03-25 devnull
62 8ad51794 2004-03-25 devnull char *name;
63 8ad51794 2004-03-25 devnull
64 8ad51794 2004-03-25 devnull char **prog;
65 8ad51794 2004-03-25 devnull Channel *cwait;
66 8ad51794 2004-03-25 devnull int pid = -1;
67 8ad51794 2004-03-25 devnull
68 8ad51794 2004-03-25 devnull int label(char*, int);
69 4b970769 2005-03-05 devnull void error(char*, ...);
70 8ad51794 2004-03-25 devnull void stdinproc(void*);
71 8ad51794 2004-03-25 devnull void stdoutproc(void*);
72 452c0935 2005-01-04 devnull void type(Event*, int, CFid*, CFid*);
73 452c0935 2005-01-04 devnull void sende(Event*, int, CFid*, CFid*, CFid*, int);
74 8ad51794 2004-03-25 devnull char *onestring(int, char**);
75 8ad51794 2004-03-25 devnull int delete(Event*);
76 8ad51794 2004-03-25 devnull void deltype(uint, uint);
77 ef5c6a6e 2010-09-03 rsc void sendbs(int, int);
78 8ad51794 2004-03-25 devnull void runproc(void*);
79 8ad51794 2004-03-25 devnull
80 8ad51794 2004-03-25 devnull int
81 452c0935 2005-01-04 devnull fsfidprint(CFid *fid, char *fmt, ...)
82 8ad51794 2004-03-25 devnull {
83 8ad51794 2004-03-25 devnull char buf[256];
84 8ad51794 2004-03-25 devnull va_list arg;
85 8ad51794 2004-03-25 devnull int n;
86 8ad51794 2004-03-25 devnull
87 8ad51794 2004-03-25 devnull va_start(arg, fmt);
88 8ad51794 2004-03-25 devnull n = vsnprint(buf, sizeof buf, fmt, arg);
89 8ad51794 2004-03-25 devnull va_end(arg);
90 8ad51794 2004-03-25 devnull return fswrite(fid, buf, n);
91 8ad51794 2004-03-25 devnull }
92 8ad51794 2004-03-25 devnull
93 8ad51794 2004-03-25 devnull void
94 8ad51794 2004-03-25 devnull usage(void)
95 8ad51794 2004-03-25 devnull {
96 8ad51794 2004-03-25 devnull fprint(2, "usage: win cmd args...\n");
97 8ad51794 2004-03-25 devnull threadexitsall("usage");
98 8ad51794 2004-03-25 devnull }
99 8ad51794 2004-03-25 devnull
100 8ad51794 2004-03-25 devnull void
101 8ad51794 2004-03-25 devnull waitthread(void *v)
102 8ad51794 2004-03-25 devnull {
103 8ad51794 2004-03-25 devnull recvp(cwait);
104 8ad51794 2004-03-25 devnull threadexitsall(nil);
105 60535a5f 2004-12-26 devnull }
106 60535a5f 2004-12-26 devnull
107 60535a5f 2004-12-26 devnull void
108 60535a5f 2004-12-26 devnull hangupnote(void *a, char *msg)
109 60535a5f 2004-12-26 devnull {
110 60535a5f 2004-12-26 devnull if(strcmp(msg, "hangup") == 0 && pid != 0){
111 60535a5f 2004-12-26 devnull postnote(PNGROUP, pid, "hangup");
112 60535a5f 2004-12-26 devnull noted(NDFLT);
113 60535a5f 2004-12-26 devnull }
114 60535a5f 2004-12-26 devnull if(strstr(msg, "child")){
115 6a6c2663 2010-01-05 rsc char buf[128];
116 6a6c2663 2010-01-05 rsc int n;
117 6a6c2663 2010-01-05 rsc
118 6a6c2663 2010-01-05 rsc n = awaitnohang(buf, sizeof buf-1);
119 6a6c2663 2010-01-05 rsc if(n > 0){
120 6a6c2663 2010-01-05 rsc buf[n] = 0;
121 6a6c2663 2010-01-05 rsc if(atoi(buf) == pid)
122 6a6c2663 2010-01-05 rsc threadexitsall(0);
123 6a6c2663 2010-01-05 rsc }
124 6a6c2663 2010-01-05 rsc noted(NCONT);
125 60535a5f 2004-12-26 devnull }
126 60535a5f 2004-12-26 devnull noted(NDFLT);
127 8ad51794 2004-03-25 devnull }
128 8ad51794 2004-03-25 devnull
129 8ad51794 2004-03-25 devnull void
130 8ad51794 2004-03-25 devnull threadmain(int argc, char **argv)
131 8ad51794 2004-03-25 devnull {
132 8ad51794 2004-03-25 devnull int fd, id;
133 8ad51794 2004-03-25 devnull char buf[256];
134 8ad51794 2004-03-25 devnull char buf1[128];
135 452c0935 2005-01-04 devnull CFsys *fs;
136 adcb656c 2007-04-17 devnull char *dump;
137 fa325e9b 2020-01-10 cross
138 adcb656c 2007-04-17 devnull dump = onestring(argc, argv);
139 8ad51794 2004-03-25 devnull
140 8ad51794 2004-03-25 devnull ARGBEGIN{
141 8ad51794 2004-03-25 devnull case 'd':
142 8ad51794 2004-03-25 devnull debug = 1;
143 8ad51794 2004-03-25 devnull break;
144 b1455f33 2004-04-30 devnull case 'n':
145 b1455f33 2004-04-30 devnull name = EARGF(usage());
146 b1455f33 2004-04-30 devnull break;
147 8ad51794 2004-03-25 devnull default:
148 8ad51794 2004-03-25 devnull usage();
149 8ad51794 2004-03-25 devnull }ARGEND
150 8ad51794 2004-03-25 devnull
151 8ad51794 2004-03-25 devnull prog = argv;
152 8ad51794 2004-03-25 devnull
153 b1455f33 2004-04-30 devnull if(name == nil){
154 b1455f33 2004-04-30 devnull if(argc > 0)
155 b1455f33 2004-04-30 devnull name = argv[0];
156 b1455f33 2004-04-30 devnull else{
157 b1455f33 2004-04-30 devnull name = sysname();
158 b1455f33 2004-04-30 devnull if(name == nil)
159 b1455f33 2004-04-30 devnull name = "gnot";
160 b1455f33 2004-04-30 devnull }
161 b1455f33 2004-04-30 devnull }
162 8ad51794 2004-03-25 devnull
163 65a34c7f 2009-01-06 rsc /*
164 65a34c7f 2009-01-06 rsc * notedisable("sys: write on closed pipe");
165 65a34c7f 2009-01-06 rsc * not okay to disable the note, because that
166 65a34c7f 2009-01-06 rsc * gets inherited by the subshell, so that something
167 65a34c7f 2009-01-06 rsc * as simple as "yes | sed 10q" never exits.
168 65a34c7f 2009-01-06 rsc * call notifyoff instead. (is notedisable ever safe?)
169 65a34c7f 2009-01-06 rsc */
170 65a34c7f 2009-01-06 rsc notifyoff("sys: write on closed pipe");
171 65a34c7f 2009-01-06 rsc
172 60535a5f 2004-12-26 devnull noteenable("sys: child");
173 60535a5f 2004-12-26 devnull notify(hangupnote);
174 60535a5f 2004-12-26 devnull
175 be22ae2d 2004-03-26 devnull if((fs = nsmount("acme", "")) == 0)
176 8ad51794 2004-03-25 devnull sysfatal("nsmount acme: %r");
177 8ad51794 2004-03-25 devnull ctlfd = fsopen(fs, "new/ctl", ORDWR|OCEXEC);
178 be22ae2d 2004-03-26 devnull if(ctlfd == 0 || fsread(ctlfd, buf, 12) != 12)
179 8ad51794 2004-03-25 devnull sysfatal("ctl: %r");
180 8ad51794 2004-03-25 devnull id = atoi(buf);
181 2d930d45 2004-04-25 devnull snprint(buf, sizeof buf, "%d", id);
182 2d930d45 2004-04-25 devnull putenv("winid", buf);
183 8ad51794 2004-03-25 devnull sprint(buf, "%d/tag", id);
184 8ad51794 2004-03-25 devnull fd = fsopenfd(fs, buf, OWRITE|OCEXEC);
185 ba31ab30 2011-04-27 rsc write(fd, " Send", 1+4);
186 8ad51794 2004-03-25 devnull close(fd);
187 8ad51794 2004-03-25 devnull sprint(buf, "%d/event", id);
188 8ad51794 2004-03-25 devnull eventfd = fsopen(fs, buf, ORDWR|OCEXEC);
189 8ad51794 2004-03-25 devnull sprint(buf, "%d/addr", id);
190 8ad51794 2004-03-25 devnull addrfd = fsopen(fs, buf, ORDWR|OCEXEC);
191 8ad51794 2004-03-25 devnull sprint(buf, "%d/data", id);
192 8ad51794 2004-03-25 devnull datafd = fsopen(fs, buf, ORDWR|OCEXEC);
193 8ad51794 2004-03-25 devnull sprint(buf, "%d/body", id);
194 8ad51794 2004-03-25 devnull /* bodyfd = fsopenfd(fs, buf, ORDWR|OCEXEC); */
195 8ad51794 2004-03-25 devnull if(eventfd==nil || addrfd==nil || datafd==nil)
196 8ad51794 2004-03-25 devnull sysfatal("data files: %r");
197 8ad51794 2004-03-25 devnull /*
198 8ad51794 2004-03-25 devnull if(eventfd<0 || addrfd<0 || datafd<0 || bodyfd<0)
199 8ad51794 2004-03-25 devnull sysfatal("data files: %r");
200 8ad51794 2004-03-25 devnull */
201 8ad51794 2004-03-25 devnull fsunmount(fs);
202 8ad51794 2004-03-25 devnull
203 8ad51794 2004-03-25 devnull cwait = threadwaitchan();
204 8ad51794 2004-03-25 devnull threadcreate(waitthread, nil, STACK);
205 4dcd9af2 2004-04-15 devnull pid = rcstart(argc, argv, &rcfd, nil);
206 8ad51794 2004-03-25 devnull if(pid == -1)
207 8ad51794 2004-03-25 devnull sysfatal("exec failed");
208 8ad51794 2004-03-25 devnull
209 8ad51794 2004-03-25 devnull getwd(buf1, sizeof buf1);
210 8ad51794 2004-03-25 devnull sprint(buf, "name %s/-%s\n0\n", buf1, name);
211 8ad51794 2004-03-25 devnull fswrite(ctlfd, buf, strlen(buf));
212 8ad51794 2004-03-25 devnull sprint(buf, "dumpdir %s/\n", buf1);
213 8ad51794 2004-03-25 devnull fswrite(ctlfd, buf, strlen(buf));
214 adcb656c 2007-04-17 devnull sprint(buf, "dump %s\n", dump);
215 8ad51794 2004-03-25 devnull fswrite(ctlfd, buf, strlen(buf));
216 e1118cf2 2008-11-13 rsc sprint(buf, "scroll");
217 e1118cf2 2008-11-13 rsc fswrite(ctlfd, buf, strlen(buf));
218 fa325e9b 2020-01-10 cross
219 5e0f7e8a 2004-04-23 devnull updatewinsize(25, 80, 0, 0);
220 60535a5f 2004-12-26 devnull proccreate(stdoutproc, nil, STACK);
221 8ad51794 2004-03-25 devnull stdinproc(nil);
222 8ad51794 2004-03-25 devnull }
223 8ad51794 2004-03-25 devnull
224 8ad51794 2004-03-25 devnull void
225 4b970769 2005-03-05 devnull error(char *s, ...)
226 8ad51794 2004-03-25 devnull {
227 4b970769 2005-03-05 devnull va_list arg;
228 fa325e9b 2020-01-10 cross
229 4b970769 2005-03-05 devnull if(s){
230 4b970769 2005-03-05 devnull va_start(arg, s);
231 4b970769 2005-03-05 devnull s = vsmprint(s, arg);
232 4b970769 2005-03-05 devnull va_end(arg);
233 8ad51794 2004-03-25 devnull fprint(2, "win: %s: %r\n", s);
234 0aa79278 2006-03-27 devnull }
235 8ad51794 2004-03-25 devnull if(pid != -1)
236 8ad51794 2004-03-25 devnull postnote(PNGROUP, pid, "hangup");
237 8ad51794 2004-03-25 devnull threadexitsall(s);
238 8ad51794 2004-03-25 devnull }
239 8ad51794 2004-03-25 devnull
240 8ad51794 2004-03-25 devnull char*
241 8ad51794 2004-03-25 devnull onestring(int argc, char **argv)
242 8ad51794 2004-03-25 devnull {
243 8ad51794 2004-03-25 devnull char *p;
244 8ad51794 2004-03-25 devnull int i, n;
245 8ad51794 2004-03-25 devnull static char buf[1024];
246 8ad51794 2004-03-25 devnull
247 8ad51794 2004-03-25 devnull if(argc == 0)
248 8ad51794 2004-03-25 devnull return "";
249 8ad51794 2004-03-25 devnull p = buf;
250 8ad51794 2004-03-25 devnull for(i=0; i<argc; i++){
251 8ad51794 2004-03-25 devnull n = strlen(argv[i]);
252 8ad51794 2004-03-25 devnull if(p+n+1 >= buf+sizeof buf)
253 8ad51794 2004-03-25 devnull break;
254 8ad51794 2004-03-25 devnull memmove(p, argv[i], n);
255 8ad51794 2004-03-25 devnull p += n;
256 8ad51794 2004-03-25 devnull *p++ = ' ';
257 8ad51794 2004-03-25 devnull }
258 8ad51794 2004-03-25 devnull p[-1] = 0;
259 8ad51794 2004-03-25 devnull return buf;
260 8ad51794 2004-03-25 devnull }
261 8ad51794 2004-03-25 devnull
262 8ad51794 2004-03-25 devnull int
263 452c0935 2005-01-04 devnull getec(CFid *efd)
264 8ad51794 2004-03-25 devnull {
265 8ad51794 2004-03-25 devnull static char buf[8192];
266 8ad51794 2004-03-25 devnull static char *bufp;
267 8ad51794 2004-03-25 devnull static int nbuf;
268 8ad51794 2004-03-25 devnull
269 8ad51794 2004-03-25 devnull if(nbuf == 0){
270 8ad51794 2004-03-25 devnull nbuf = fsread(efd, buf, sizeof buf);
271 8ad51794 2004-03-25 devnull if(nbuf <= 0)
272 8ad51794 2004-03-25 devnull error(nil);
273 8ad51794 2004-03-25 devnull bufp = buf;
274 8ad51794 2004-03-25 devnull }
275 8ad51794 2004-03-25 devnull --nbuf;
276 8ad51794 2004-03-25 devnull return *bufp++;
277 8ad51794 2004-03-25 devnull }
278 8ad51794 2004-03-25 devnull
279 8ad51794 2004-03-25 devnull int
280 452c0935 2005-01-04 devnull geten(CFid *efd)
281 8ad51794 2004-03-25 devnull {
282 8ad51794 2004-03-25 devnull int n, c;
283 8ad51794 2004-03-25 devnull
284 8ad51794 2004-03-25 devnull n = 0;
285 8ad51794 2004-03-25 devnull while('0'<=(c=getec(efd)) && c<='9')
286 8ad51794 2004-03-25 devnull n = n*10+(c-'0');
287 8ad51794 2004-03-25 devnull if(c != ' ')
288 8ad51794 2004-03-25 devnull error("event number syntax");
289 8ad51794 2004-03-25 devnull return n;
290 8ad51794 2004-03-25 devnull }
291 8ad51794 2004-03-25 devnull
292 8ad51794 2004-03-25 devnull int
293 452c0935 2005-01-04 devnull geter(CFid *efd, char *buf, int *nb)
294 8ad51794 2004-03-25 devnull {
295 8ad51794 2004-03-25 devnull Rune r;
296 8ad51794 2004-03-25 devnull int n;
297 8ad51794 2004-03-25 devnull
298 8ad51794 2004-03-25 devnull r = getec(efd);
299 8ad51794 2004-03-25 devnull buf[0] = r;
300 8ad51794 2004-03-25 devnull n = 1;
301 8ad51794 2004-03-25 devnull if(r < Runeself)
302 8ad51794 2004-03-25 devnull goto Return;
303 8ad51794 2004-03-25 devnull while(!fullrune(buf, n))
304 8ad51794 2004-03-25 devnull buf[n++] = getec(efd);
305 8ad51794 2004-03-25 devnull chartorune(&r, buf);
306 8ad51794 2004-03-25 devnull Return:
307 8ad51794 2004-03-25 devnull *nb = n;
308 8ad51794 2004-03-25 devnull return r;
309 8ad51794 2004-03-25 devnull }
310 8ad51794 2004-03-25 devnull
311 8ad51794 2004-03-25 devnull void
312 452c0935 2005-01-04 devnull gete(CFid *efd, Event *e)
313 8ad51794 2004-03-25 devnull {
314 8ad51794 2004-03-25 devnull int i, nb;
315 8ad51794 2004-03-25 devnull
316 8ad51794 2004-03-25 devnull e->c1 = getec(efd);
317 8ad51794 2004-03-25 devnull e->c2 = getec(efd);
318 8ad51794 2004-03-25 devnull e->q0 = geten(efd);
319 8ad51794 2004-03-25 devnull e->q1 = geten(efd);
320 8ad51794 2004-03-25 devnull e->flag = geten(efd);
321 8ad51794 2004-03-25 devnull e->nr = geten(efd);
322 8ad51794 2004-03-25 devnull if(e->nr > EVENTSIZE)
323 8ad51794 2004-03-25 devnull error("event string too long");
324 8ad51794 2004-03-25 devnull e->nb = 0;
325 8ad51794 2004-03-25 devnull for(i=0; i<e->nr; i++){
326 8ad51794 2004-03-25 devnull e->r[i] = geter(efd, e->b+e->nb, &nb);
327 8ad51794 2004-03-25 devnull e->nb += nb;
328 8ad51794 2004-03-25 devnull }
329 8ad51794 2004-03-25 devnull e->r[e->nr] = 0;
330 8ad51794 2004-03-25 devnull e->b[e->nb] = 0;
331 8ad51794 2004-03-25 devnull if(getec(efd) != '\n')
332 8ad51794 2004-03-25 devnull error("event syntax 2");
333 8ad51794 2004-03-25 devnull }
334 8ad51794 2004-03-25 devnull
335 8ad51794 2004-03-25 devnull int
336 8ad51794 2004-03-25 devnull nrunes(char *s, int nb)
337 8ad51794 2004-03-25 devnull {
338 8ad51794 2004-03-25 devnull int i, n;
339 8ad51794 2004-03-25 devnull Rune r;
340 8ad51794 2004-03-25 devnull
341 8ad51794 2004-03-25 devnull n = 0;
342 8ad51794 2004-03-25 devnull for(i=0; i<nb; n++)
343 8ad51794 2004-03-25 devnull i += chartorune(&r, s+i);
344 8ad51794 2004-03-25 devnull return n;
345 8ad51794 2004-03-25 devnull }
346 8ad51794 2004-03-25 devnull
347 8ad51794 2004-03-25 devnull void
348 8ad51794 2004-03-25 devnull stdinproc(void *v)
349 8ad51794 2004-03-25 devnull {
350 452c0935 2005-01-04 devnull CFid *cfd = ctlfd;
351 452c0935 2005-01-04 devnull CFid *efd = eventfd;
352 452c0935 2005-01-04 devnull CFid *dfd = datafd;
353 452c0935 2005-01-04 devnull CFid *afd = addrfd;
354 8ad51794 2004-03-25 devnull int fd0 = rcfd;
355 8ad51794 2004-03-25 devnull Event e, e2, e3, e4;
356 ef5c6a6e 2010-09-03 rsc int n;
357 8ad51794 2004-03-25 devnull
358 8ad51794 2004-03-25 devnull USED(v);
359 8ad51794 2004-03-25 devnull
360 8ad51794 2004-03-25 devnull for(;;){
361 8ad51794 2004-03-25 devnull if(debug)
362 8ad51794 2004-03-25 devnull fprint(2, "typing[%d,%d)\n", q.p, q.p+ntyper);
363 8ad51794 2004-03-25 devnull gete(efd, &e);
364 8ad51794 2004-03-25 devnull if(debug)
365 8ad51794 2004-03-25 devnull fprint(2, "msg %c%c q[%d,%d)... ", e.c1, e.c2, e.q0, e.q1);
366 8ad51794 2004-03-25 devnull qlock(&q.lk);
367 8ad51794 2004-03-25 devnull switch(e.c1){
368 8ad51794 2004-03-25 devnull default:
369 8ad51794 2004-03-25 devnull Unknown:
370 8ad51794 2004-03-25 devnull print("unknown message %c%c\n", e.c1, e.c2);
371 8ad51794 2004-03-25 devnull break;
372 8ad51794 2004-03-25 devnull
373 6a6c2663 2010-01-05 rsc case 'E': /* write to body or tag; can't affect us */
374 6a6c2663 2010-01-05 rsc switch(e.c2){
375 6a6c2663 2010-01-05 rsc case 'I':
376 6a6c2663 2010-01-05 rsc case 'D': /* body */
377 6a6c2663 2010-01-05 rsc if(debug)
378 6a6c2663 2010-01-05 rsc fprint(2, "shift typing %d... ", e.q1-e.q0);
379 6a6c2663 2010-01-05 rsc q.p += e.q1-e.q0;
380 6a6c2663 2010-01-05 rsc break;
381 fa325e9b 2020-01-10 cross
382 6a6c2663 2010-01-05 rsc case 'i':
383 6a6c2663 2010-01-05 rsc case 'd': /* tag */
384 6a6c2663 2010-01-05 rsc break;
385 fa325e9b 2020-01-10 cross
386 6a6c2663 2010-01-05 rsc default:
387 6a6c2663 2010-01-05 rsc goto Unknown;
388 6a6c2663 2010-01-05 rsc }
389 8ad51794 2004-03-25 devnull break;
390 8ad51794 2004-03-25 devnull
391 8ad51794 2004-03-25 devnull case 'F': /* generated by our actions; ignore */
392 8ad51794 2004-03-25 devnull break;
393 8ad51794 2004-03-25 devnull
394 8ad51794 2004-03-25 devnull case 'K':
395 8ad51794 2004-03-25 devnull case 'M':
396 8ad51794 2004-03-25 devnull switch(e.c2){
397 8ad51794 2004-03-25 devnull case 'I':
398 d66973d2 2008-11-13 rsc if(e.nr == 1 && e.r[0] == 0x7F) {
399 95cb0f63 2008-11-14 rsc char buf[1];
400 d66973d2 2008-11-13 rsc fsprint(addrfd, "#%ud,#%ud", e.q0, e.q1);
401 d66973d2 2008-11-13 rsc fswrite(datafd, "", 0);
402 95cb0f63 2008-11-14 rsc buf[0] = 0x7F;
403 95cb0f63 2008-11-14 rsc write(fd0, buf, 1);
404 d66973d2 2008-11-13 rsc break;
405 d66973d2 2008-11-13 rsc }
406 8ad51794 2004-03-25 devnull if(e.q0 < q.p){
407 8ad51794 2004-03-25 devnull if(debug)
408 8ad51794 2004-03-25 devnull fprint(2, "shift typing %d... ", e.q1-e.q0);
409 8ad51794 2004-03-25 devnull q.p += e.q1-e.q0;
410 8ad51794 2004-03-25 devnull }
411 8ad51794 2004-03-25 devnull else if(e.q0 <= q.p+ntyper){
412 8ad51794 2004-03-25 devnull if(debug)
413 8ad51794 2004-03-25 devnull fprint(2, "type... ");
414 8ad51794 2004-03-25 devnull type(&e, fd0, afd, dfd);
415 8ad51794 2004-03-25 devnull }
416 8ad51794 2004-03-25 devnull break;
417 8ad51794 2004-03-25 devnull
418 8ad51794 2004-03-25 devnull case 'D':
419 ef5c6a6e 2010-09-03 rsc n = delete(&e);
420 ef5c6a6e 2010-09-03 rsc q.p -= n;
421 c8471ac5 2010-10-13 rsc if(israw(fd0) && e.q1 >= q.p+n)
422 ef5c6a6e 2010-09-03 rsc sendbs(fd0, n);
423 8ad51794 2004-03-25 devnull break;
424 8ad51794 2004-03-25 devnull
425 8ad51794 2004-03-25 devnull case 'x':
426 8ad51794 2004-03-25 devnull case 'X':
427 8ad51794 2004-03-25 devnull if(e.flag & 2)
428 8ad51794 2004-03-25 devnull gete(efd, &e2);
429 8ad51794 2004-03-25 devnull if(e.flag & 8){
430 8ad51794 2004-03-25 devnull gete(efd, &e3);
431 8ad51794 2004-03-25 devnull gete(efd, &e4);
432 8ad51794 2004-03-25 devnull }
433 8ad51794 2004-03-25 devnull if(e.flag&1 || (e.c2=='x' && e.nr==0 && e2.nr==0)){
434 8ad51794 2004-03-25 devnull /* send it straight back */
435 8ad51794 2004-03-25 devnull fsfidprint(efd, "%c%c%d %d\n", e.c1, e.c2, e.q0, e.q1);
436 8ad51794 2004-03-25 devnull break;
437 8ad51794 2004-03-25 devnull }
438 8ad51794 2004-03-25 devnull if(e.q0==e.q1 && (e.flag&2)){
439 8ad51794 2004-03-25 devnull e2.flag = e.flag;
440 8ad51794 2004-03-25 devnull e = e2;
441 e1118cf2 2008-11-13 rsc }
442 e1118cf2 2008-11-13 rsc char buf[100];
443 e1118cf2 2008-11-13 rsc snprint(buf, sizeof buf, "%.*S", e.nr, e.r);
444 875351f4 2010-09-10 rsc if(cistrcmp(buf, "cook") == 0) {
445 875351f4 2010-09-10 rsc cook = 1;
446 875351f4 2010-09-10 rsc break;
447 875351f4 2010-09-10 rsc }
448 875351f4 2010-09-10 rsc if(cistrcmp(buf, "nocook") == 0) {
449 875351f4 2010-09-10 rsc cook = 0;
450 875351f4 2010-09-10 rsc break;
451 875351f4 2010-09-10 rsc }
452 8ad51794 2004-03-25 devnull if(e.flag & 8){
453 8ad51794 2004-03-25 devnull if(e.q1 != e.q0){
454 8ad51794 2004-03-25 devnull sende(&e, fd0, cfd, afd, dfd, 0);
455 8ad51794 2004-03-25 devnull sende(&blank, fd0, cfd, afd, dfd, 0);
456 8ad51794 2004-03-25 devnull }
457 8ad51794 2004-03-25 devnull sende(&e3, fd0, cfd, afd, dfd, 1);
458 8ad51794 2004-03-25 devnull }else if(e.q1 != e.q0)
459 8ad51794 2004-03-25 devnull sende(&e, fd0, cfd, afd, dfd, 1);
460 8ad51794 2004-03-25 devnull break;
461 8ad51794 2004-03-25 devnull
462 8ad51794 2004-03-25 devnull case 'l':
463 8ad51794 2004-03-25 devnull case 'L':
464 8ad51794 2004-03-25 devnull /* just send it back */
465 8ad51794 2004-03-25 devnull if(e.flag & 2)
466 8ad51794 2004-03-25 devnull gete(efd, &e2);
467 8ad51794 2004-03-25 devnull fsfidprint(efd, "%c%c%d %d\n", e.c1, e.c2, e.q0, e.q1);
468 8ad51794 2004-03-25 devnull break;
469 8ad51794 2004-03-25 devnull
470 8ad51794 2004-03-25 devnull case 'd':
471 8ad51794 2004-03-25 devnull case 'i':
472 8ad51794 2004-03-25 devnull break;
473 8ad51794 2004-03-25 devnull
474 8ad51794 2004-03-25 devnull default:
475 8ad51794 2004-03-25 devnull goto Unknown;
476 8ad51794 2004-03-25 devnull }
477 8ad51794 2004-03-25 devnull }
478 8ad51794 2004-03-25 devnull qunlock(&q.lk);
479 0d2dfbc8 2015-11-10 rsc }
480 0d2dfbc8 2015-11-10 rsc }
481 0d2dfbc8 2015-11-10 rsc
482 0d2dfbc8 2015-11-10 rsc int
483 0d2dfbc8 2015-11-10 rsc dropcr(char *p, int n)
484 0d2dfbc8 2015-11-10 rsc {
485 0d2dfbc8 2015-11-10 rsc int i;
486 8db40354 2015-11-10 rsc char *w, *r, *q;
487 fa325e9b 2020-01-10 cross
488 0d2dfbc8 2015-11-10 rsc r = p;
489 0d2dfbc8 2015-11-10 rsc w = p;
490 0d2dfbc8 2015-11-10 rsc for(i=0; i<n; i++) {
491 0d2dfbc8 2015-11-10 rsc switch(*r) {
492 0d2dfbc8 2015-11-10 rsc case '\b':
493 0d2dfbc8 2015-11-10 rsc if(w > p)
494 0d2dfbc8 2015-11-10 rsc w--;
495 0d2dfbc8 2015-11-10 rsc break;
496 0d2dfbc8 2015-11-10 rsc case '\r':
497 8db40354 2015-11-10 rsc while(i<n-1 && *(r+1) == '\r') {
498 8db40354 2015-11-10 rsc r++;
499 8db40354 2015-11-10 rsc i++;
500 8db40354 2015-11-10 rsc }
501 8db40354 2015-11-10 rsc if(i<n && *(r+1) != '\n') {
502 8db40354 2015-11-10 rsc q = r;
503 8db40354 2015-11-10 rsc while(q>p && *(q-1) != '\n')
504 8db40354 2015-11-10 rsc q--;
505 8db40354 2015-11-10 rsc if(q > p) {
506 8db40354 2015-11-10 rsc w = q;
507 8db40354 2015-11-10 rsc break;
508 8db40354 2015-11-10 rsc }
509 8db40354 2015-11-10 rsc }
510 0d2dfbc8 2015-11-10 rsc *w++ = '\n';
511 0d2dfbc8 2015-11-10 rsc break;
512 0d2dfbc8 2015-11-10 rsc default:
513 0d2dfbc8 2015-11-10 rsc *w++ = *r;
514 0d2dfbc8 2015-11-10 rsc break;
515 0d2dfbc8 2015-11-10 rsc }
516 0d2dfbc8 2015-11-10 rsc r++;
517 8ad51794 2004-03-25 devnull }
518 0d2dfbc8 2015-11-10 rsc return w-p;
519 8ad51794 2004-03-25 devnull }
520 8ad51794 2004-03-25 devnull
521 8ad51794 2004-03-25 devnull void
522 8ad51794 2004-03-25 devnull stdoutproc(void *v)
523 8ad51794 2004-03-25 devnull {
524 8ad51794 2004-03-25 devnull int fd1 = rcfd;
525 452c0935 2005-01-04 devnull CFid *afd = addrfd;
526 452c0935 2005-01-04 devnull CFid *dfd = datafd;
527 8ad51794 2004-03-25 devnull int n, m, w, npart;
528 8ad51794 2004-03-25 devnull char *buf, *s, *t;
529 8ad51794 2004-03-25 devnull Rune r;
530 8ad51794 2004-03-25 devnull char x[16], hold[UTFmax];
531 8ad51794 2004-03-25 devnull
532 8ad51794 2004-03-25 devnull USED(v);
533 8ad51794 2004-03-25 devnull buf = malloc(8192+UTFmax+1);
534 8ad51794 2004-03-25 devnull npart = 0;
535 8ad51794 2004-03-25 devnull for(;;){
536 8ad51794 2004-03-25 devnull /* Let typing have a go -- maybe there's a rubout waiting. */
537 8ad51794 2004-03-25 devnull yield();
538 60535a5f 2004-12-26 devnull n = read(fd1, buf+npart, 8192);
539 f8104b3d 2005-01-05 devnull if(n <= 0)
540 8ad51794 2004-03-25 devnull error(nil);
541 fa325e9b 2020-01-10 cross
542 ef5c6a6e 2010-09-03 rsc n = echocancel(buf+npart, n);
543 ef5c6a6e 2010-09-03 rsc if(n == 0)
544 ef5c6a6e 2010-09-03 rsc continue;
545 fa325e9b 2020-01-10 cross
546 ef5c6a6e 2010-09-03 rsc n = dropcrnl(buf+npart, n);
547 0d2dfbc8 2015-11-10 rsc if(n == 0)
548 0d2dfbc8 2015-11-10 rsc continue;
549 fa325e9b 2020-01-10 cross
550 0d2dfbc8 2015-11-10 rsc n = dropcr(buf+npart, n);
551 ef5c6a6e 2010-09-03 rsc if(n == 0)
552 ef5c6a6e 2010-09-03 rsc continue;
553 8ad51794 2004-03-25 devnull
554 8ad51794 2004-03-25 devnull /* squash NULs */
555 8ad51794 2004-03-25 devnull s = memchr(buf+npart, 0, n);
556 8ad51794 2004-03-25 devnull if(s){
557 8ad51794 2004-03-25 devnull for(t=s; s<buf+npart+n; s++)
558 8ad51794 2004-03-25 devnull if(*t = *s) /* assign = */
559 8ad51794 2004-03-25 devnull t++;
560 8ad51794 2004-03-25 devnull n = t-(buf+npart);
561 8ad51794 2004-03-25 devnull }
562 8ad51794 2004-03-25 devnull
563 8ad51794 2004-03-25 devnull n += npart;
564 8ad51794 2004-03-25 devnull
565 8ad51794 2004-03-25 devnull /* hold on to final partial rune */
566 8ad51794 2004-03-25 devnull npart = 0;
567 8ad51794 2004-03-25 devnull while(n>0 && (buf[n-1]&0xC0)){
568 8ad51794 2004-03-25 devnull --n;
569 8ad51794 2004-03-25 devnull npart++;
570 8ad51794 2004-03-25 devnull if((buf[n]&0xC0)!=0x80){
571 8ad51794 2004-03-25 devnull if(fullrune(buf+n, npart)){
572 8ad51794 2004-03-25 devnull w = chartorune(&r, buf+n);
573 8ad51794 2004-03-25 devnull n += w;
574 8ad51794 2004-03-25 devnull npart -= w;
575 8ad51794 2004-03-25 devnull }
576 8ad51794 2004-03-25 devnull break;
577 8ad51794 2004-03-25 devnull }
578 8ad51794 2004-03-25 devnull }
579 8ad51794 2004-03-25 devnull if(n > 0){
580 8ad51794 2004-03-25 devnull memmove(hold, buf+n, npart);
581 8ad51794 2004-03-25 devnull buf[n] = 0;
582 8ad51794 2004-03-25 devnull n = label(buf, n);
583 8ad51794 2004-03-25 devnull buf[n] = 0;
584 fa325e9b 2020-01-10 cross
585 c8471ac5 2010-10-13 rsc // clumsy but effective: notice password
586 c8471ac5 2010-10-13 rsc // prompts so we can disable echo.
587 c8471ac5 2010-10-13 rsc password = 0;
588 13666ca7 2011-08-26 rsc if(cistrstr(buf, "password") || cistrstr(buf, "passphrase")) {
589 c8471ac5 2010-10-13 rsc int i;
590 fa325e9b 2020-01-10 cross
591 c8471ac5 2010-10-13 rsc i = n;
592 c8471ac5 2010-10-13 rsc while(i > 0 && buf[i-1] == ' ')
593 c8471ac5 2010-10-13 rsc i--;
594 c8471ac5 2010-10-13 rsc password = i > 0 && buf[i-1] == ':';
595 c8471ac5 2010-10-13 rsc }
596 c8471ac5 2010-10-13 rsc
597 8ad51794 2004-03-25 devnull qlock(&q.lk);
598 8ad51794 2004-03-25 devnull m = sprint(x, "#%d", q.p);
599 4b970769 2005-03-05 devnull if(fswrite(afd, x, m) != m){
600 ef5c6a6e 2010-09-03 rsc fprint(2, "stdout writing address %s: %r; resetting\n", x);
601 ef5c6a6e 2010-09-03 rsc if(fswrite(afd, "$", 1) < 0)
602 ef5c6a6e 2010-09-03 rsc fprint(2, "reset: %r\n");
603 ef5c6a6e 2010-09-03 rsc fsseek(afd, 0, 0);
604 4b970769 2005-03-05 devnull m = fsread(afd, x, sizeof x-1);
605 4b970769 2005-03-05 devnull if(m >= 0){
606 4b970769 2005-03-05 devnull x[m] = 0;
607 4b970769 2005-03-05 devnull q.p = atoi(x);
608 4b970769 2005-03-05 devnull }
609 4b970769 2005-03-05 devnull }
610 8ad51794 2004-03-25 devnull if(fswrite(dfd, buf, n) != n)
611 8ad51794 2004-03-25 devnull error("stdout writing body");
612 bea7c49a 2010-03-19 rsc /* Make sure acme scrolls to the end of the above write. */
613 bea7c49a 2010-03-19 rsc if(fswrite(dfd, nil, 0) != 0)
614 bea7c49a 2010-03-19 rsc error("stdout flushing body");
615 8ad51794 2004-03-25 devnull q.p += nrunes(buf, n);
616 8ad51794 2004-03-25 devnull qunlock(&q.lk);
617 8ad51794 2004-03-25 devnull memmove(buf, hold, npart);
618 8ad51794 2004-03-25 devnull }
619 8ad51794 2004-03-25 devnull }
620 8ad51794 2004-03-25 devnull }
621 8ad51794 2004-03-25 devnull
622 efe12411 2005-01-30 devnull char wdir[512];
623 8ad51794 2004-03-25 devnull int
624 8ad51794 2004-03-25 devnull label(char *sr, int n)
625 8ad51794 2004-03-25 devnull {
626 efe12411 2005-01-30 devnull char *sl, *el, *er, *r, *p;
627 8ad51794 2004-03-25 devnull
628 8ad51794 2004-03-25 devnull er = sr+n;
629 8ad51794 2004-03-25 devnull for(r=er-1; r>=sr; r--)
630 8ad51794 2004-03-25 devnull if(*r == '\007')
631 8ad51794 2004-03-25 devnull break;
632 8ad51794 2004-03-25 devnull if(r < sr)
633 8ad51794 2004-03-25 devnull return n;
634 8ad51794 2004-03-25 devnull
635 8ad51794 2004-03-25 devnull el = r+1;
636 efe12411 2005-01-30 devnull if(el-sr > sizeof wdir - strlen(name) - 20)
637 669713d4 2017-04-08 gsoares sr = el - (sizeof wdir - strlen(name) - 20);
638 8ad51794 2004-03-25 devnull for(sl=el-3; sl>=sr; sl--)
639 8ad51794 2004-03-25 devnull if(sl[0]=='\033' && sl[1]==']' && sl[2]==';')
640 8ad51794 2004-03-25 devnull break;
641 8ad51794 2004-03-25 devnull if(sl < sr)
642 8ad51794 2004-03-25 devnull return n;
643 8ad51794 2004-03-25 devnull
644 8ad51794 2004-03-25 devnull *r = 0;
645 0e881c05 2011-10-11 rsc if(strcmp(sl+3, "*9term-hold+") != 0) {
646 0e881c05 2011-10-11 rsc /*
647 0e881c05 2011-10-11 rsc * add /-sysname if not present
648 0e881c05 2011-10-11 rsc */
649 0e881c05 2011-10-11 rsc snprint(wdir, sizeof wdir, "name %s", sl+3);
650 0e881c05 2011-10-11 rsc p = strrchr(wdir, '/');
651 0e881c05 2011-10-11 rsc if(p==nil || *(p+1) != '-'){
652 0e881c05 2011-10-11 rsc p = wdir+strlen(wdir);
653 0e881c05 2011-10-11 rsc if(*(p-1) != '/')
654 0e881c05 2011-10-11 rsc *p++ = '/';
655 0e881c05 2011-10-11 rsc *p++ = '-';
656 0e881c05 2011-10-11 rsc strcpy(p, name);
657 0e881c05 2011-10-11 rsc }
658 0e881c05 2011-10-11 rsc strcat(wdir, "\n0\n");
659 0e881c05 2011-10-11 rsc fswrite(ctlfd, wdir, strlen(wdir));
660 efe12411 2005-01-30 devnull }
661 8ad51794 2004-03-25 devnull
662 8ad51794 2004-03-25 devnull memmove(sl, el, er-el);
663 8ad51794 2004-03-25 devnull n -= (el-sl);
664 8ad51794 2004-03-25 devnull return n;
665 8ad51794 2004-03-25 devnull }
666 8ad51794 2004-03-25 devnull
667 8ad51794 2004-03-25 devnull int
668 8ad51794 2004-03-25 devnull delete(Event *e)
669 8ad51794 2004-03-25 devnull {
670 8ad51794 2004-03-25 devnull uint q0, q1;
671 8ad51794 2004-03-25 devnull int deltap;
672 8ad51794 2004-03-25 devnull
673 8ad51794 2004-03-25 devnull q0 = e->q0;
674 8ad51794 2004-03-25 devnull q1 = e->q1;
675 8ad51794 2004-03-25 devnull if(q1 <= q.p)
676 8ad51794 2004-03-25 devnull return e->q1-e->q0;
677 8ad51794 2004-03-25 devnull if(q0 >= q.p+ntyper)
678 8ad51794 2004-03-25 devnull return 0;
679 8ad51794 2004-03-25 devnull deltap = 0;
680 8ad51794 2004-03-25 devnull if(q0 < q.p){
681 8ad51794 2004-03-25 devnull deltap = q.p-q0;
682 8ad51794 2004-03-25 devnull q0 = 0;
683 8ad51794 2004-03-25 devnull }else
684 8ad51794 2004-03-25 devnull q0 -= q.p;
685 8ad51794 2004-03-25 devnull if(q1 > q.p+ntyper)
686 8ad51794 2004-03-25 devnull q1 = ntyper;
687 8ad51794 2004-03-25 devnull else
688 8ad51794 2004-03-25 devnull q1 -= q.p;
689 8ad51794 2004-03-25 devnull deltype(q0, q1);
690 8ad51794 2004-03-25 devnull return deltap;
691 8ad51794 2004-03-25 devnull }
692 8ad51794 2004-03-25 devnull
693 8ad51794 2004-03-25 devnull void
694 8ad51794 2004-03-25 devnull addtype(int c, uint p0, char *b, int nb, int nr)
695 8ad51794 2004-03-25 devnull {
696 8ad51794 2004-03-25 devnull int i, w;
697 8ad51794 2004-03-25 devnull Rune r;
698 8ad51794 2004-03-25 devnull uint p;
699 8ad51794 2004-03-25 devnull char *b0;
700 8ad51794 2004-03-25 devnull
701 8ad51794 2004-03-25 devnull for(i=0; i<nb; i+=w){
702 8ad51794 2004-03-25 devnull w = chartorune(&r, b+i);
703 8ad51794 2004-03-25 devnull if((r==0x7F||r==3) && c=='K'){
704 8ad51794 2004-03-25 devnull write(rcfd, "\x7F", 1);
705 8ad51794 2004-03-25 devnull /* toss all typing */
706 8ad51794 2004-03-25 devnull q.p += ntyper+nr;
707 8ad51794 2004-03-25 devnull ntypebreak = 0;
708 8ad51794 2004-03-25 devnull ntypeb = 0;
709 8ad51794 2004-03-25 devnull ntyper = 0;
710 8ad51794 2004-03-25 devnull /* buglet: more than one delete ignored */
711 8ad51794 2004-03-25 devnull return;
712 8ad51794 2004-03-25 devnull }
713 8ad51794 2004-03-25 devnull if(r=='\n' || r==0x04)
714 8ad51794 2004-03-25 devnull ntypebreak++;
715 8ad51794 2004-03-25 devnull }
716 8ad51794 2004-03-25 devnull typing = realloc(typing, ntypeb+nb);
717 8ad51794 2004-03-25 devnull if(typing == nil)
718 8ad51794 2004-03-25 devnull error("realloc");
719 8ad51794 2004-03-25 devnull if(p0 == ntyper)
720 8ad51794 2004-03-25 devnull memmove(typing+ntypeb, b, nb);
721 8ad51794 2004-03-25 devnull else{
722 8ad51794 2004-03-25 devnull b0 = typing;
723 8ad51794 2004-03-25 devnull for(p=0; p<p0 && b0<typing+ntypeb; p++){
724 8ad51794 2004-03-25 devnull w = chartorune(&r, b0+i);
725 8ad51794 2004-03-25 devnull b0 += w;
726 8ad51794 2004-03-25 devnull }
727 8ad51794 2004-03-25 devnull if(p != p0)
728 8ad51794 2004-03-25 devnull error("typing: findrune");
729 8ad51794 2004-03-25 devnull memmove(b0+nb, b0, (typing+ntypeb)-b0);
730 8ad51794 2004-03-25 devnull memmove(b0, b, nb);
731 8ad51794 2004-03-25 devnull }
732 8ad51794 2004-03-25 devnull ntypeb += nb;
733 8ad51794 2004-03-25 devnull ntyper += nr;
734 c8471ac5 2010-10-13 rsc }
735 c8471ac5 2010-10-13 rsc
736 c8471ac5 2010-10-13 rsc int
737 c8471ac5 2010-10-13 rsc israw(int fd0)
738 c8471ac5 2010-10-13 rsc {
739 c8471ac5 2010-10-13 rsc return (!cook || password) && !isecho(fd0);
740 8ad51794 2004-03-25 devnull }
741 8ad51794 2004-03-25 devnull
742 8ad51794 2004-03-25 devnull void
743 8ad51794 2004-03-25 devnull sendtype(int fd0)
744 8ad51794 2004-03-25 devnull {
745 ef5c6a6e 2010-09-03 rsc int i, n, nr, raw;
746 fa325e9b 2020-01-10 cross
747 c8471ac5 2010-10-13 rsc raw = israw(fd0);
748 ef5c6a6e 2010-09-03 rsc while(ntypebreak || (raw && ntypeb > 0)){
749 8ad51794 2004-03-25 devnull for(i=0; i<ntypeb; i++)
750 ef5c6a6e 2010-09-03 rsc if(typing[i]=='\n' || typing[i]==0x04 || (i==ntypeb-1 && raw)){
751 ef5c6a6e 2010-09-03 rsc if((typing[i] == '\n' || typing[i] == 0x04) && ntypebreak > 0)
752 ef5c6a6e 2010-09-03 rsc ntypebreak--;
753 4f30f3b4 2004-03-30 devnull n = i+1;
754 8ad51794 2004-03-25 devnull i++;
755 875351f4 2010-09-10 rsc if(!raw)
756 ef5c6a6e 2010-09-03 rsc echoed(typing, n);
757 8ad51794 2004-03-25 devnull if(write(fd0, typing, n) != n)
758 8ad51794 2004-03-25 devnull error("sending to program");
759 8ad51794 2004-03-25 devnull nr = nrunes(typing, i);
760 8ad51794 2004-03-25 devnull q.p += nr;
761 8ad51794 2004-03-25 devnull ntyper -= nr;
762 8ad51794 2004-03-25 devnull ntypeb -= i;
763 8ad51794 2004-03-25 devnull memmove(typing, typing+i, ntypeb);
764 8ad51794 2004-03-25 devnull goto cont2;
765 8ad51794 2004-03-25 devnull }
766 8ad51794 2004-03-25 devnull print("no breakchar\n");
767 8ad51794 2004-03-25 devnull ntypebreak = 0;
768 8ad51794 2004-03-25 devnull cont2:;
769 8ad51794 2004-03-25 devnull }
770 8ad51794 2004-03-25 devnull }
771 8ad51794 2004-03-25 devnull
772 8ad51794 2004-03-25 devnull void
773 ef5c6a6e 2010-09-03 rsc sendbs(int fd0, int n)
774 ef5c6a6e 2010-09-03 rsc {
775 ef5c6a6e 2010-09-03 rsc char buf[128];
776 ef5c6a6e 2010-09-03 rsc int m;
777 ef5c6a6e 2010-09-03 rsc
778 ef5c6a6e 2010-09-03 rsc memset(buf, 0x08, sizeof buf);
779 ef5c6a6e 2010-09-03 rsc while(n > 0) {
780 ef5c6a6e 2010-09-03 rsc m = sizeof buf;
781 ef5c6a6e 2010-09-03 rsc if(m > n)
782 ef5c6a6e 2010-09-03 rsc m = n;
783 ef5c6a6e 2010-09-03 rsc n -= m;
784 ef5c6a6e 2010-09-03 rsc write(fd0, buf, m);
785 ef5c6a6e 2010-09-03 rsc }
786 ef5c6a6e 2010-09-03 rsc }
787 ef5c6a6e 2010-09-03 rsc
788 ef5c6a6e 2010-09-03 rsc void
789 8ad51794 2004-03-25 devnull deltype(uint p0, uint p1)
790 8ad51794 2004-03-25 devnull {
791 8ad51794 2004-03-25 devnull int w;
792 8ad51794 2004-03-25 devnull uint p, b0, b1;
793 8ad51794 2004-03-25 devnull Rune r;
794 8ad51794 2004-03-25 devnull
795 8ad51794 2004-03-25 devnull /* advance to p0 */
796 8ad51794 2004-03-25 devnull b0 = 0;
797 8ad51794 2004-03-25 devnull for(p=0; p<p0 && b0<ntypeb; p++){
798 8ad51794 2004-03-25 devnull w = chartorune(&r, typing+b0);
799 8ad51794 2004-03-25 devnull b0 += w;
800 8ad51794 2004-03-25 devnull }
801 8ad51794 2004-03-25 devnull if(p != p0)
802 8ad51794 2004-03-25 devnull error("deltype 1");
803 8ad51794 2004-03-25 devnull /* advance to p1 */
804 8ad51794 2004-03-25 devnull b1 = b0;
805 8ad51794 2004-03-25 devnull for(; p<p1 && b1<ntypeb; p++){
806 8ad51794 2004-03-25 devnull w = chartorune(&r, typing+b1);
807 8ad51794 2004-03-25 devnull b1 += w;
808 8ad51794 2004-03-25 devnull if(r=='\n' || r==0x04)
809 8ad51794 2004-03-25 devnull ntypebreak--;
810 8ad51794 2004-03-25 devnull }
811 8ad51794 2004-03-25 devnull if(p != p1)
812 8ad51794 2004-03-25 devnull error("deltype 2");
813 8ad51794 2004-03-25 devnull memmove(typing+b0, typing+b1, ntypeb-b1);
814 8ad51794 2004-03-25 devnull ntypeb -= b1-b0;
815 8ad51794 2004-03-25 devnull ntyper -= p1-p0;
816 8ad51794 2004-03-25 devnull }
817 8ad51794 2004-03-25 devnull
818 8ad51794 2004-03-25 devnull void
819 452c0935 2005-01-04 devnull type(Event *e, int fd0, CFid *afd, CFid *dfd)
820 8ad51794 2004-03-25 devnull {
821 8ad51794 2004-03-25 devnull int m, n, nr;
822 8ad51794 2004-03-25 devnull char buf[128];
823 8ad51794 2004-03-25 devnull
824 8ad51794 2004-03-25 devnull if(e->nr > 0)
825 8ad51794 2004-03-25 devnull addtype(e->c1, e->q0-q.p, e->b, e->nb, e->nr);
826 8ad51794 2004-03-25 devnull else{
827 8ad51794 2004-03-25 devnull m = e->q0;
828 8ad51794 2004-03-25 devnull while(m < e->q1){
829 8ad51794 2004-03-25 devnull n = sprint(buf, "#%d", m);
830 8ad51794 2004-03-25 devnull fswrite(afd, buf, n);
831 8ad51794 2004-03-25 devnull n = fsread(dfd, buf, sizeof buf);
832 8ad51794 2004-03-25 devnull nr = nrunes(buf, n);
833 8ad51794 2004-03-25 devnull while(m+nr > e->q1){
834 8ad51794 2004-03-25 devnull do; while(n>0 && (buf[--n]&0xC0)==0x80);
835 8ad51794 2004-03-25 devnull --nr;
836 8ad51794 2004-03-25 devnull }
837 8ad51794 2004-03-25 devnull if(n == 0)
838 8ad51794 2004-03-25 devnull break;
839 8ad51794 2004-03-25 devnull addtype(e->c1, m-q.p, buf, n, nr);
840 8ad51794 2004-03-25 devnull m += nr;
841 8ad51794 2004-03-25 devnull }
842 8ad51794 2004-03-25 devnull }
843 c8471ac5 2010-10-13 rsc if(israw(fd0)) {
844 ef5c6a6e 2010-09-03 rsc n = sprint(buf, "#%d,#%d", e->q0, e->q1);
845 ef5c6a6e 2010-09-03 rsc fswrite(afd, buf, n);
846 ef5c6a6e 2010-09-03 rsc fswrite(dfd, "", 0);
847 ef5c6a6e 2010-09-03 rsc q.p -= e->q1 - e->q0;
848 ef5c6a6e 2010-09-03 rsc }
849 8ad51794 2004-03-25 devnull sendtype(fd0);
850 c8471ac5 2010-10-13 rsc if(e->nb > 0 && e->b[e->nb-1] == '\n')
851 c8471ac5 2010-10-13 rsc cook = 1;
852 8ad51794 2004-03-25 devnull }
853 8ad51794 2004-03-25 devnull
854 8ad51794 2004-03-25 devnull void
855 452c0935 2005-01-04 devnull sende(Event *e, int fd0, CFid *cfd, CFid *afd, CFid *dfd, int donl)
856 8ad51794 2004-03-25 devnull {
857 8ad51794 2004-03-25 devnull int l, m, n, nr, lastc, end;
858 8ad51794 2004-03-25 devnull char abuf[16], buf[128];
859 8ad51794 2004-03-25 devnull
860 8ad51794 2004-03-25 devnull end = q.p+ntyper;
861 8ad51794 2004-03-25 devnull l = sprint(abuf, "#%d", end);
862 8ad51794 2004-03-25 devnull fswrite(afd, abuf, l);
863 8ad51794 2004-03-25 devnull if(e->nr > 0){
864 8ad51794 2004-03-25 devnull fswrite(dfd, e->b, e->nb);
865 8ad51794 2004-03-25 devnull addtype(e->c1, ntyper, e->b, e->nb, e->nr);
866 8ad51794 2004-03-25 devnull lastc = e->r[e->nr-1];
867 8ad51794 2004-03-25 devnull }else{
868 8ad51794 2004-03-25 devnull m = e->q0;
869 8ad51794 2004-03-25 devnull lastc = 0;
870 8ad51794 2004-03-25 devnull while(m < e->q1){
871 8ad51794 2004-03-25 devnull n = sprint(buf, "#%d", m);
872 8ad51794 2004-03-25 devnull fswrite(afd, buf, n);
873 8ad51794 2004-03-25 devnull n = fsread(dfd, buf, sizeof buf);
874 8ad51794 2004-03-25 devnull nr = nrunes(buf, n);
875 8ad51794 2004-03-25 devnull while(m+nr > e->q1){
876 8ad51794 2004-03-25 devnull do; while(n>0 && (buf[--n]&0xC0)==0x80);
877 8ad51794 2004-03-25 devnull --nr;
878 8ad51794 2004-03-25 devnull }
879 8ad51794 2004-03-25 devnull if(n == 0)
880 8ad51794 2004-03-25 devnull break;
881 8ad51794 2004-03-25 devnull l = sprint(abuf, "#%d", end);
882 8ad51794 2004-03-25 devnull fswrite(afd, abuf, l);
883 8ad51794 2004-03-25 devnull fswrite(dfd, buf, n);
884 8ad51794 2004-03-25 devnull addtype(e->c1, ntyper, buf, n, nr);
885 8ad51794 2004-03-25 devnull lastc = buf[n-1];
886 8ad51794 2004-03-25 devnull m += nr;
887 8ad51794 2004-03-25 devnull end += nr;
888 8ad51794 2004-03-25 devnull }
889 8ad51794 2004-03-25 devnull }
890 8ad51794 2004-03-25 devnull if(donl && lastc!='\n'){
891 8ad51794 2004-03-25 devnull fswrite(dfd, "\n", 1);
892 8ad51794 2004-03-25 devnull addtype(e->c1, ntyper, "\n", 1, 1);
893 8ad51794 2004-03-25 devnull }
894 8ad51794 2004-03-25 devnull fswrite(cfd, "dot=addr", 8);
895 8ad51794 2004-03-25 devnull sendtype(fd0);
896 8ad51794 2004-03-25 devnull }