Blame


1 941c9f36 2003-10-11 devnull #include <sys/types.h>
2 941c9f36 2003-10-11 devnull #include <sys/stat.h>
3 941c9f36 2003-10-11 devnull #include <errno.h>
4 941c9f36 2003-10-11 devnull
5 84b1cb73 2003-09-30 devnull #include <u.h>
6 84b1cb73 2003-09-30 devnull #include <libc.h>
7 84b1cb73 2003-09-30 devnull #include <draw.h>
8 84b1cb73 2003-09-30 devnull #include <thread.h>
9 84b1cb73 2003-09-30 devnull #include <mouse.h>
10 84b1cb73 2003-09-30 devnull #include <cursor.h>
11 84b1cb73 2003-09-30 devnull #include <keyboard.h>
12 84b1cb73 2003-09-30 devnull #include <frame.h>
13 84b1cb73 2003-09-30 devnull #include "flayer.h"
14 84b1cb73 2003-09-30 devnull #include "samterm.h"
15 84b1cb73 2003-09-30 devnull
16 941c9f36 2003-10-11 devnull static char *exname;
17 84b1cb73 2003-09-30 devnull
18 84b1cb73 2003-09-30 devnull void
19 84b1cb73 2003-09-30 devnull getscreen(int argc, char **argv)
20 84b1cb73 2003-09-30 devnull {
21 84b1cb73 2003-09-30 devnull char *t;
22 84b1cb73 2003-09-30 devnull
23 84b1cb73 2003-09-30 devnull USED(argc);
24 84b1cb73 2003-09-30 devnull USED(argv);
25 84b1cb73 2003-09-30 devnull if(initdraw(panic1, nil, "sam") < 0){
26 941c9f36 2003-10-11 devnull fprint(2, "samterm: initdraw: %r\n");
27 84b1cb73 2003-09-30 devnull threadexitsall("init");
28 84b1cb73 2003-09-30 devnull }
29 84b1cb73 2003-09-30 devnull t = getenv("tabstop");
30 84b1cb73 2003-09-30 devnull if(t != nil)
31 84b1cb73 2003-09-30 devnull maxtab = strtoul(t, nil, 0);
32 84b1cb73 2003-09-30 devnull draw(screen, screen->clipr, display->white, nil, ZP);
33 84b1cb73 2003-09-30 devnull }
34 84b1cb73 2003-09-30 devnull
35 84b1cb73 2003-09-30 devnull int
36 84b1cb73 2003-09-30 devnull screensize(int *w, int *h)
37 84b1cb73 2003-09-30 devnull {
38 84b1cb73 2003-09-30 devnull int fd, n;
39 84b1cb73 2003-09-30 devnull char buf[5*12+1];
40 84b1cb73 2003-09-30 devnull
41 84b1cb73 2003-09-30 devnull fd = open("/dev/screen", OREAD);
42 84b1cb73 2003-09-30 devnull if(fd < 0)
43 84b1cb73 2003-09-30 devnull return 0;
44 84b1cb73 2003-09-30 devnull n = read(fd, buf, sizeof(buf)-1);
45 84b1cb73 2003-09-30 devnull close(fd);
46 84b1cb73 2003-09-30 devnull if (n != sizeof(buf)-1)
47 84b1cb73 2003-09-30 devnull return 0;
48 84b1cb73 2003-09-30 devnull buf[n] = 0;
49 84b1cb73 2003-09-30 devnull if (h) {
50 84b1cb73 2003-09-30 devnull *h = atoi(buf+4*12)-atoi(buf+2*12);
51 84b1cb73 2003-09-30 devnull if (*h < 0)
52 84b1cb73 2003-09-30 devnull return 0;
53 84b1cb73 2003-09-30 devnull }
54 84b1cb73 2003-09-30 devnull if (w) {
55 84b1cb73 2003-09-30 devnull *w = atoi(buf+3*12)-atoi(buf+1*12);
56 84b1cb73 2003-09-30 devnull if (*w < 0)
57 84b1cb73 2003-09-30 devnull return 0;
58 84b1cb73 2003-09-30 devnull }
59 84b1cb73 2003-09-30 devnull return 1;
60 84b1cb73 2003-09-30 devnull }
61 84b1cb73 2003-09-30 devnull
62 84b1cb73 2003-09-30 devnull int
63 84b1cb73 2003-09-30 devnull snarfswap(char *fromsam, int nc, char **tosam)
64 84b1cb73 2003-09-30 devnull {
65 941c9f36 2003-10-11 devnull char *s;
66 84b1cb73 2003-09-30 devnull
67 941c9f36 2003-10-11 devnull s = getsnarf();
68 941c9f36 2003-10-11 devnull putsnarf(fromsam);
69 941c9f36 2003-10-11 devnull *tosam = s;
70 941c9f36 2003-10-11 devnull return s ? strlen(s) : 0;
71 84b1cb73 2003-09-30 devnull }
72 84b1cb73 2003-09-30 devnull
73 84b1cb73 2003-09-30 devnull void
74 84b1cb73 2003-09-30 devnull dumperrmsg(int count, int type, int count0, int c)
75 84b1cb73 2003-09-30 devnull {
76 84b1cb73 2003-09-30 devnull fprint(2, "samterm: host mesg: count %d %ux %ux %ux %s...ignored\n",
77 84b1cb73 2003-09-30 devnull count, type, count0, c, rcvstring());
78 84b1cb73 2003-09-30 devnull }
79 84b1cb73 2003-09-30 devnull
80 84b1cb73 2003-09-30 devnull void
81 84b1cb73 2003-09-30 devnull removeextern(void)
82 84b1cb73 2003-09-30 devnull {
83 84b1cb73 2003-09-30 devnull remove(exname);
84 84b1cb73 2003-09-30 devnull }
85 84b1cb73 2003-09-30 devnull
86 84b1cb73 2003-09-30 devnull Readbuf hostbuf[2];
87 84b1cb73 2003-09-30 devnull Readbuf plumbbuf[2];
88 84b1cb73 2003-09-30 devnull
89 84b1cb73 2003-09-30 devnull void
90 84b1cb73 2003-09-30 devnull extproc(void *argv)
91 84b1cb73 2003-09-30 devnull {
92 84b1cb73 2003-09-30 devnull Channel *c;
93 941c9f36 2003-10-11 devnull int i, n, which, fd;
94 84b1cb73 2003-09-30 devnull void **arg;
95 84b1cb73 2003-09-30 devnull
96 84b1cb73 2003-09-30 devnull arg = argv;
97 84b1cb73 2003-09-30 devnull c = arg[0];
98 941c9f36 2003-10-11 devnull fd = (int)arg[1];
99 84b1cb73 2003-09-30 devnull
100 84b1cb73 2003-09-30 devnull i = 0;
101 84b1cb73 2003-09-30 devnull for(;;){
102 941c9f36 2003-10-11 devnull i = 1-i; /* toggle */
103 941c9f36 2003-10-11 devnull n = read(fd, plumbbuf[i].data, sizeof plumbbuf[i].data);
104 84b1cb73 2003-09-30 devnull if(n <= 0){
105 84b1cb73 2003-09-30 devnull fprint(2, "samterm: extern read error: %r\n");
106 941c9f36 2003-10-11 devnull threadexits("extern"); /* not a fatal error */
107 84b1cb73 2003-09-30 devnull }
108 84b1cb73 2003-09-30 devnull plumbbuf[i].n = n;
109 84b1cb73 2003-09-30 devnull which = i;
110 84b1cb73 2003-09-30 devnull send(c, &which);
111 84b1cb73 2003-09-30 devnull }
112 84b1cb73 2003-09-30 devnull }
113 84b1cb73 2003-09-30 devnull
114 84b1cb73 2003-09-30 devnull void
115 84b1cb73 2003-09-30 devnull extstart(void)
116 84b1cb73 2003-09-30 devnull {
117 941c9f36 2003-10-11 devnull char *user, *disp;
118 941c9f36 2003-10-11 devnull int fd, flags;
119 84b1cb73 2003-09-30 devnull static void *arg[2];
120 84b1cb73 2003-09-30 devnull
121 941c9f36 2003-10-11 devnull user = getenv("USER");
122 941c9f36 2003-10-11 devnull if(user == nil)
123 84b1cb73 2003-09-30 devnull return;
124 941c9f36 2003-10-11 devnull disp = getenv("DISPLAY");
125 941c9f36 2003-10-11 devnull if(disp)
126 941c9f36 2003-10-11 devnull exname = smprint("/tmp/.sam.%s.%s", user, disp);
127 941c9f36 2003-10-11 devnull else
128 941c9f36 2003-10-11 devnull exname = smprint("/tmp/.sam.%s", user);
129 941c9f36 2003-10-11 devnull if(exname == nil){
130 941c9f36 2003-10-11 devnull fprint(2, "not posting for B: out of memory\n");
131 84b1cb73 2003-09-30 devnull return;
132 84b1cb73 2003-09-30 devnull }
133 941c9f36 2003-10-11 devnull
134 941c9f36 2003-10-11 devnull if(mkfifo(exname, 0600) < 0){
135 941c9f36 2003-10-11 devnull struct stat st;
136 941c9f36 2003-10-11 devnull if(errno != EEXIST || stat(exname, &st) < 0)
137 941c9f36 2003-10-11 devnull return;
138 941c9f36 2003-10-11 devnull if(!S_ISFIFO(st.st_mode)){
139 941c9f36 2003-10-11 devnull removeextern();
140 941c9f36 2003-10-11 devnull if(mkfifo(exname, 0600) < 0)
141 941c9f36 2003-10-11 devnull return;
142 941c9f36 2003-10-11 devnull }
143 941c9f36 2003-10-11 devnull }
144 941c9f36 2003-10-11 devnull
145 941c9f36 2003-10-11 devnull fd = open(exname, OREAD|O_NONBLOCK);
146 941c9f36 2003-10-11 devnull if(fd == -1){
147 941c9f36 2003-10-11 devnull removeextern();
148 941c9f36 2003-10-11 devnull return;
149 941c9f36 2003-10-11 devnull }
150 941c9f36 2003-10-11 devnull
151 84b1cb73 2003-09-30 devnull /*
152 941c9f36 2003-10-11 devnull * Turn off no-delay and provide ourselves as a lingering
153 941c9f36 2003-10-11 devnull * writer so as not to get end of file on read.
154 84b1cb73 2003-09-30 devnull */
155 941c9f36 2003-10-11 devnull flags = fcntl(fd, F_GETFL, 0);
156 941c9f36 2003-10-11 devnull if(flags<0 || fcntl(fd, F_SETFL, flags&~O_NONBLOCK)<0
157 941c9f36 2003-10-11 devnull ||open(exname, OWRITE) < 0){
158 941c9f36 2003-10-11 devnull close(fd);
159 941c9f36 2003-10-11 devnull removeextern();
160 941c9f36 2003-10-11 devnull return;
161 941c9f36 2003-10-11 devnull }
162 941c9f36 2003-10-11 devnull
163 84b1cb73 2003-09-30 devnull plumbc = chancreate(sizeof(int), 0);
164 84b1cb73 2003-09-30 devnull arg[0] = plumbc;
165 941c9f36 2003-10-11 devnull arg[1] = (void*)fd;
166 941c9f36 2003-10-11 devnull proccreate(extproc, arg, 8192);
167 84b1cb73 2003-09-30 devnull atexit(removeextern);
168 84b1cb73 2003-09-30 devnull }
169 84b1cb73 2003-09-30 devnull
170 84b1cb73 2003-09-30 devnull #if 0
171 84b1cb73 2003-09-30 devnull int
172 84b1cb73 2003-09-30 devnull plumbformat(int i)
173 84b1cb73 2003-09-30 devnull {
174 84b1cb73 2003-09-30 devnull Plumbmsg *m;
175 84b1cb73 2003-09-30 devnull char *addr, *data, *act;
176 84b1cb73 2003-09-30 devnull int n;
177 84b1cb73 2003-09-30 devnull
178 84b1cb73 2003-09-30 devnull data = (char*)plumbbuf[i].data;
179 84b1cb73 2003-09-30 devnull m = plumbunpack(data, plumbbuf[i].n);
180 84b1cb73 2003-09-30 devnull if(m == nil)
181 84b1cb73 2003-09-30 devnull return 0;
182 84b1cb73 2003-09-30 devnull n = m->ndata;
183 84b1cb73 2003-09-30 devnull if(n == 0){
184 84b1cb73 2003-09-30 devnull plumbfree(m);
185 84b1cb73 2003-09-30 devnull return 0;
186 84b1cb73 2003-09-30 devnull }
187 84b1cb73 2003-09-30 devnull act = plumblookup(m->attr, "action");
188 84b1cb73 2003-09-30 devnull if(act!=nil && strcmp(act, "showfile")!=0){
189 84b1cb73 2003-09-30 devnull /* can't handle other cases yet */
190 84b1cb73 2003-09-30 devnull plumbfree(m);
191 84b1cb73 2003-09-30 devnull return 0;
192 84b1cb73 2003-09-30 devnull }
193 84b1cb73 2003-09-30 devnull addr = plumblookup(m->attr, "addr");
194 84b1cb73 2003-09-30 devnull if(addr){
195 84b1cb73 2003-09-30 devnull if(addr[0] == '\0')
196 84b1cb73 2003-09-30 devnull addr = nil;
197 84b1cb73 2003-09-30 devnull else
198 84b1cb73 2003-09-30 devnull addr = strdup(addr); /* copy to safe storage; we'll overwrite data */
199 84b1cb73 2003-09-30 devnull }
200 84b1cb73 2003-09-30 devnull memmove(data, "B ", 2); /* we know there's enough room for this */
201 84b1cb73 2003-09-30 devnull memmove(data+2, m->data, n);
202 84b1cb73 2003-09-30 devnull n += 2;
203 84b1cb73 2003-09-30 devnull if(data[n-1] != '\n')
204 84b1cb73 2003-09-30 devnull data[n++] = '\n';
205 84b1cb73 2003-09-30 devnull if(addr != nil){
206 84b1cb73 2003-09-30 devnull if(n+strlen(addr)+1+1 <= READBUFSIZE)
207 84b1cb73 2003-09-30 devnull n += sprint(data+n, "%s\n", addr);
208 84b1cb73 2003-09-30 devnull free(addr);
209 84b1cb73 2003-09-30 devnull }
210 84b1cb73 2003-09-30 devnull plumbbuf[i].n = n;
211 84b1cb73 2003-09-30 devnull plumbfree(m);
212 84b1cb73 2003-09-30 devnull return 1;
213 84b1cb73 2003-09-30 devnull }
214 84b1cb73 2003-09-30 devnull
215 84b1cb73 2003-09-30 devnull void
216 84b1cb73 2003-09-30 devnull plumbproc(void *argv)
217 84b1cb73 2003-09-30 devnull {
218 84b1cb73 2003-09-30 devnull Channel *c;
219 84b1cb73 2003-09-30 devnull int i, n, which, *fdp;
220 84b1cb73 2003-09-30 devnull void **arg;
221 84b1cb73 2003-09-30 devnull
222 84b1cb73 2003-09-30 devnull arg = argv;
223 84b1cb73 2003-09-30 devnull c = arg[0];
224 84b1cb73 2003-09-30 devnull fdp = arg[1];
225 84b1cb73 2003-09-30 devnull
226 84b1cb73 2003-09-30 devnull i = 0;
227 84b1cb73 2003-09-30 devnull for(;;){
228 84b1cb73 2003-09-30 devnull i = 1-i; /* toggle */
229 84b1cb73 2003-09-30 devnull n = read(*fdp, plumbbuf[i].data, READBUFSIZE);
230 84b1cb73 2003-09-30 devnull if(n <= 0){
231 84b1cb73 2003-09-30 devnull fprint(2, "samterm: plumb read error: %r\n");
232 84b1cb73 2003-09-30 devnull threadexits("plumb"); /* not a fatal error */
233 84b1cb73 2003-09-30 devnull }
234 84b1cb73 2003-09-30 devnull plumbbuf[i].n = n;
235 84b1cb73 2003-09-30 devnull if(plumbformat(i)){
236 84b1cb73 2003-09-30 devnull which = i;
237 84b1cb73 2003-09-30 devnull send(c, &which);
238 84b1cb73 2003-09-30 devnull }
239 84b1cb73 2003-09-30 devnull }
240 84b1cb73 2003-09-30 devnull }
241 84b1cb73 2003-09-30 devnull
242 84b1cb73 2003-09-30 devnull int
243 84b1cb73 2003-09-30 devnull plumbstart(void)
244 84b1cb73 2003-09-30 devnull {
245 84b1cb73 2003-09-30 devnull static int fd;
246 84b1cb73 2003-09-30 devnull static void *arg[2];
247 84b1cb73 2003-09-30 devnull
248 84b1cb73 2003-09-30 devnull plumbfd = plumbopen("send", OWRITE|OCEXEC); /* not open is ok */
249 84b1cb73 2003-09-30 devnull fd = plumbopen("edit", OREAD|OCEXEC);
250 84b1cb73 2003-09-30 devnull if(fd < 0)
251 84b1cb73 2003-09-30 devnull return -1;
252 84b1cb73 2003-09-30 devnull plumbc = chancreate(sizeof(int), 0);
253 84b1cb73 2003-09-30 devnull if(plumbc == nil){
254 84b1cb73 2003-09-30 devnull close(fd);
255 84b1cb73 2003-09-30 devnull return -1;
256 84b1cb73 2003-09-30 devnull }
257 84b1cb73 2003-09-30 devnull arg[0] =plumbc;
258 84b1cb73 2003-09-30 devnull arg[1] = &fd;
259 84b1cb73 2003-09-30 devnull proccreate(plumbproc, arg, 4096);
260 84b1cb73 2003-09-30 devnull return 1;
261 84b1cb73 2003-09-30 devnull }
262 84b1cb73 2003-09-30 devnull #endif
263 84b1cb73 2003-09-30 devnull
264 84b1cb73 2003-09-30 devnull int
265 84b1cb73 2003-09-30 devnull plumbstart(void)
266 84b1cb73 2003-09-30 devnull {
267 84b1cb73 2003-09-30 devnull return -1;
268 84b1cb73 2003-09-30 devnull }
269 84b1cb73 2003-09-30 devnull
270 84b1cb73 2003-09-30 devnull void
271 84b1cb73 2003-09-30 devnull hostproc(void *arg)
272 84b1cb73 2003-09-30 devnull {
273 84b1cb73 2003-09-30 devnull Channel *c;
274 84b1cb73 2003-09-30 devnull int i, n, which;
275 84b1cb73 2003-09-30 devnull
276 84b1cb73 2003-09-30 devnull c = arg;
277 84b1cb73 2003-09-30 devnull
278 84b1cb73 2003-09-30 devnull i = 0;
279 84b1cb73 2003-09-30 devnull for(;;){
280 84b1cb73 2003-09-30 devnull i = 1-i; /* toggle */
281 941c9f36 2003-10-11 devnull n = read(hostfd[0], hostbuf[i].data, sizeof hostbuf[i].data);
282 84b1cb73 2003-09-30 devnull if(n <= 0){
283 84b1cb73 2003-09-30 devnull fprint(2, "samterm: host read error: %r\n");
284 84b1cb73 2003-09-30 devnull threadexitsall("host");
285 84b1cb73 2003-09-30 devnull }
286 84b1cb73 2003-09-30 devnull hostbuf[i].n = n;
287 84b1cb73 2003-09-30 devnull which = i;
288 84b1cb73 2003-09-30 devnull send(c, &which);
289 84b1cb73 2003-09-30 devnull }
290 84b1cb73 2003-09-30 devnull }
291 84b1cb73 2003-09-30 devnull
292 84b1cb73 2003-09-30 devnull void
293 84b1cb73 2003-09-30 devnull hoststart(void)
294 84b1cb73 2003-09-30 devnull {
295 84b1cb73 2003-09-30 devnull hostc = chancreate(sizeof(int), 0);
296 84b1cb73 2003-09-30 devnull proccreate(hostproc, hostc, 1024);
297 84b1cb73 2003-09-30 devnull }