Deleted Added
full compact
tty_compat.c (154170) tty_compat.c (181905)
1/*-
2 * Copyright (c) 1982, 1986, 1991, 1993
3 * The Regents of the University of California. All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright

--- 16 unchanged lines hidden (view full) ---

25 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
26 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
27 * SUCH DAMAGE.
28 *
29 * @(#)tty_compat.c 8.1 (Berkeley) 6/10/93
30 */
31
32#include <sys/cdefs.h>
1/*-
2 * Copyright (c) 1982, 1986, 1991, 1993
3 * The Regents of the University of California. All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright

--- 16 unchanged lines hidden (view full) ---

25 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
26 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
27 * SUCH DAMAGE.
28 *
29 * @(#)tty_compat.c 8.1 (Berkeley) 6/10/93
30 */
31
32#include <sys/cdefs.h>
33__FBSDID("$FreeBSD: head/sys/kern/tty_compat.c 154170 2006-01-10 09:19:10Z phk $");
33__FBSDID("$FreeBSD: head/sys/kern/tty_compat.c 181905 2008-08-20 08:31:58Z ed $");
34
35#include "opt_compat.h"
36
37/*
38 * mapping routines for old line discipline (yuck)
39 */
40
41#include <sys/param.h>
42#include <sys/systm.h>
43#include <sys/ioctl_compat.h>
44#include <sys/tty.h>
45#include <sys/kernel.h>
46#include <sys/sysctl.h>
47
34
35#include "opt_compat.h"
36
37/*
38 * mapping routines for old line discipline (yuck)
39 */
40
41#include <sys/param.h>
42#include <sys/systm.h>
43#include <sys/ioctl_compat.h>
44#include <sys/tty.h>
45#include <sys/kernel.h>
46#include <sys/sysctl.h>
47
48struct speedtab {
49 int sp_speed; /* Speed. */
50 int sp_code; /* Code. */
51};
52
48static int ttcompatgetflags(struct tty *tp);
49static void ttcompatsetflags(struct tty *tp, struct termios *t);
50static void ttcompatsetlflags(struct tty *tp, struct termios *t);
51static int ttcompatspeedtab(int speed, struct speedtab *table);
52
53static int ttydebug = 0;
54SYSCTL_INT(_debug, OID_AUTO, ttydebug, CTLFLAG_RW, &ttydebug, 0, "");
55

--- 41 unchanged lines hidden (view full) ---

