Annotation of src/sys/compat/common/tty_43.c, Revision 1.13
1.13 ! lukem 1: /* $NetBSD: tty_43.c,v 1.12 2000/11/08 22:51:01 eeh Exp $ */
1.1 christos 2:
3: /*-
4: * Copyright (c) 1982, 1986, 1991, 1993
5: * The Regents of the University of California. All rights reserved.
6: *
7: * Redistribution and use in source and binary forms, with or without
8: * modification, are permitted provided that the following conditions
9: * are met:
10: * 1. Redistributions of source code must retain the above copyright
11: * notice, this list of conditions and the following disclaimer.
12: * 2. Redistributions in binary form must reproduce the above copyright
13: * notice, this list of conditions and the following disclaimer in the
14: * documentation and/or other materials provided with the distribution.
15: * 3. All advertising materials mentioning features or use of this software
16: * must display the following acknowledgement:
17: * This product includes software developed by the University of
18: * California, Berkeley and its contributors.
19: * 4. Neither the name of the University nor the names of its contributors
20: * may be used to endorse or promote products derived from this software
21: * without specific prior written permission.
22: *
23: * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
24: * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
25: * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
26: * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
27: * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
28: * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
29: * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
30: * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
31: * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
32: * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
33: * SUCH DAMAGE.
34: *
1.8 fvdl 35: * @(#)tty_compat.c 8.2 (Berkeley) 1/9/95
1.1 christos 36: */
37:
38: /*
39: * mapping routines for old line discipline (yuck)
40: */
1.13 ! lukem 41:
! 42: #include <sys/cdefs.h>
! 43: __KERNEL_RCSID(0, "$NetBSD$");
! 44:
1.1 christos 45: #include <sys/param.h>
46: #include <sys/systm.h>
47: #include <sys/ioctl.h>
48: #include <sys/proc.h>
1.11 itohy 49: #include <sys/conf.h>
1.1 christos 50: #include <sys/tty.h>
51: #include <sys/termios.h>
52: #include <sys/file.h>
53: #include <sys/kernel.h>
54: #include <sys/syslog.h>
1.2 christos 55: #include <sys/ioctl_compat.h>
1.1 christos 56:
1.4 veego 57: /*
58: * XXX libcompat files should be included with config attributes
59: */
60: #ifdef COMPAT_OLDTTY
61:
1.1 christos 62: int ttydebug = 0;
63:
64: static struct speedtab compatspeeds[] = {
65: #define MAX_SPEED 17
66: { 115200, 17 },
67: { 57600, 16 },
68: { 38400, 15 },
69: { 19200, 14 },
70: { 9600, 13 },
71: { 4800, 12 },
72: { 2400, 11 },
73: { 1800, 10 },
74: { 1200, 9 },
75: { 600, 8 },
76: { 300, 7 },
77: { 200, 6 },
78: { 150, 5 },
79: { 134, 4 },
80: { 110, 3 },
81: { 75, 2 },
82: { 50, 1 },
83: { 0, 0 },
84: { -1, -1 },
85: };
86: static int compatspcodes[] = {
87: 0, 50, 75, 110, 134, 150, 200, 300, 600, 1200,
88: 1800, 2400, 4800, 9600, 19200, 38400, 57600, 115200
89: };
90:
91: /* Macros to clear/set/test flags. */
92: #define SET(t, f) (t) |= (f)
93: #define CLR(t, f) (t) &= ~(f)
94: #define ISSET(t, f) ((t) & (f))
95:
1.3 christos 96: int ttcompatgetflags __P((struct tty *));
97: void ttcompatsetflags __P((struct tty *, struct termios *));
98: void ttcompatsetlflags __P((struct tty *, struct termios *));
99:
1.1 christos 100: /*ARGSUSED*/
1.3 christos 101: int
1.1 christos 102: ttcompat(tp, com, data, flag, p)
1.10 augustss 103: struct tty *tp;
1.1 christos 104: u_long com;
105: caddr_t data;
106: int flag;
107: struct proc *p;
108: {
109:
110: switch (com) {
111: case TIOCGETP: {
1.10 augustss 112: struct sgttyb *sg = (struct sgttyb *)data;
113: u_char *cc = tp->t_cc;
114: int speed;
1.1 christos 115:
116: speed = ttspeedtab(tp->t_ospeed, compatspeeds);
117: sg->sg_ospeed = (speed == -1) ? MAX_SPEED : speed;
118: if (tp->t_ispeed == 0)
119: sg->sg_ispeed = sg->sg_ospeed;
120: else {
121: speed = ttspeedtab(tp->t_ispeed, compatspeeds);
122: sg->sg_ispeed = (speed == -1) ? MAX_SPEED : speed;
123: }
124: sg->sg_erase = cc[VERASE];
125: sg->sg_kill = cc[VKILL];
126: sg->sg_flags = ttcompatgetflags(tp);
127: break;
128: }
129:
130: case TIOCSETP:
131: case TIOCSETN: {
1.10 augustss 132: struct sgttyb *sg = (struct sgttyb *)data;
1.1 christos 133: struct termios term;
134: int speed;
135:
136: term = tp->t_termios;
137: if ((speed = sg->sg_ispeed) > MAX_SPEED || speed < 0)
138: term.c_ispeed = speed;
139: else
140: term.c_ispeed = compatspcodes[speed];
141: if ((speed = sg->sg_ospeed) > MAX_SPEED || speed < 0)
142: term.c_ospeed = speed;
143: else
144: term.c_ospeed = compatspcodes[speed];
145: term.c_cc[VERASE] = sg->sg_erase;
146: term.c_cc[VKILL] = sg->sg_kill;
147: tp->t_flags = (ttcompatgetflags(tp)&0xffff0000) | (sg->sg_flags&0xffff);
148: ttcompatsetflags(tp, &term);
149: return (ttioctl(tp, com == TIOCSETP ? TIOCSETAF : TIOCSETA,
150: (caddr_t)&term, flag, p));
151: }
152:
153: case TIOCGETC: {
154: struct tchars *tc = (struct tchars *)data;
1.10 augustss 155: u_char *cc = tp->t_cc;
1.1 christos 156:
157: tc->t_intrc = cc[VINTR];
158: tc->t_quitc = cc[VQUIT];
159: tc->t_startc = cc[VSTART];
160: tc->t_stopc = cc[VSTOP];
161: tc->t_eofc = cc[VEOF];
162: tc->t_brkc = cc[VEOL];
163: break;
164: }
165: case TIOCSETC: {
166: struct tchars *tc = (struct tchars *)data;
1.10 augustss 167: u_char *cc = tp->t_cc;
1.1 christos 168:
169: cc[VINTR] = tc->t_intrc;
170: cc[VQUIT] = tc->t_quitc;
171: cc[VSTART] = tc->t_startc;
172: cc[VSTOP] = tc->t_stopc;
173: cc[VEOF] = tc->t_eofc;
174: cc[VEOL] = tc->t_brkc;
1.5 mark 175: if (tc->t_brkc == (char)-1)
1.1 christos 176: cc[VEOL2] = _POSIX_VDISABLE;
177: break;
178: }
179: case TIOCSLTC: {
180: struct ltchars *ltc = (struct ltchars *)data;
1.10 augustss 181: u_char *cc = tp->t_cc;
1.1 christos 182:
183: cc[VSUSP] = ltc->t_suspc;
184: cc[VDSUSP] = ltc->t_dsuspc;
185: cc[VREPRINT] = ltc->t_rprntc;
186: cc[VDISCARD] = ltc->t_flushc;
187: cc[VWERASE] = ltc->t_werasc;
188: cc[VLNEXT] = ltc->t_lnextc;
189: break;
190: }
191: case TIOCGLTC: {
192: struct ltchars *ltc = (struct ltchars *)data;
1.10 augustss 193: u_char *cc = tp->t_cc;
1.1 christos 194:
195: ltc->t_suspc = cc[VSUSP];
196: ltc->t_dsuspc = cc[VDSUSP];
197: ltc->t_rprntc = cc[VREPRINT];
198: ltc->t_flushc = cc[VDISCARD];
199: ltc->t_werasc = cc[VWERASE];
200: ltc->t_lnextc = cc[VLNEXT];
201: break;
202: }
203: case TIOCLBIS:
204: case TIOCLBIC:
205: case TIOCLSET: {
206: struct termios term;
207: int flags;
208:
209: term = tp->t_termios;
210: flags = ttcompatgetflags(tp);
211: switch (com) {
212: case TIOCLSET:
213: tp->t_flags = (flags&0xffff) | (*(int *)data<<16);
214: break;
215: case TIOCLBIS:
216: tp->t_flags = flags | (*(int *)data<<16);
217: break;
218: case TIOCLBIC:
219: tp->t_flags = flags & ~(*(int *)data<<16);
220: break;
221: }
222: ttcompatsetlflags(tp, &term);
223: return (ttioctl(tp, TIOCSETA, (caddr_t)&term, flag, p));
224: }
225: case TIOCLGET:
226: *(int *)data = ttcompatgetflags(tp)>>16;
227: if (ttydebug)
1.7 christos 228: printf("CLGET: returning %x\n", *(int *)data);
1.1 christos 229: break;
230:
231: case OTIOCGETD:
1.12 eeh 232: *(int *)data = (tp->t_linesw != NULL) ? tp->t_linesw->l_no : 2;
1.1 christos 233: break;
234:
235: case OTIOCSETD: {
236: int ldisczero = 0;
237:
238: return (ttioctl(tp, TIOCSETD,
239: *(int *)data == 2 ? (caddr_t)&ldisczero : data, flag,
240: p));
241: }
242:
243: case OTIOCCONS:
244: *(int *)data = 1;
245: return (ttioctl(tp, TIOCCONS, data, flag, p));
246:
247: case TIOCHPCL:
248: SET(tp->t_cflag, HUPCL);
249: break;
250:
251: case TIOCGSID:
252: if (tp->t_session == NULL)
253: return ENOTTY;
254:
255: if (tp->t_session->s_leader == NULL)
256: return ENOTTY;
257:
258: *(int *) data = tp->t_session->s_leader->p_pid;
259: break;
260:
261: default:
262: return (-1);
263: }
264: return (0);
265: }
266:
267: int
268: ttcompatgetflags(tp)
1.10 augustss 269: struct tty *tp;
1.1 christos 270: {
1.10 augustss 271: tcflag_t iflag = tp->t_iflag;
272: tcflag_t lflag = tp->t_lflag;
273: tcflag_t oflag = tp->t_oflag;
274: tcflag_t cflag = tp->t_cflag;
275: int flags = 0;
1.1 christos 276:
277: if (ISSET(iflag, IXOFF))
278: SET(flags, TANDEM);
279: if (ISSET(iflag, ICRNL) || ISSET(oflag, ONLCR))
280: SET(flags, CRMOD);
281: if (ISSET(cflag, PARENB)) {
282: if (ISSET(iflag, INPCK)) {
283: if (ISSET(cflag, PARODD))
284: SET(flags, ODDP);
285: else
286: SET(flags, EVENP);
287: } else
288: SET(flags, ANYP);
289: }
290:
291: if (!ISSET(lflag, ICANON)) {
292: /* fudge */
293: if (ISSET(iflag, IXON) || ISSET(lflag, ISIG|IEXTEN) ||
294: ISSET(cflag, PARENB))
295: SET(flags, CBREAK);
296: else
297: SET(flags, RAW);
298: }
299:
300: if (ISSET(flags, RAW))
301: SET(flags, ISSET(tp->t_flags, LITOUT|PASS8));
302: else if (ISSET(cflag, CSIZE) == CS8) {
303: if (!ISSET(oflag, OPOST))
304: SET(flags, LITOUT);
305: if (!ISSET(iflag, ISTRIP))
306: SET(flags, PASS8);
307: }
308:
309: if (ISSET(cflag, MDMBUF))
310: SET(flags, MDMBUF);
311: if (!ISSET(cflag, HUPCL))
312: SET(flags, NOHANG);
313: if (ISSET(oflag, OXTABS))
314: SET(flags, XTABS);
315: if (ISSET(lflag, ECHOE))
316: SET(flags, CRTERA|CRTBS);
317: if (ISSET(lflag, ECHOKE))
318: SET(flags, CRTKIL|CRTBS);
319: if (ISSET(lflag, ECHOPRT))
320: SET(flags, PRTERA);
321: if (ISSET(lflag, ECHOCTL))
322: SET(flags, CTLECH);
323: if (!ISSET(iflag, IXANY))
324: SET(flags, DECCTQ);
325: SET(flags, ISSET(lflag, ECHO|TOSTOP|FLUSHO|PENDIN|NOFLSH));
326: if (ttydebug)
1.7 christos 327: printf("getflags: %x\n", flags);
1.1 christos 328: return (flags);
329: }
330:
1.3 christos 331: void
1.1 christos 332: ttcompatsetflags(tp, t)
1.10 augustss 333: struct tty *tp;
334: struct termios *t;
1.1 christos 335: {
1.10 augustss 336: int flags = tp->t_flags;
337: tcflag_t iflag = t->c_iflag;
338: tcflag_t oflag = t->c_oflag;
339: tcflag_t lflag = t->c_lflag;
340: tcflag_t cflag = t->c_cflag;
1.1 christos 341:
342: if (ISSET(flags, TANDEM))
343: SET(iflag, IXOFF);
344: else
345: CLR(iflag, IXOFF);
346: if (ISSET(flags, ECHO))
347: SET(lflag, ECHO);
348: else
349: CLR(lflag, ECHO);
350: if (ISSET(flags, CRMOD)) {
351: SET(iflag, ICRNL);
352: SET(oflag, ONLCR);
353: } else {
354: CLR(iflag, ICRNL);
355: CLR(oflag, ONLCR);
356: }
357: if (ISSET(flags, XTABS))
358: SET(oflag, OXTABS);
359: else
360: CLR(oflag, OXTABS);
361:
362:
363: if (ISSET(flags, RAW)) {
364: iflag &= IXOFF;
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);
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: SET(iflag, ISTRIP);
410: SET(oflag, OPOST);
411: }
412:
413: t->c_iflag = iflag;
414: t->c_oflag = oflag;
415: t->c_lflag = lflag;
416: t->c_cflag = cflag;
417: }
418:
1.3 christos 419: void
1.1 christos 420: ttcompatsetlflags(tp, t)
1.10 augustss 421: struct tty *tp;
422: struct termios *t;
1.1 christos 423: {
1.10 augustss 424: int flags = tp->t_flags;
425: tcflag_t iflag = t->c_iflag;
426: tcflag_t oflag = t->c_oflag;
427: tcflag_t lflag = t->c_lflag;
428: tcflag_t cflag = t->c_cflag;
1.1 christos 429:
430: /* Nothing we can do with CRTBS. */
431: if (ISSET(flags, PRTERA))
432: SET(lflag, ECHOPRT);
433: else
434: CLR(lflag, ECHOPRT);
435: if (ISSET(flags, CRTERA))
436: SET(lflag, ECHOE);
437: else
438: CLR(lflag, ECHOE);
439: /* Nothing we can do with TILDE. */
440: if (ISSET(flags, MDMBUF))
441: SET(cflag, MDMBUF);
442: else
443: CLR(cflag, MDMBUF);
444: if (ISSET(flags, NOHANG))
445: CLR(cflag, HUPCL);
446: else
447: SET(cflag, HUPCL);
448: if (ISSET(flags, CRTKIL))
449: SET(lflag, ECHOKE);
450: else
451: CLR(lflag, ECHOKE);
452: if (ISSET(flags, CTLECH))
453: SET(lflag, ECHOCTL);
454: else
455: CLR(lflag, ECHOCTL);
456: if (!ISSET(flags, DECCTQ))
457: SET(iflag, IXANY);
458: else
459: CLR(iflag, IXANY);
460: CLR(lflag, TOSTOP|FLUSHO|PENDIN|NOFLSH);
461: SET(lflag, ISSET(flags, TOSTOP|FLUSHO|PENDIN|NOFLSH));
462:
463: if (ISSET(flags, RAW|LITOUT|PASS8)) {
464: CLR(cflag, CSIZE);
465: SET(cflag, CS8);
466: if (!ISSET(flags, RAW|PASS8))
467: SET(iflag, ISTRIP);
468: else
469: CLR(iflag, ISTRIP);
470: if (!ISSET(flags, RAW|LITOUT))
471: SET(oflag, OPOST);
472: else
473: CLR(oflag, OPOST);
474: } else {
475: CLR(cflag, CSIZE);
476: SET(cflag, CS7);
477: SET(iflag, ISTRIP);
478: SET(oflag, OPOST);
479: }
480:
481: t->c_iflag = iflag;
482: t->c_oflag = oflag;
483: t->c_lflag = lflag;
484: t->c_cflag = cflag;
485: }
1.4 veego 486:
487: #endif /* COMPAT_OLDTTY */
CVSweb <webmaster@jp.NetBSD.org>