This source file includes following definitions.
- ttcompat
- ttcompatgetflags
- ttcompatsetflags
- ttcompatsetlflags
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38 #include <sys/param.h>
39 #include <sys/systm.h>
40 #include <sys/ioctl.h>
41 #include <sys/proc.h>
42 #include <sys/tty.h>
43 #include <sys/termios.h>
44 #include <sys/file.h>
45 #include <sys/conf.h>
46 #include <sys/kernel.h>
47 #include <sys/syslog.h>
48 #include <sys/ioctl_compat.h>
49
50
51
52
53 #ifdef COMPAT_OLDTTY
54
55 int ttydebug = 0;
56
57 static const struct speedtab compatspeeds[] = {
58 #define MAX_SPEED 17
59 { 115200, 17 },
60 { 57600, 16 },
61 { 38400, 15 },
62 { 19200, 14 },
63 { 9600, 13 },
64 { 4800, 12 },
65 { 2400, 11 },
66 { 1800, 10 },
67 { 1200, 9 },
68 { 600, 8 },
69 { 300, 7 },
70 { 200, 6 },
71 { 150, 5 },
72 { 134, 4 },
73 { 110, 3 },
74 { 75, 2 },
75 { 50, 1 },
76 { 0, 0 },
77 { -1, -1 },
78 };
79 static const int compatspcodes[] = {
80 0, 50, 75, 110, 134, 150, 200, 300, 600, 1200,
81 1800, 2400, 4800, 9600, 19200, 38400, 57600, 115200
82 };
83
84 int ttcompatgetflags(struct tty *);
85 void ttcompatsetflags(struct tty *, struct termios *);
86 void ttcompatsetlflags(struct tty *, struct termios *);
87
88
89 int
90 ttcompat(tp, com, data, flag, p)
91 register struct tty *tp;
92 u_long com;
93 caddr_t data;
94 int flag;
95 struct proc *p;
96 {
97
98 switch (com) {
99 case TIOCGETP: {
100 register struct sgttyb *sg = (struct sgttyb *)data;
101 register u_char *cc = tp->t_cc;
102 register int speed;
103
104 speed = ttspeedtab(tp->t_ospeed, compatspeeds);
105 sg->sg_ospeed = (speed == -1) ? MAX_SPEED : speed;
106 if (tp->t_ispeed == 0)
107 sg->sg_ispeed = sg->sg_ospeed;
108 else {
109 speed = ttspeedtab(tp->t_ispeed, compatspeeds);
110 sg->sg_ispeed = (speed == -1) ? MAX_SPEED : speed;
111 }
112 sg->sg_erase = cc[VERASE];
113 sg->sg_kill = cc[VKILL];
114 sg->sg_flags = ttcompatgetflags(tp);
115 break;
116 }
117
118 case TIOCSETP:
119 case TIOCSETN: {
120 register struct sgttyb *sg = (struct sgttyb *)data;
121 struct termios term;
122 int speed;
123
124 term = tp->t_termios;
125 if ((speed = sg->sg_ispeed) > MAX_SPEED || speed < 0)
126 term.c_ispeed = speed;
127 else
128 term.c_ispeed = compatspcodes[speed];
129 if ((speed = sg->sg_ospeed) > MAX_SPEED || speed < 0)
130 term.c_ospeed = speed;
131 else
132 term.c_ospeed = compatspcodes[speed];
133 term.c_cc[VERASE] = sg->sg_erase;
134 term.c_cc[VKILL] = sg->sg_kill;
135 tp->t_flags = (ttcompatgetflags(tp)&0xffff0000) | (sg->sg_flags&0xffff);
136 ttcompatsetflags(tp, &term);
137 return (ttioctl(tp, com == TIOCSETP ? TIOCSETAF : TIOCSETA,
138 (caddr_t)&term, flag, p));
139 }
140
141 case TIOCGETC: {
142 struct tchars *tc = (struct tchars *)data;
143 register u_char *cc = tp->t_cc;
144
145 tc->t_intrc = cc[VINTR];
146 tc->t_quitc = cc[VQUIT];
147 tc->t_startc = cc[VSTART];
148 tc->t_stopc = cc[VSTOP];
149 tc->t_eofc = cc[VEOF];
150 tc->t_brkc = cc[VEOL];
151 break;
152 }
153 case TIOCSETC: {
154 struct tchars *tc = (struct tchars *)data;
155 register u_char *cc = tp->t_cc;
156
157 cc[VINTR] = tc->t_intrc;
158 cc[VQUIT] = tc->t_quitc;
159 cc[VSTART] = tc->t_startc;
160 cc[VSTOP] = tc->t_stopc;
161 cc[VEOF] = tc->t_eofc;
162 cc[VEOL] = tc->t_brkc;
163 if (tc->t_brkc == (char)-1)
164 cc[VEOL2] = _POSIX_VDISABLE;
165 break;
166 }
167 case TIOCSLTC: {
168 struct ltchars *ltc = (struct ltchars *)data;
169 register u_char *cc = tp->t_cc;
170
171 cc[VSUSP] = ltc->t_suspc;
172 cc[VDSUSP] = ltc->t_dsuspc;
173 cc[VREPRINT] = ltc->t_rprntc;
174 cc[VDISCARD] = ltc->t_flushc;
175 cc[VWERASE] = ltc->t_werasc;
176 cc[VLNEXT] = ltc->t_lnextc;
177 break;
178 }
179 case TIOCGLTC: {
180 struct ltchars *ltc = (struct ltchars *)data;
181 register u_char *cc = tp->t_cc;
182
183 ltc->t_suspc = cc[VSUSP];
184 ltc->t_dsuspc = cc[VDSUSP];
185 ltc->t_rprntc = cc[VREPRINT];
186 ltc->t_flushc = cc[VDISCARD];
187 ltc->t_werasc = cc[VWERASE];
188 ltc->t_lnextc = cc[VLNEXT];
189 break;
190 }
191 case TIOCLBIS:
192 case TIOCLBIC:
193 case TIOCLSET: {
194 struct termios term;
195 int flags;
196
197 term = tp->t_termios;
198 flags = ttcompatgetflags(tp);
199 switch (com) {
200 case TIOCLSET:
201 tp->t_flags = (flags&0xffff) | (*(int *)data<<16);
202 break;
203 case TIOCLBIS:
204 tp->t_flags = flags | (*(int *)data<<16);
205 break;
206 case TIOCLBIC:
207 tp->t_flags = flags & ~(*(int *)data<<16);
208 break;
209 }
210 ttcompatsetlflags(tp, &term);
211 return (ttioctl(tp, TIOCSETA, (caddr_t)&term, flag, p));
212 }
213 case TIOCLGET:
214 *(int *)data = ttcompatgetflags(tp)>>16;
215 if (ttydebug)
216 printf("CLGET: returning %x\n", *(int *)data);
217 break;
218
219 case OTIOCGETD:
220 *(int *)data = tp->t_line ? tp->t_line : 2;
221 break;
222
223 case OTIOCSETD: {
224 int ldisczero = 0;
225
226 return (ttioctl(tp, TIOCSETD,
227 *(int *)data == 2 ? (caddr_t)&ldisczero : data, flag,
228 p));
229 }
230
231 case OTIOCCONS:
232 *(int *)data = 1;
233 return (ttioctl(tp, TIOCCONS, data, flag, p));
234
235 case TIOCHPCL:
236 SET(tp->t_cflag, HUPCL);
237 break;
238
239 case TIOCGSID:
240 if (tp->t_session == NULL)
241 return ENOTTY;
242
243 if (tp->t_session->s_leader == NULL)
244 return ENOTTY;
245
246 *(int *) data = tp->t_session->s_leader->p_pid;
247 break;
248
249 default:
250 return (-1);
251 }
252 return (0);
253 }
254
255 int
256 ttcompatgetflags(tp)
257 register struct tty *tp;
258 {
259 register tcflag_t iflag = tp->t_iflag;
260 register tcflag_t lflag = tp->t_lflag;
261 register tcflag_t oflag = tp->t_oflag;
262 register tcflag_t cflag = tp->t_cflag;
263 register int flags = 0;
264
265 if (ISSET(iflag, IXOFF))
266 SET(flags, TANDEM);
267 if (ISSET(iflag, ICRNL) || ISSET(oflag, ONLCR))
268 SET(flags, CRMOD);
269 if (ISSET(cflag, PARENB)) {
270 if (ISSET(iflag, INPCK)) {
271 if (ISSET(cflag, PARODD))
272 SET(flags, ODDP);
273 else
274 SET(flags, EVENP);
275 } else
276 SET(flags, ANYP);
277 }
278
279 if (!ISSET(lflag, ICANON)) {
280
281 if (ISSET(iflag, IXON) || ISSET(lflag, ISIG|IEXTEN) ||
282 ISSET(cflag, PARENB))
283 SET(flags, CBREAK);
284 else
285 SET(flags, RAW);
286 }
287
288 if (ISSET(flags, RAW))
289 SET(flags, ISSET(tp->t_flags, LITOUT|PASS8));
290 else if (ISSET(cflag, CSIZE) == CS8) {
291 if (!ISSET(oflag, OPOST))
292 SET(flags, LITOUT);
293 if (!ISSET(iflag, ISTRIP))
294 SET(flags, PASS8);
295 }
296
297 if (ISSET(cflag, MDMBUF))
298 SET(flags, MDMBUF);
299 if (!ISSET(cflag, HUPCL))
300 SET(flags, NOHANG);
301 if (ISSET(cflag, XCASE) && ISSET(iflag, IUCLC) && ISSET(oflag, OLCUC))
302 SET(flags, LCASE);
303 if (ISSET(oflag, OXTABS))
304 SET(flags, XTABS);
305 if (ISSET(lflag, ECHOE))
306 SET(flags, CRTERA|CRTBS);
307 if (ISSET(lflag, ECHOKE))
308 SET(flags, CRTKIL|CRTBS);
309 if (ISSET(lflag, ECHOPRT))
310 SET(flags, PRTERA);
311 if (ISSET(lflag, ECHOCTL))
312 SET(flags, CTLECH);
313 if (!ISSET(iflag, IXANY))
314 SET(flags, DECCTQ);
315 SET(flags, ISSET(lflag, ECHO|TOSTOP|FLUSHO|PENDIN|NOFLSH));
316 if (ttydebug)
317 printf("getflags: %x\n", flags);
318 return (flags);
319 }
320
321 void
322 ttcompatsetflags(tp, t)
323 register struct tty *tp;
324 register struct termios *t;
325 {
326 register int flags = tp->t_flags;
327 register tcflag_t iflag = t->c_iflag;
328 register tcflag_t oflag = t->c_oflag;
329 register tcflag_t lflag = t->c_lflag;
330 register tcflag_t cflag = t->c_cflag;
331
332 if (ISSET(flags, TANDEM))
333 SET(iflag, IXOFF);
334 else
335 CLR(iflag, IXOFF);
336 if (ISSET(flags, ECHO))
337 SET(lflag, ECHO);
338 else
339 CLR(lflag, ECHO);
340 if (ISSET(flags, CRMOD)) {
341 SET(iflag, ICRNL);
342 SET(oflag, ONLCR);
343 } else {
344 CLR(iflag, ICRNL);
345 CLR(oflag, ONLCR);
346 }
347 if (ISSET(flags, XTABS))
348 SET(oflag, OXTABS);
349 else
350 CLR(oflag, OXTABS);
351 if (ISSET(flags, LCASE)) {
352 SET(iflag, IUCLC);
353 SET(oflag, OLCUC);
354 SET(cflag, XCASE);
355 }
356 else {
357 CLR(iflag, IUCLC);
358 CLR(oflag, OLCUC);
359 CLR(cflag, XCASE);
360 }
361
362
363 if (ISSET(flags, RAW)) {
364 iflag &= IXOFF|IXANY;
365 CLR(lflag, ISIG|ICANON|IEXTEN);
366 CLR(cflag, PARENB);
367 } else {
368 SET(iflag, BRKINT|IXON|IMAXBEL);
369 SET(lflag, ISIG|IEXTEN);
370 if (ISSET(flags, CBREAK))
371 CLR(lflag, ICANON);
372 else
373 SET(lflag, ICANON);
374 switch (ISSET(flags, ANYP)) {
375 case 0:
376 CLR(cflag, PARENB);
377 break;
378 case ANYP:
379 SET(cflag, PARENB);
380 CLR(iflag, INPCK);
381 break;
382 case EVENP:
383 SET(cflag, PARENB);
384 SET(iflag, INPCK);
385 CLR(cflag, PARODD);
386 break;
387 case ODDP:
388 SET(cflag, PARENB);
389 SET(iflag, INPCK);
390 SET(cflag, PARODD);
391 break;
392 }
393 }
394
395 if (ISSET(flags, RAW|LITOUT|PASS8)) {
396 CLR(cflag, CSIZE|XCASE);
397 SET(cflag, CS8);
398 if (!ISSET(flags, RAW|PASS8))
399 SET(iflag, ISTRIP);
400 else
401 CLR(iflag, ISTRIP);
402 if (!ISSET(flags, RAW|LITOUT))
403 SET(oflag, OPOST);
404 else
405 CLR(oflag, OPOST);
406 } else {
407 CLR(cflag, CSIZE);
408 SET(cflag, CS7);
409 if (ISSET(iflag, IUCLC) && ISSET(oflag, OLCUC))
410 SET(cflag, XCASE);
411 SET(iflag, ISTRIP);
412 SET(oflag, OPOST);
413 }
414
415 t->c_iflag = iflag;
416 t->c_oflag = oflag;
417 t->c_lflag = lflag;
418 t->c_cflag = cflag;
419 }
420
421 void
422 ttcompatsetlflags(tp, t)
423 register struct tty *tp;
424 register struct termios *t;
425 {
426 register int flags = tp->t_flags;
427 register tcflag_t iflag = t->c_iflag;
428 register tcflag_t oflag = t->c_oflag;
429 register tcflag_t lflag = t->c_lflag;
430 register tcflag_t cflag = t->c_cflag;
431
432
433 if (ISSET(flags, PRTERA))
434 SET(lflag, ECHOPRT);
435 else
436 CLR(lflag, ECHOPRT);
437 if (ISSET(flags, CRTERA))
438 SET(lflag, ECHOE);
439 else
440 CLR(lflag, ECHOE);
441
442 if (ISSET(flags, MDMBUF))
443 SET(cflag, MDMBUF);
444 else
445 CLR(cflag, MDMBUF);
446 if (ISSET(flags, NOHANG))
447 CLR(cflag, HUPCL);
448 else
449 SET(cflag, HUPCL);
450 if (ISSET(flags, CRTKIL))
451 SET(lflag, ECHOKE);
452 else
453 CLR(lflag, ECHOKE);
454 if (ISSET(flags, CTLECH))
455 SET(lflag, ECHOCTL);
456 else
457 CLR(lflag, ECHOCTL);
458 if (!ISSET(flags, DECCTQ))
459 SET(iflag, IXANY);
460 else
461 CLR(iflag, IXANY);
462 if (ISSET(flags, LCASE)) {
463 SET(oflag, OLCUC);
464 SET(iflag, IUCLC);
465 SET(cflag, XCASE);
466 }
467 CLR(lflag, TOSTOP|FLUSHO|PENDIN|NOFLSH);
468 SET(lflag, ISSET(flags, TOSTOP|FLUSHO|PENDIN|NOFLSH));
469
470 if (ISSET(flags, RAW|LITOUT|PASS8)) {
471 CLR(cflag, CSIZE);
472 SET(cflag, CS8);
473 if (!ISSET(flags, RAW|PASS8))
474 SET(iflag, ISTRIP);
475 else
476 CLR(iflag, ISTRIP);
477 if (!ISSET(flags, RAW|LITOUT))
478 SET(oflag, OPOST);
479 else {
480 CLR(oflag, OPOST);
481 CLR(cflag, XCASE);
482 }
483 } else {
484 CLR(cflag, CSIZE);
485 SET(cflag, CS7);
486 SET(iflag, ISTRIP);
487 SET(oflag, OPOST);
488 if (ISSET(oflag, OLCUC) && ISSET(iflag, IUCLC))
489 SET(cflag, XCASE);
490 }
491
492 t->c_iflag = iflag;
493 t->c_oflag = oflag;
494 t->c_lflag = lflag;
495 t->c_cflag = cflag;
496 }
497
498 #endif