97 switch (*com) {
98 case TIOCSETP:
99 case TIOCSETN: {
100 struct sgttyb *sg = (struct sgttyb *)data;
101 int speed;
102
103 if ((speed = sg->sg_ispeed) > MAX_SPEED || speed < 0)
104 return(EINVAL);
53static int ttcompatgetflags(struct tty *tp);
54static void ttcompatsetflags(struct tty *tp, struct termios *t);
55static void ttcompatsetlflags(struct tty *tp, struct termios *t);
56static int ttcompatspeedtab(int speed, struct speedtab *table);
57
58static int ttydebug = 0;
59SYSCTL_INT(_debug, OID_AUTO, ttydebug, CTLFLAG_RW, &ttydebug, 0, "");
60

--- 41 unchanged lines hidden (view full) ---

102 switch (*com) {
103 case TIOCSETP:
104 case TIOCSETN: {
105 struct sgttyb *sg = (struct sgttyb *)data;
106 int speed;
107
108 if ((speed = sg->sg_ispeed) > MAX_SPEED || speed < 0)
109 return(EINVAL);
105 else if (speed != ttcompatspeedtab(tp->t_ispeed, compatspeeds))
110 else if (speed != ttcompatspeedtab(tp->t_termios.c_ispeed,
111 compatspeeds))
106 term->c_ispeed = compatspcodes[speed];
107 else
112 term->c_ispeed = compatspcodes[speed];
113 else
108 term->c_ispeed = tp->t_ispeed;
114 term->c_ispeed = tp->t_termios.c_ispeed;
109 if ((speed = sg->sg_ospeed) > MAX_SPEED || speed < 0)
110 return(EINVAL);
115 if ((speed = sg->sg_ospeed) > MAX_SPEED || speed < 0)
116 return(EINVAL);
111 else if (speed != ttcompatspeedtab(tp->t_ospeed, compatspeeds))
117 else if (speed != ttcompatspeedtab(tp->t_termios.c_ospeed,
118 compatspeeds))
112 term->c_ospeed = compatspcodes[speed];
113 else
119 term->c_ospeed = compatspcodes[speed];
120 else
114 term->c_ospeed = tp->t_ospeed;
121 term->c_ospeed = tp->t_termios.c_ospeed;
115 term->c_cc[VERASE] = sg->sg_erase;
116 term->c_cc[VKILL] = sg->sg_kill;
117 tp->t_flags = (tp->t_flags&0xffff0000) | (sg->sg_flags&0xffff);
118 ttcompatsetflags(tp, term);
119 *com = (*com == TIOCSETP) ? TIOCSETAF : TIOCSETA;
120 break;
121 }
122 case TIOCSETC: {

--- 43 unchanged lines hidden (view full) ---

166 *com = TIOCSETA;
167 break;
168 }
169 return 0;
170}
171
172/*ARGSUSED*/
173int
122 term->c_cc[VERASE] = sg->sg_erase;
123 term->c_cc[VKILL] = sg->sg_kill;
124 tp->t_flags = (tp->t_flags&0xffff0000) | (sg->sg_flags&0xffff);
125 ttcompatsetflags(tp, term);
126 *com = (*com == TIOCSETP) ? TIOCSETAF : TIOCSETA;
127 break;
128 }
129 case TIOCSETC: {

--- 43 unchanged lines hidden (view full) ---

173 *com = TIOCSETA;
174 break;
175 }
176 return 0;
177}
178
179/*ARGSUSED*/
180int
174ttcompat(struct tty *tp, u_long com, caddr_t data, int flag)
181tty_ioctl_compat(struct tty *tp, u_long com, caddr_t data, struct thread *td)
175{
176 switch (com) {
177 case TIOCSETP:
178 case TIOCSETN:
179 case TIOCSETC:
180 case TIOCSLTC:
181 case TIOCLBIS:
182 case TIOCLBIC:
183 case TIOCLSET: {
184 struct termios term;
185 int error;
186
187 term = tp->t_termios;
188 if ((error = ttsetcompat(tp, &com, data, &term)) != 0)
189 return error;
182{
183 switch (com) {
184 case TIOCSETP:
185 case TIOCSETN:
186 case TIOCSETC:
187 case TIOCSLTC:
188 case TIOCLBIS:
189 case TIOCLBIC:
190 case TIOCLSET: {
191 struct termios term;
192 int error;
193
194 term = tp->t_termios;
195 if ((error = ttsetcompat(tp, &com, data, &term)) != 0)
196 return error;
190 return ttioctl(tp, com, &term, flag);
197 return tty_ioctl(tp, com, &term, td);
191 }
192 case TIOCGETP: {
193 struct sgttyb *sg = (struct sgttyb *)data;
198 }
199 case TIOCGETP: {
200 struct sgttyb *sg = (struct sgttyb *)data;
194 cc_t *cc = tp->t_cc;
201 cc_t *cc = tp->t_termios.c_cc;
195
202
196 sg->sg_ospeed = ttcompatspeedtab(tp->t_ospeed, compatspeeds);
197 if (tp->t_ispeed == 0)
203 sg->sg_ospeed = ttcompatspeedtab(tp->t_termios.c_ospeed,
204 compatspeeds);
205 if (tp->t_termios.c_ispeed == 0)
198 sg->sg_ispeed = sg->sg_ospeed;
199 else
206 sg->sg_ispeed = sg->sg_ospeed;
207 else
200 sg->sg_ispeed = ttcompatspeedtab(tp->t_ispeed, compatspeeds);
208 sg->sg_ispeed = ttcompatspeedtab(tp->t_termios.c_ispeed,
209 compatspeeds);
201 sg->sg_erase = cc[VERASE];
202 sg->sg_kill = cc[VKILL];
203 sg->sg_flags = tp->t_flags = ttcompatgetflags(tp);
204 break;
205 }
206 case TIOCGETC: {
207 struct tchars *tc = (struct tchars *)data;
210 sg->sg_erase = cc[VERASE];
211 sg->sg_kill = cc[VKILL];
212 sg->sg_flags = tp->t_flags = ttcompatgetflags(tp);
213 break;
214 }
215 case TIOCGETC: {
216 struct tchars *tc = (struct tchars *)data;
208 cc_t *cc = tp->t_cc;
217 cc_t *cc = tp->t_termios.c_cc;
209
210 tc->t_intrc = cc[VINTR];
211 tc->t_quitc = cc[VQUIT];
212 tc->t_startc = cc[VSTART];
213 tc->t_stopc = cc[VSTOP];
214 tc->t_eofc = cc[VEOF];
215 tc->t_brkc = cc[VEOL];
216 break;
217 }
218 case TIOCGLTC: {
219 struct ltchars *ltc = (struct ltchars *)data;
218
219 tc->t_intrc = cc[VINTR];
220 tc->t_quitc = cc[VQUIT];
221 tc->t_startc = cc[VSTART];
222 tc->t_stopc = cc[VSTOP];
223 tc->t_eofc = cc[VEOF];
224 tc->t_brkc = cc[VEOL];
225 break;
226 }
227 case TIOCGLTC: {
228 struct ltchars *ltc = (struct ltchars *)data;
220 cc_t *cc = tp->t_cc;
229 cc_t *cc = tp->t_termios.c_cc;
221
222 ltc->t_suspc = cc[VSUSP];
223 ltc->t_dsuspc = cc[VDSUSP];
224 ltc->t_rprntc = cc[VREPRINT];
225 ltc->t_flushc = cc[VDISCARD];
226 ltc->t_werasc = cc[VWERASE];
227 ltc->t_lnextc = cc[VLNEXT];
228 break;
229 }
230 case TIOCLGET:
231 tp->t_flags =
232 (ttcompatgetflags(tp) & 0xffff0000UL)
233 | (tp->t_flags & 0xffff);
234 *(int *)data = tp->t_flags>>16;
235 if (ttydebug)
236 printf("CLGET: returning %x\n", *(int *)data);
237 break;
238
239 case OTIOCGETD:
230
231 ltc->t_suspc = cc[VSUSP];
232 ltc->t_dsuspc = cc[VDSUSP];
233 ltc->t_rprntc = cc[VREPRINT];
234 ltc->t_flushc = cc[VDISCARD];
235 ltc->t_werasc = cc[VWERASE];
236 ltc->t_lnextc = cc[VLNEXT];
237 break;
238 }
239 case TIOCLGET:
240 tp->t_flags =
241 (ttcompatgetflags(tp) & 0xffff0000UL)
242 | (tp->t_flags & 0xffff);
243 *(int *)data = tp->t_flags>>16;
244 if (ttydebug)
245 printf("CLGET: returning %x\n", *(int *)data);
246 break;
247
248 case OTIOCGETD:
240 *(int *)data = tp->t_line ? tp->t_line : 2;
249 *(int *)data = 2;
241 break;
242
243 case OTIOCSETD: {
244 int ldisczero = 0;
245
250 break;
251
252 case OTIOCSETD: {
253 int ldisczero = 0;
254
246 return (ttioctl(tp, TIOCSETD,
247 *(int *)data == 2 ? (caddr_t)&ldisczero : data, flag));
255 return (tty_ioctl(tp, TIOCSETD,
256 *(int *)data == 2 ? (caddr_t)&ldisczero : data, td));
248 }
249
250 case OTIOCCONS:
251 *(int *)data = 1;
257 }
258
259 case OTIOCCONS:
260 *(int *)data = 1;
252 return (ttioctl(tp, TIOCCONS, data, flag));
261 return (tty_ioctl(tp, TIOCCONS, data, td));
253
254 default:
255 return (ENOIOCTL);
256 }
257 return (0);
258}
259
260static int
261ttcompatgetflags(struct tty *tp)
262{
262
263 default:
264 return (ENOIOCTL);
265 }
266 return (0);
267}
268
269static int
270ttcompatgetflags(struct tty *tp)
271{
263 tcflag_t iflag = tp->t_iflag;
264 tcflag_t lflag = tp->t_lflag;
265 tcflag_t oflag = tp->t_oflag;
266 tcflag_t cflag = tp->t_cflag;
272 tcflag_t iflag = tp->t_termios.c_iflag;
273 tcflag_t lflag = tp->t_termios.c_lflag;
274 tcflag_t oflag = tp->t_termios.c_oflag;
275 tcflag_t cflag = tp->t_termios.c_cflag;
267 int flags = 0;
268
269 if (iflag&IXOFF)
270 flags |= TANDEM;
271 if (iflag&ICRNL || oflag&ONLCR)
272 flags |= CRMOD;
273 if ((cflag&CSIZE) == CS8) {
274 flags |= PASS8;

--- 19 unchanged lines hidden (view full) ---

294 flags |= RAW;
295 }
296 if (!(flags&RAW) && !(oflag&OPOST) && (cflag&(CSIZE|PARENB)) == CS8)
297 flags |= LITOUT;
298 if (cflag&MDMBUF)
299 flags |= MDMBUF;
300 if ((cflag&HUPCL) == 0)
301 flags |= NOHANG;
276 int flags = 0;
277
278 if (iflag&IXOFF)
279 flags |= TANDEM;
280 if (iflag&ICRNL || oflag&ONLCR)
281 flags |= CRMOD;
282 if ((cflag&CSIZE) == CS8) {
283 flags |= PASS8;

--- 19 unchanged lines hidden (view full) ---

303 flags |= RAW;
304 }
305 if (!(flags&RAW) && !(oflag&OPOST) && (cflag&(CSIZE|PARENB)) == CS8)
306 flags |= LITOUT;
307 if (cflag&MDMBUF)
308 flags |= MDMBUF;
309 if ((cflag&HUPCL) == 0)
310 flags |= NOHANG;
302 if (oflag&OXTABS)
311 if (oflag&TAB3)
303 flags |= XTABS;
304 if (lflag&ECHOE)
305 flags |= CRTERA|CRTBS;
306 if (lflag&ECHOKE)
307 flags |= CRTKIL|CRTBS;
308 if (lflag&ECHOPRT)
309 flags |= PRTERA;
310 if (lflag&ECHOCTL)

--- 18 unchanged lines hidden (view full) ---

329 if (flags & RAW) {
330 iflag = IGNBRK;
331 lflag &= ~(ECHOCTL|ISIG|ICANON|IEXTEN);
332 } else {
333 iflag &= ~(PARMRK|IGNPAR|IGNCR|INLCR);
334 iflag |= BRKINT|IXON|IMAXBEL;
335 lflag |= ISIG|IEXTEN|ECHOCTL; /* XXX was echoctl on ? */
336 if (flags & XTABS)
312 flags |= XTABS;
313 if (lflag&ECHOE)
314 flags |= CRTERA|CRTBS;
315 if (lflag&ECHOKE)
316 flags |= CRTKIL|CRTBS;
317 if (lflag&ECHOPRT)
318 flags |= PRTERA;
319 if (lflag&ECHOCTL)

--- 18 unchanged lines hidden (view full) ---

338 if (flags & RAW) {
339 iflag = IGNBRK;
340 lflag &= ~(ECHOCTL|ISIG|ICANON|IEXTEN);
341 } else {
342 iflag &= ~(PARMRK|IGNPAR|IGNCR|INLCR);
343 iflag |= BRKINT|IXON|IMAXBEL;
344 lflag |= ISIG|IEXTEN|ECHOCTL; /* XXX was echoctl on ? */
345 if (flags & XTABS)
337 oflag |= OXTABS;
346 oflag |= TAB3;
338 else
347 else
339 oflag &= ~OXTABS;
348 oflag &= ~TAB3;
340 if (flags & CBREAK)
341 lflag &= ~ICANON;
342 else
343 lflag |= ICANON;
344 if (flags&CRMOD) {
345 iflag |= ICRNL;
346 oflag |= ONLCR;
347 } else {

--- 124 unchanged lines hidden ---
349 if (flags & CBREAK)
350 lflag &= ~ICANON;
351 else
352 lflag |= ICANON;
353 if (flags&CRMOD) {
354 iflag |= ICRNL;
355 oflag |= ONLCR;
356 } else {

--- 124 unchanged lines hidden ---