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 --- |