|
|
1.1 root 1: /*
2: * Copyright (c) 1982, 1986 Regents of the University of California.
3: * All rights reserved. The Berkeley software License Agreement
4: * specifies the terms and conditions for redistribution.
5: *
6: * @(#)tty_compat.c 7.6 (Berkeley) 6/14/90
7: */
8:
9: /*
10: * mapping routines for old line discipline (yuck)
11: */
12: #ifdef COMPAT_43
13:
14: #include "param.h"
15: #include "systm.h"
16: #include "user.h"
17: #include "ioctl.h"
18: #include "tty.h"
19: #include "termios.h"
20: #include "proc.h"
21: #include "file.h"
22: #include "conf.h"
23: #include "dkstat.h"
24: #include "uio.h"
25: #include "kernel.h"
26: #include "syslog.h"
27:
28: #include "machine/reg.h"
29:
30: int ttydebug = 0;
31:
32: /* XXX - fold these two tables into one */
33: static struct speedtab compatspeeds[] = {
34: 38400, 15,
35: 19200, 14,
36: 9600, 13,
37: 4800, 12,
38: 2400, 11,
39: 1800, 10,
40: 1200, 9,
41: 600, 8,
42: 300, 7,
43: 200, 6,
44: 150, 5,
45: 134, 4,
46: 110, 3,
47: 75, 2,
48: 50, 1,
49: 0, 0,
50: -1, -1,
51: };
52: static int compatspcodes[16] = {
53: 0, 50, 75, 110, 134, 150, 200, 300, 600, 1200,
54: 1800, 2400, 4800, 9600, 19200, 38400,
55: };
56:
57: /*ARGSUSED*/
58: ttcompat(tp, com, data, flag)
59: register struct tty *tp;
60: caddr_t data;
61: {
62: switch(com) {
63: case TIOCGETP: {
64: register struct sgttyb *sg = (struct sgttyb *)data;
65: register u_char *cc = tp->t_cc;
66: register speed;
67:
68: speed = ttspeedtab(tp->t_ospeed, compatspeeds);
69: sg->sg_ospeed = (speed == -1) ? 15 : speed;
70: if (tp->t_ispeed == 0)
71: sg->sg_ispeed = sg->sg_ospeed;
72: else {
73: speed = ttspeedtab(tp->t_ispeed, compatspeeds);
74: sg->sg_ispeed = (speed == -1) ? 15 : speed;
75: }
76: sg->sg_erase = cc[VERASE];
77: sg->sg_kill = cc[VKILL];
78: sg->sg_flags = ttcompatgetflags(tp);
79: break;
80: }
81:
82: case TIOCSETP:
83: case TIOCSETN: {
84: register struct sgttyb *sg = (struct sgttyb *)data;
85: struct termios term;
86: int speed;
87:
88: term = tp->t_termios;
89: if ((speed = sg->sg_ispeed) > 15 || speed < 0)
90: term.c_ispeed = speed;
91: else
92: term.c_ispeed = compatspcodes[speed];
93: if ((speed = sg->sg_ospeed) > 15 || speed < 0)
94: term.c_ospeed = speed;
95: else
96: term.c_ospeed = compatspcodes[speed];
97: term.c_cc[VERASE] = sg->sg_erase;
98: term.c_cc[VKILL] = sg->sg_kill;
99: tp->t_flags = (tp->t_flags&0xffff0000) | sg->sg_flags;
100: ttcompatsetflags(tp, &term);
101: return (ttioctl(tp, com == TIOCSETP ? TIOCSETAF : TIOCSETA,
102: &term, flag));
103: }
104:
105: case TIOCGETC: {
106: struct tchars *tc = (struct tchars *)data;
107: register u_char *cc = tp->t_cc;
108:
109: tc->t_intrc = cc[VINTR];
110: tc->t_quitc = cc[VQUIT];
111: tc->t_startc = cc[VSTART];
112: tc->t_stopc = cc[VSTOP];
113: tc->t_eofc = cc[VEOF];
114: tc->t_brkc = cc[VEOL];
115: break;
116: }
117: case TIOCSETC: {
118: struct tchars *tc = (struct tchars *)data;
119: register u_char *cc = tp->t_cc;
120:
121: cc[VINTR] = tc->t_intrc;
122: cc[VQUIT] = tc->t_quitc;
123: cc[VSTART] = tc->t_startc;
124: cc[VSTOP] = tc->t_stopc;
125: cc[VEOF] = tc->t_eofc;
126: cc[VEOL] = tc->t_brkc;
127: if (tc->t_brkc == -1)
128: cc[VEOL2] = _POSIX_VDISABLE;
129: break;
130: }
131: case TIOCSLTC: {
132: struct ltchars *ltc = (struct ltchars *)data;
133: register u_char *cc = tp->t_cc;
134:
135: cc[VSUSP] = ltc->t_suspc;
136: cc[VDSUSP] = ltc->t_dsuspc;
137: cc[VREPRINT] = ltc->t_rprntc;
138: cc[VDISCARD] = ltc->t_flushc;
139: cc[VWERASE] = ltc->t_werasc;
140: cc[VLNEXT] = ltc->t_lnextc;
141: break;
142: }
143: case TIOCGLTC: {
144: struct ltchars *ltc = (struct ltchars *)data;
145: register u_char *cc = tp->t_cc;
146:
147: ltc->t_suspc = cc[VSUSP];
148: ltc->t_dsuspc = cc[VDSUSP];
149: ltc->t_rprntc = cc[VREPRINT];
150: ltc->t_flushc = cc[VDISCARD];
151: ltc->t_werasc = cc[VWERASE];
152: ltc->t_lnextc = cc[VLNEXT];
153: break;
154: }
155: case TIOCLBIS:
156: case TIOCLBIC:
157: case TIOCLSET: {
158: struct termios term;
159:
160: term = tp->t_termios;
161: if (com == TIOCLSET)
162: tp->t_flags = (tp->t_flags&0xffff) | *(int *)data<<16;
163: else {
164: tp->t_flags =
165: (ttcompatgetflags(tp)&0xffff0000)|(tp->t_flags&0xffff);
166: if (com == TIOCLBIS)
167: tp->t_flags |= *(int *)data<<16;
168: else
169: tp->t_flags &= ~(*(int *)data<<16);
170: }
171: ttcompatsetlflags(tp, &term);
172: return (ttioctl(tp, TIOCSETA, &term, flag));
173: }
174: case TIOCLGET:
175: *(int *)data = ttcompatgetflags(tp)>>16;
176: if (ttydebug)
177: printf("CLGET: returning %x\n", *(int *)data);
178: break;
179:
180: case OTIOCGETD:
181: *(int *)data = tp->t_line ? tp->t_line : 2;
182: break;
183:
184: case OTIOCSETD: {
185: int ldisczero = 0;
186:
187: return(ttioctl(tp, TIOCSETD,
188: *(int *)data == 2 ? (caddr_t)&ldisczero : data, flag));
189:
190: case OTIOCCONS:
191: *(int *)data = 1;
192: return(ttioctl(tp, TIOCCONS, data, flag));
193: }
194:
195: default:
196: return (-1);
197: }
198: return(0);
199: }
200:
201: ttcompatgetflags(tp)
202: register struct tty *tp;
203: {
204: register long iflag = tp->t_iflag;
205: register long lflag = tp->t_lflag;
206: register long oflag = tp->t_oflag;
207: register long cflag = tp->t_cflag;
208: register flags = 0;
209:
210: if (iflag&IXOFF)
211: flags |= TANDEM;
212: if (iflag&ICRNL || oflag&ONLCR)
213: flags |= CRMOD;
214: if (cflag&PARENB) {
215: if (iflag&INPCK) {
216: if (cflag&PARODD)
217: flags |= ODDP;
218: else
219: flags |= EVENP;
220: } else
221: flags |= EVENP | ODDP;
222: } else {
223: if ((tp->t_flags&LITOUT) && !(oflag&OPOST))
224: flags |= LITOUT;
225: if (tp->t_flags&PASS8)
226: flags |= PASS8;
227: }
228:
229: if ((lflag&ICANON) == 0) {
230: /* fudge */
231: if (iflag&IXON || lflag&ISIG || lflag&IEXTEN || cflag&PARENB)
232: flags |= CBREAK;
233: else
234: flags |= RAW;
235: }
236: if (oflag&OXTABS)
237: flags |= XTABS;
238: if (lflag&ECHOE)
239: flags |= CRTERA|CRTBS;
240: if (lflag&ECHOKE)
241: flags |= CRTKIL|CRTBS;
242: if (lflag&ECHOPRT)
243: flags |= PRTERA;
244: if (lflag&ECHOCTL)
245: flags |= CTLECH;
246: if ((iflag&IXANY) == 0)
247: flags |= DECCTQ;
248: flags |= lflag&(ECHO|MDMBUF|TOSTOP|FLUSHO|NOHANG|PENDIN|NOFLSH);
249: if (ttydebug)
250: printf("getflags: %x\n", flags);
251: return (flags);
252: }
253:
254: ttcompatsetflags(tp, t)
255: register struct tty *tp;
256: register struct termios *t;
257: {
258: register flags = tp->t_flags;
259: register long iflag = t->c_iflag;
260: register long oflag = t->c_oflag;
261: register long lflag = t->c_lflag;
262: register long cflag = t->c_cflag;
263:
264: if (flags & RAW) {
265: iflag &= IXOFF;
266: oflag &= ~OPOST;
267: lflag &= ~(ECHOCTL|ISIG|ICANON|IEXTEN);
268: } else {
269: iflag |= BRKINT|IXON|IMAXBEL;
270: oflag |= OPOST;
271: lflag |= ISIG|IEXTEN;
272: if (flags & XTABS)
273: oflag |= OXTABS;
274: else
275: oflag &= ~OXTABS;
276: if (flags & CBREAK)
277: lflag &= ~ICANON;
278: else
279: lflag |= ICANON;
280: if (flags&CRMOD) {
281: iflag |= ICRNL;
282: oflag |= ONLCR;
283: } else {
284: iflag &= ~ICRNL;
285: oflag &= ~ONLCR;
286: }
287: }
288: if (flags&ECHO)
289: lflag |= ECHO;
290: else
291: lflag &= ~ECHO;
292:
293: if (flags&(RAW|LITOUT|PASS8)) {
294: cflag &= ~(CSIZE|PARENB);
295: cflag |= CS8;
296: if ((flags&(RAW|PASS8)) == 0)
297: iflag |= ISTRIP;
298: } else {
299: cflag &= ~CSIZE;
300: cflag |= CS7|PARENB;
301: }
302: if ((flags&(EVENP|ODDP)) == EVENP) {
303: iflag |= INPCK;
304: cflag &= ~PARODD;
305: } else if ((flags&(EVENP|ODDP)) == ODDP) {
306: iflag |= INPCK;
307: cflag |= PARODD;
308: } else
309: iflag &= ~INPCK;
310: if (flags&LITOUT)
311: oflag &= ~OPOST; /* move earlier ? */
312: if (flags&TANDEM)
313: iflag |= IXOFF;
314: else
315: iflag &= ~IXOFF;
316: t->c_iflag = iflag;
317: t->c_oflag = oflag;
318: t->c_lflag = lflag;
319: t->c_cflag = cflag;
320: }
321:
322: ttcompatsetlflags(tp, t)
323: register struct tty *tp;
324: register struct termios *t;
325: {
326: register flags = tp->t_flags;
327: register long iflag = t->c_iflag;
328: register long oflag = t->c_oflag;
329: register long lflag = t->c_lflag;
330: register long cflag = t->c_cflag;
331:
332: if (flags&CRTERA)
333: lflag |= ECHOE;
334: else
335: lflag &= ~ECHOE;
336: if (flags&CRTKIL)
337: lflag |= ECHOKE;
338: else
339: lflag &= ~ECHOKE;
340: if (flags&PRTERA)
341: lflag |= ECHOPRT;
342: else
343: lflag &= ~ECHOPRT;
344: if (flags&CTLECH)
345: lflag |= ECHOCTL;
346: else
347: lflag &= ~ECHOCTL;
348: if ((flags&DECCTQ) == 0)
349: lflag |= IXANY;
350: else
351: lflag &= ~IXANY;
352: lflag &= ~(MDMBUF|TOSTOP|FLUSHO|NOHANG|PENDIN|NOFLSH);
353: lflag |= flags&(MDMBUF|TOSTOP|FLUSHO|NOHANG|PENDIN|NOFLSH);
354: if (flags&(LITOUT|PASS8)) {
355: iflag &= ~ISTRIP;
356: cflag &= ~(CSIZE|PARENB);
357: cflag |= CS8;
358: if (flags&LITOUT)
359: oflag &= ~OPOST;
360: if ((flags&(PASS8|RAW)) == 0)
361: iflag |= ISTRIP;
362: } else if ((flags&RAW) == 0) {
363: cflag &= ~CSIZE;
364: cflag |= CS7|PARENB;
365: oflag |= OPOST;
366: }
367: t->c_iflag = iflag;
368: t->c_oflag = oflag;
369: t->c_lflag = lflag;
370: t->c_cflag = cflag;
371: }
372: #endif /* COMPAT_43 */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.