1 /* 2 * Copyright (C) 1991, 1992, 1993, 1994 Linus Torvalds 3 * 4 * Modified by Fred N. van Kempen, 01/29/93, to add line disciplines 5 * which can be dynamically activated and de-activated by the line 6 * discipline handling modules (like SLIP). 7 */ 8 9 #include <linux/types.h> 10 #include <linux/termios.h> 11 #include <linux/errno.h> 12 #include <linux/sched.h> 13 #include <linux/kernel.h> 14 #include <linux/major.h> 15 #include <linux/tty.h> 16 #include <linux/fcntl.h> 17 #include <linux/string.h> 18 #include <linux/mm.h> 19 #include <linux/module.h> 20 #include <linux/bitops.h> 21 #include <linux/mutex.h> 22 #include <linux/compat.h> 23 24 #include <asm/io.h> 25 #include <asm/uaccess.h> 26 27 #undef TTY_DEBUG_WAIT_UNTIL_SENT 28 29 #ifdef TTY_DEBUG_WAIT_UNTIL_SENT 30 # define tty_debug_wait_until_sent(tty, f, args...) tty_debug(tty, f, ##args) 31 #else 32 # define tty_debug_wait_until_sent(tty, f, args...) do {} while (0) 33 #endif 34 35 #undef DEBUG 36 37 /* 38 * Internal flag options for termios setting behavior 39 */ 40 #define TERMIOS_FLUSH 1 41 #define TERMIOS_WAIT 2 42 #define TERMIOS_TERMIO 4 43 #define TERMIOS_OLD 8 44 45 46 /** 47 * tty_chars_in_buffer - characters pending 48 * @tty: terminal 49 * 50 * Return the number of bytes of data in the device private 51 * output queue. If no private method is supplied there is assumed 52 * to be no queue on the device. 53 */ 54 55 int tty_chars_in_buffer(struct tty_struct *tty) 56 { 57 if (tty->ops->chars_in_buffer) 58 return tty->ops->chars_in_buffer(tty); 59 else 60 return 0; 61 } 62 EXPORT_SYMBOL(tty_chars_in_buffer); 63 64 /** 65 * tty_write_room - write queue space 66 * @tty: terminal 67 * 68 * Return the number of bytes that can be queued to this device 69 * at the present time. The result should be treated as a guarantee 70 * and the driver cannot offer a value it later shrinks by more than 71 * the number of bytes written. If no method is provided 2K is always 72 * returned and data may be lost as there will be no flow control. 73 */ 74 75 int tty_write_room(struct tty_struct *tty) 76 { 77 if (tty->ops->write_room) 78 return tty->ops->write_room(tty); 79 return 2048; 80 } 81 EXPORT_SYMBOL(tty_write_room); 82 83 /** 84 * tty_driver_flush_buffer - discard internal buffer 85 * @tty: terminal 86 * 87 * Discard the internal output buffer for this device. If no method 88 * is provided then either the buffer cannot be hardware flushed or 89 * there is no buffer driver side. 90 */ 91 void tty_driver_flush_buffer(struct tty_struct *tty) 92 { 93 if (tty->ops->flush_buffer) 94 tty->ops->flush_buffer(tty); 95 } 96 EXPORT_SYMBOL(tty_driver_flush_buffer); 97 98 /** 99 * tty_throttle - flow control 100 * @tty: terminal 101 * 102 * Indicate that a tty should stop transmitting data down the stack. 103 * Takes the termios rwsem to protect against parallel throttle/unthrottle 104 * and also to ensure the driver can consistently reference its own 105 * termios data at this point when implementing software flow control. 106 */ 107 108 void tty_throttle(struct tty_struct *tty) 109 { 110 down_write(&tty->termios_rwsem); 111 /* check TTY_THROTTLED first so it indicates our state */ 112 if (!test_and_set_bit(TTY_THROTTLED, &tty->flags) && 113 tty->ops->throttle) 114 tty->ops->throttle(tty); 115 tty->flow_change = 0; 116 up_write(&tty->termios_rwsem); 117 } 118 EXPORT_SYMBOL(tty_throttle); 119 120 /** 121 * tty_unthrottle - flow control 122 * @tty: terminal 123 * 124 * Indicate that a tty may continue transmitting data down the stack. 125 * Takes the termios rwsem to protect against parallel throttle/unthrottle 126 * and also to ensure the driver can consistently reference its own 127 * termios data at this point when implementing software flow control. 128 * 129 * Drivers should however remember that the stack can issue a throttle, 130 * then change flow control method, then unthrottle. 131 */ 132 133 void tty_unthrottle(struct tty_struct *tty) 134 { 135 down_write(&tty->termios_rwsem); 136 if (test_and_clear_bit(TTY_THROTTLED, &tty->flags) && 137 tty->ops->unthrottle) 138 tty->ops->unthrottle(tty); 139 tty->flow_change = 0; 140 up_write(&tty->termios_rwsem); 141 } 142 EXPORT_SYMBOL(tty_unthrottle); 143 144 /** 145 * tty_throttle_safe - flow control 146 * @tty: terminal 147 * 148 * Similar to tty_throttle() but will only attempt throttle 149 * if tty->flow_change is TTY_THROTTLE_SAFE. Prevents an accidental 150 * throttle due to race conditions when throttling is conditional 151 * on factors evaluated prior to throttling. 152 * 153 * Returns 0 if tty is throttled (or was already throttled) 154 */ 155 156 int tty_throttle_safe(struct tty_struct *tty) 157 { 158 int ret = 0; 159 160 mutex_lock(&tty->throttle_mutex); 161 if (!test_bit(TTY_THROTTLED, &tty->flags)) { 162 if (tty->flow_change != TTY_THROTTLE_SAFE) 163 ret = 1; 164 else { 165 set_bit(TTY_THROTTLED, &tty->flags); 166 if (tty->ops->throttle) 167 tty->ops->throttle(tty); 168 } 169 } 170 mutex_unlock(&tty->throttle_mutex); 171 172 return ret; 173 } 174 175 /** 176 * tty_unthrottle_safe - flow control 177 * @tty: terminal 178 * 179 * Similar to tty_unthrottle() but will only attempt unthrottle 180 * if tty->flow_change is TTY_UNTHROTTLE_SAFE. Prevents an accidental 181 * unthrottle due to race conditions when unthrottling is conditional 182 * on factors evaluated prior to unthrottling. 183 * 184 * Returns 0 if tty is unthrottled (or was already unthrottled) 185 */ 186 187 int tty_unthrottle_safe(struct tty_struct *tty) 188 { 189 int ret = 0; 190 191 mutex_lock(&tty->throttle_mutex); 192 if (test_bit(TTY_THROTTLED, &tty->flags)) { 193 if (tty->flow_change != TTY_UNTHROTTLE_SAFE) 194 ret = 1; 195 else { 196 clear_bit(TTY_THROTTLED, &tty->flags); 197 if (tty->ops->unthrottle) 198 tty->ops->unthrottle(tty); 199 } 200 } 201 mutex_unlock(&tty->throttle_mutex); 202 203 return ret; 204 } 205 206 /** 207 * tty_wait_until_sent - wait for I/O to finish 208 * @tty: tty we are waiting for 209 * @timeout: how long we will wait 210 * 211 * Wait for characters pending in a tty driver to hit the wire, or 212 * for a timeout to occur (eg due to flow control) 213 * 214 * Locking: none 215 */ 216 217 void tty_wait_until_sent(struct tty_struct *tty, long timeout) 218 { 219 tty_debug_wait_until_sent(tty, "\n"); 220 221 if (!timeout) 222 timeout = MAX_SCHEDULE_TIMEOUT; 223 224 timeout = wait_event_interruptible_timeout(tty->write_wait, 225 !tty_chars_in_buffer(tty), timeout); 226 if (timeout <= 0) 227 return; 228 229 if (timeout == MAX_SCHEDULE_TIMEOUT) 230 timeout = 0; 231 232 if (tty->ops->wait_until_sent) 233 tty->ops->wait_until_sent(tty, timeout); 234 } 235 EXPORT_SYMBOL(tty_wait_until_sent); 236 237 238 /* 239 * Termios Helper Methods 240 */ 241 242 static void unset_locked_termios(struct ktermios *termios, 243 struct ktermios *old, 244 struct ktermios *locked) 245 { 246 int i; 247 248 #define NOSET_MASK(x, y, z) (x = ((x) & ~(z)) | ((y) & (z))) 249 250 if (!locked) { 251 printk(KERN_WARNING "Warning?!? termios_locked is NULL.\n"); 252 return; 253 } 254 255 NOSET_MASK(termios->c_iflag, old->c_iflag, locked->c_iflag); 256 NOSET_MASK(termios->c_oflag, old->c_oflag, locked->c_oflag); 257 NOSET_MASK(termios->c_cflag, old->c_cflag, locked->c_cflag); 258 NOSET_MASK(termios->c_lflag, old->c_lflag, locked->c_lflag); 259 termios->c_line = locked->c_line ? old->c_line : termios->c_line; 260 for (i = 0; i < NCCS; i++) 261 termios->c_cc[i] = locked->c_cc[i] ? 262 old->c_cc[i] : termios->c_cc[i]; 263 /* FIXME: What should we do for i/ospeed */ 264 } 265 266 /* 267 * Routine which returns the baud rate of the tty 268 * 269 * Note that the baud_table needs to be kept in sync with the 270 * include/asm/termbits.h file. 271 */ 272 static const speed_t baud_table[] = { 273 0, 50, 75, 110, 134, 150, 200, 300, 600, 1200, 1800, 2400, 4800, 274 9600, 19200, 38400, 57600, 115200, 230400, 460800, 275 #ifdef __sparc__ 276 76800, 153600, 307200, 614400, 921600 277 #else 278 500000, 576000, 921600, 1000000, 1152000, 1500000, 2000000, 279 2500000, 3000000, 3500000, 4000000 280 #endif 281 }; 282 283 #ifndef __sparc__ 284 static const tcflag_t baud_bits[] = { 285 B0, B50, B75, B110, B134, B150, B200, B300, B600, 286 B1200, B1800, B2400, B4800, B9600, B19200, B38400, 287 B57600, B115200, B230400, B460800, B500000, B576000, 288 B921600, B1000000, B1152000, B1500000, B2000000, B2500000, 289 B3000000, B3500000, B4000000 290 }; 291 #else 292 static const tcflag_t baud_bits[] = { 293 B0, B50, B75, B110, B134, B150, B200, B300, B600, 294 B1200, B1800, B2400, B4800, B9600, B19200, B38400, 295 B57600, B115200, B230400, B460800, B76800, B153600, 296 B307200, B614400, B921600 297 }; 298 #endif 299 300 static int n_baud_table = ARRAY_SIZE(baud_table); 301 302 /** 303 * tty_termios_baud_rate 304 * @termios: termios structure 305 * 306 * Convert termios baud rate data into a speed. This should be called 307 * with the termios lock held if this termios is a terminal termios 308 * structure. May change the termios data. Device drivers can call this 309 * function but should use ->c_[io]speed directly as they are updated. 310 * 311 * Locking: none 312 */ 313 314 speed_t tty_termios_baud_rate(struct ktermios *termios) 315 { 316 unsigned int cbaud; 317 318 cbaud = termios->c_cflag & CBAUD; 319 320 #ifdef BOTHER 321 /* Magic token for arbitrary speed via c_ispeed/c_ospeed */ 322 if (cbaud == BOTHER) 323 return termios->c_ospeed; 324 #endif 325 if (cbaud & CBAUDEX) { 326 cbaud &= ~CBAUDEX; 327 328 if (cbaud < 1 || cbaud + 15 > n_baud_table) 329 termios->c_cflag &= ~CBAUDEX; 330 else 331 cbaud += 15; 332 } 333 return baud_table[cbaud]; 334 } 335 EXPORT_SYMBOL(tty_termios_baud_rate); 336 337 /** 338 * tty_termios_input_baud_rate 339 * @termios: termios structure 340 * 341 * Convert termios baud rate data into a speed. This should be called 342 * with the termios lock held if this termios is a terminal termios 343 * structure. May change the termios data. Device drivers can call this 344 * function but should use ->c_[io]speed directly as they are updated. 345 * 346 * Locking: none 347 */ 348 349 speed_t tty_termios_input_baud_rate(struct ktermios *termios) 350 { 351 #ifdef IBSHIFT 352 unsigned int cbaud = (termios->c_cflag >> IBSHIFT) & CBAUD; 353 354 if (cbaud == B0) 355 return tty_termios_baud_rate(termios); 356 357 /* Magic token for arbitrary speed via c_ispeed*/ 358 if (cbaud == BOTHER) 359 return termios->c_ispeed; 360 361 if (cbaud & CBAUDEX) { 362 cbaud &= ~CBAUDEX; 363 364 if (cbaud < 1 || cbaud + 15 > n_baud_table) 365 termios->c_cflag &= ~(CBAUDEX << IBSHIFT); 366 else 367 cbaud += 15; 368 } 369 return baud_table[cbaud]; 370 #else 371 return tty_termios_baud_rate(termios); 372 #endif 373 } 374 EXPORT_SYMBOL(tty_termios_input_baud_rate); 375 376 /** 377 * tty_termios_encode_baud_rate 378 * @termios: ktermios structure holding user requested state 379 * @ispeed: input speed 380 * @ospeed: output speed 381 * 382 * Encode the speeds set into the passed termios structure. This is 383 * used as a library helper for drivers so that they can report back 384 * the actual speed selected when it differs from the speed requested 385 * 386 * For maximal back compatibility with legacy SYS5/POSIX *nix behaviour 387 * we need to carefully set the bits when the user does not get the 388 * desired speed. We allow small margins and preserve as much of possible 389 * of the input intent to keep compatibility. 390 * 391 * Locking: Caller should hold termios lock. This is already held 392 * when calling this function from the driver termios handler. 393 * 394 * The ifdefs deal with platforms whose owners have yet to update them 395 * and will all go away once this is done. 396 */ 397 398 void tty_termios_encode_baud_rate(struct ktermios *termios, 399 speed_t ibaud, speed_t obaud) 400 { 401 int i = 0; 402 int ifound = -1, ofound = -1; 403 int iclose = ibaud/50, oclose = obaud/50; 404 int ibinput = 0; 405 406 if (obaud == 0) /* CD dropped */ 407 ibaud = 0; /* Clear ibaud to be sure */ 408 409 termios->c_ispeed = ibaud; 410 termios->c_ospeed = obaud; 411 412 #ifdef BOTHER 413 /* If the user asked for a precise weird speed give a precise weird 414 answer. If they asked for a Bfoo speed they may have problems 415 digesting non-exact replies so fuzz a bit */ 416 417 if ((termios->c_cflag & CBAUD) == BOTHER) 418 oclose = 0; 419 if (((termios->c_cflag >> IBSHIFT) & CBAUD) == BOTHER) 420 iclose = 0; 421 if ((termios->c_cflag >> IBSHIFT) & CBAUD) 422 ibinput = 1; /* An input speed was specified */ 423 #endif 424 termios->c_cflag &= ~CBAUD; 425 426 /* 427 * Our goal is to find a close match to the standard baud rate 428 * returned. Walk the baud rate table and if we get a very close 429 * match then report back the speed as a POSIX Bxxxx value by 430 * preference 431 */ 432 433 do { 434 if (obaud - oclose <= baud_table[i] && 435 obaud + oclose >= baud_table[i]) { 436 termios->c_cflag |= baud_bits[i]; 437 ofound = i; 438 } 439 if (ibaud - iclose <= baud_table[i] && 440 ibaud + iclose >= baud_table[i]) { 441 /* For the case input == output don't set IBAUD bits 442 if the user didn't do so */ 443 if (ofound == i && !ibinput) 444 ifound = i; 445 #ifdef IBSHIFT 446 else { 447 ifound = i; 448 termios->c_cflag |= (baud_bits[i] << IBSHIFT); 449 } 450 #endif 451 } 452 } while (++i < n_baud_table); 453 454 /* 455 * If we found no match then use BOTHER if provided or warn 456 * the user their platform maintainer needs to wake up if not. 457 */ 458 #ifdef BOTHER 459 if (ofound == -1) 460 termios->c_cflag |= BOTHER; 461 /* Set exact input bits only if the input and output differ or the 462 user already did */ 463 if (ifound == -1 && (ibaud != obaud || ibinput)) 464 termios->c_cflag |= (BOTHER << IBSHIFT); 465 #else 466 if (ifound == -1 || ofound == -1) { 467 printk_once(KERN_WARNING "tty: Unable to return correct " 468 "speed data as your architecture needs updating.\n"); 469 } 470 #endif 471 } 472 EXPORT_SYMBOL_GPL(tty_termios_encode_baud_rate); 473 474 /** 475 * tty_encode_baud_rate - set baud rate of the tty 476 * @ibaud: input baud rate 477 * @obad: output baud rate 478 * 479 * Update the current termios data for the tty with the new speed 480 * settings. The caller must hold the termios_rwsem for the tty in 481 * question. 482 */ 483 484 void tty_encode_baud_rate(struct tty_struct *tty, speed_t ibaud, speed_t obaud) 485 { 486 tty_termios_encode_baud_rate(&tty->termios, ibaud, obaud); 487 } 488 EXPORT_SYMBOL_GPL(tty_encode_baud_rate); 489 490 /** 491 * tty_termios_copy_hw - copy hardware settings 492 * @new: New termios 493 * @old: Old termios 494 * 495 * Propagate the hardware specific terminal setting bits from 496 * the old termios structure to the new one. This is used in cases 497 * where the hardware does not support reconfiguration or as a helper 498 * in some cases where only minimal reconfiguration is supported 499 */ 500 501 void tty_termios_copy_hw(struct ktermios *new, struct ktermios *old) 502 { 503 /* The bits a dumb device handles in software. Smart devices need 504 to always provide a set_termios method */ 505 new->c_cflag &= HUPCL | CREAD | CLOCAL; 506 new->c_cflag |= old->c_cflag & ~(HUPCL | CREAD | CLOCAL); 507 new->c_ispeed = old->c_ispeed; 508 new->c_ospeed = old->c_ospeed; 509 } 510 EXPORT_SYMBOL(tty_termios_copy_hw); 511 512 /** 513 * tty_termios_hw_change - check for setting change 514 * @a: termios 515 * @b: termios to compare 516 * 517 * Check if any of the bits that affect a dumb device have changed 518 * between the two termios structures, or a speed change is needed. 519 */ 520 521 int tty_termios_hw_change(struct ktermios *a, struct ktermios *b) 522 { 523 if (a->c_ispeed != b->c_ispeed || a->c_ospeed != b->c_ospeed) 524 return 1; 525 if ((a->c_cflag ^ b->c_cflag) & ~(HUPCL | CREAD | CLOCAL)) 526 return 1; 527 return 0; 528 } 529 EXPORT_SYMBOL(tty_termios_hw_change); 530 531 /** 532 * tty_set_termios - update termios values 533 * @tty: tty to update 534 * @new_termios: desired new value 535 * 536 * Perform updates to the termios values set on this terminal. 537 * A master pty's termios should never be set. 538 * 539 * Locking: termios_rwsem 540 */ 541 542 int tty_set_termios(struct tty_struct *tty, struct ktermios *new_termios) 543 { 544 struct ktermios old_termios; 545 struct tty_ldisc *ld; 546 547 WARN_ON(tty->driver->type == TTY_DRIVER_TYPE_PTY && 548 tty->driver->subtype == PTY_TYPE_MASTER); 549 /* 550 * Perform the actual termios internal changes under lock. 551 */ 552 553 554 /* FIXME: we need to decide on some locking/ordering semantics 555 for the set_termios notification eventually */ 556 down_write(&tty->termios_rwsem); 557 old_termios = tty->termios; 558 tty->termios = *new_termios; 559 unset_locked_termios(&tty->termios, &old_termios, &tty->termios_locked); 560 561 if (tty->ops->set_termios) 562 tty->ops->set_termios(tty, &old_termios); 563 else 564 tty_termios_copy_hw(&tty->termios, &old_termios); 565 566 ld = tty_ldisc_ref(tty); 567 if (ld != NULL) { 568 if (ld->ops->set_termios) 569 ld->ops->set_termios(tty, &old_termios); 570 tty_ldisc_deref(ld); 571 } 572 up_write(&tty->termios_rwsem); 573 return 0; 574 } 575 EXPORT_SYMBOL_GPL(tty_set_termios); 576 577 /** 578 * set_termios - set termios values for a tty 579 * @tty: terminal device 580 * @arg: user data 581 * @opt: option information 582 * 583 * Helper function to prepare termios data and run necessary other 584 * functions before using tty_set_termios to do the actual changes. 585 * 586 * Locking: 587 * Called functions take ldisc and termios_rwsem locks 588 */ 589 590 static int set_termios(struct tty_struct *tty, void __user *arg, int opt) 591 { 592 struct ktermios tmp_termios; 593 struct tty_ldisc *ld; 594 int retval = tty_check_change(tty); 595 596 if (retval) 597 return retval; 598 599 down_read(&tty->termios_rwsem); 600 tmp_termios = tty->termios; 601 up_read(&tty->termios_rwsem); 602 603 if (opt & TERMIOS_TERMIO) { 604 if (user_termio_to_kernel_termios(&tmp_termios, 605 (struct termio __user *)arg)) 606 return -EFAULT; 607 #ifdef TCGETS2 608 } else if (opt & TERMIOS_OLD) { 609 if (user_termios_to_kernel_termios_1(&tmp_termios, 610 (struct termios __user *)arg)) 611 return -EFAULT; 612 } else { 613 if (user_termios_to_kernel_termios(&tmp_termios, 614 (struct termios2 __user *)arg)) 615 return -EFAULT; 616 } 617 #else 618 } else if (user_termios_to_kernel_termios(&tmp_termios, 619 (struct termios __user *)arg)) 620 return -EFAULT; 621 #endif 622 623 /* If old style Bfoo values are used then load c_ispeed/c_ospeed 624 * with the real speed so its unconditionally usable */ 625 tmp_termios.c_ispeed = tty_termios_input_baud_rate(&tmp_termios); 626 tmp_termios.c_ospeed = tty_termios_baud_rate(&tmp_termios); 627 628 ld = tty_ldisc_ref(tty); 629 630 if (ld != NULL) { 631 if ((opt & TERMIOS_FLUSH) && ld->ops->flush_buffer) 632 ld->ops->flush_buffer(tty); 633 tty_ldisc_deref(ld); 634 } 635 636 if (opt & TERMIOS_WAIT) { 637 tty_wait_until_sent(tty, 0); 638 if (signal_pending(current)) 639 return -ERESTARTSYS; 640 } 641 642 tty_set_termios(tty, &tmp_termios); 643 644 /* FIXME: Arguably if tmp_termios == tty->termios AND the 645 actual requested termios was not tmp_termios then we may 646 want to return an error as no user requested change has 647 succeeded */ 648 return 0; 649 } 650 651 static void copy_termios(struct tty_struct *tty, struct ktermios *kterm) 652 { 653 down_read(&tty->termios_rwsem); 654 *kterm = tty->termios; 655 up_read(&tty->termios_rwsem); 656 } 657 658 static void copy_termios_locked(struct tty_struct *tty, struct ktermios *kterm) 659 { 660 down_read(&tty->termios_rwsem); 661 *kterm = tty->termios_locked; 662 up_read(&tty->termios_rwsem); 663 } 664 665 static int get_termio(struct tty_struct *tty, struct termio __user *termio) 666 { 667 struct ktermios kterm; 668 copy_termios(tty, &kterm); 669 if (kernel_termios_to_user_termio(termio, &kterm)) 670 return -EFAULT; 671 return 0; 672 } 673 674 675 #ifdef TCGETX 676 677 /** 678 * set_termiox - set termiox fields if possible 679 * @tty: terminal 680 * @arg: termiox structure from user 681 * @opt: option flags for ioctl type 682 * 683 * Implement the device calling points for the SYS5 termiox ioctl 684 * interface in Linux 685 */ 686 687 static int set_termiox(struct tty_struct *tty, void __user *arg, int opt) 688 { 689 struct termiox tnew; 690 struct tty_ldisc *ld; 691 692 if (tty->termiox == NULL) 693 return -EINVAL; 694 if (copy_from_user(&tnew, arg, sizeof(struct termiox))) 695 return -EFAULT; 696 697 ld = tty_ldisc_ref(tty); 698 if (ld != NULL) { 699 if ((opt & TERMIOS_FLUSH) && ld->ops->flush_buffer) 700 ld->ops->flush_buffer(tty); 701 tty_ldisc_deref(ld); 702 } 703 if (opt & TERMIOS_WAIT) { 704 tty_wait_until_sent(tty, 0); 705 if (signal_pending(current)) 706 return -ERESTARTSYS; 707 } 708 709 down_write(&tty->termios_rwsem); 710 if (tty->ops->set_termiox) 711 tty->ops->set_termiox(tty, &tnew); 712 up_write(&tty->termios_rwsem); 713 return 0; 714 } 715 716 #endif 717 718 719 #ifdef TIOCGETP 720 /* 721 * These are deprecated, but there is limited support.. 722 * 723 * The "sg_flags" translation is a joke.. 724 */ 725 static int get_sgflags(struct tty_struct *tty) 726 { 727 int flags = 0; 728 729 if (!(tty->termios.c_lflag & ICANON)) { 730 if (tty->termios.c_lflag & ISIG) 731 flags |= 0x02; /* cbreak */ 732 else 733 flags |= 0x20; /* raw */ 734 } 735 if (tty->termios.c_lflag & ECHO) 736 flags |= 0x08; /* echo */ 737 if (tty->termios.c_oflag & OPOST) 738 if (tty->termios.c_oflag & ONLCR) 739 flags |= 0x10; /* crmod */ 740 return flags; 741 } 742 743 static int get_sgttyb(struct tty_struct *tty, struct sgttyb __user *sgttyb) 744 { 745 struct sgttyb tmp; 746 747 down_read(&tty->termios_rwsem); 748 tmp.sg_ispeed = tty->termios.c_ispeed; 749 tmp.sg_ospeed = tty->termios.c_ospeed; 750 tmp.sg_erase = tty->termios.c_cc[VERASE]; 751 tmp.sg_kill = tty->termios.c_cc[VKILL]; 752 tmp.sg_flags = get_sgflags(tty); 753 up_read(&tty->termios_rwsem); 754 755 return copy_to_user(sgttyb, &tmp, sizeof(tmp)) ? -EFAULT : 0; 756 } 757 758 static void set_sgflags(struct ktermios *termios, int flags) 759 { 760 termios->c_iflag = ICRNL | IXON; 761 termios->c_oflag = 0; 762 termios->c_lflag = ISIG | ICANON; 763 if (flags & 0x02) { /* cbreak */ 764 termios->c_iflag = 0; 765 termios->c_lflag &= ~ICANON; 766 } 767 if (flags & 0x08) { /* echo */ 768 termios->c_lflag |= ECHO | ECHOE | ECHOK | 769 ECHOCTL | ECHOKE | IEXTEN; 770 } 771 if (flags & 0x10) { /* crmod */ 772 termios->c_oflag |= OPOST | ONLCR; 773 } 774 if (flags & 0x20) { /* raw */ 775 termios->c_iflag = 0; 776 termios->c_lflag &= ~(ISIG | ICANON); 777 } 778 if (!(termios->c_lflag & ICANON)) { 779 termios->c_cc[VMIN] = 1; 780 termios->c_cc[VTIME] = 0; 781 } 782 } 783 784 /** 785 * set_sgttyb - set legacy terminal values 786 * @tty: tty structure 787 * @sgttyb: pointer to old style terminal structure 788 * 789 * Updates a terminal from the legacy BSD style terminal information 790 * structure. 791 * 792 * Locking: termios_rwsem 793 */ 794 795 static int set_sgttyb(struct tty_struct *tty, struct sgttyb __user *sgttyb) 796 { 797 int retval; 798 struct sgttyb tmp; 799 struct ktermios termios; 800 801 retval = tty_check_change(tty); 802 if (retval) 803 return retval; 804 805 if (copy_from_user(&tmp, sgttyb, sizeof(tmp))) 806 return -EFAULT; 807 808 down_write(&tty->termios_rwsem); 809 termios = tty->termios; 810 termios.c_cc[VERASE] = tmp.sg_erase; 811 termios.c_cc[VKILL] = tmp.sg_kill; 812 set_sgflags(&termios, tmp.sg_flags); 813 /* Try and encode into Bfoo format */ 814 #ifdef BOTHER 815 tty_termios_encode_baud_rate(&termios, termios.c_ispeed, 816 termios.c_ospeed); 817 #endif 818 up_write(&tty->termios_rwsem); 819 tty_set_termios(tty, &termios); 820 return 0; 821 } 822 #endif 823 824 #ifdef TIOCGETC 825 static int get_tchars(struct tty_struct *tty, struct tchars __user *tchars) 826 { 827 struct tchars tmp; 828 829 down_read(&tty->termios_rwsem); 830 tmp.t_intrc = tty->termios.c_cc[VINTR]; 831 tmp.t_quitc = tty->termios.c_cc[VQUIT]; 832 tmp.t_startc = tty->termios.c_cc[VSTART]; 833 tmp.t_stopc = tty->termios.c_cc[VSTOP]; 834 tmp.t_eofc = tty->termios.c_cc[VEOF]; 835 tmp.t_brkc = tty->termios.c_cc[VEOL2]; /* what is brkc anyway? */ 836 up_read(&tty->termios_rwsem); 837 return copy_to_user(tchars, &tmp, sizeof(tmp)) ? -EFAULT : 0; 838 } 839 840 static int set_tchars(struct tty_struct *tty, struct tchars __user *tchars) 841 { 842 struct tchars tmp; 843 844 if (copy_from_user(&tmp, tchars, sizeof(tmp))) 845 return -EFAULT; 846 down_write(&tty->termios_rwsem); 847 tty->termios.c_cc[VINTR] = tmp.t_intrc; 848 tty->termios.c_cc[VQUIT] = tmp.t_quitc; 849 tty->termios.c_cc[VSTART] = tmp.t_startc; 850 tty->termios.c_cc[VSTOP] = tmp.t_stopc; 851 tty->termios.c_cc[VEOF] = tmp.t_eofc; 852 tty->termios.c_cc[VEOL2] = tmp.t_brkc; /* what is brkc anyway? */ 853 up_write(&tty->termios_rwsem); 854 return 0; 855 } 856 #endif 857 858 #ifdef TIOCGLTC 859 static int get_ltchars(struct tty_struct *tty, struct ltchars __user *ltchars) 860 { 861 struct ltchars tmp; 862 863 down_read(&tty->termios_rwsem); 864 tmp.t_suspc = tty->termios.c_cc[VSUSP]; 865 /* what is dsuspc anyway? */ 866 tmp.t_dsuspc = tty->termios.c_cc[VSUSP]; 867 tmp.t_rprntc = tty->termios.c_cc[VREPRINT]; 868 /* what is flushc anyway? */ 869 tmp.t_flushc = tty->termios.c_cc[VEOL2]; 870 tmp.t_werasc = tty->termios.c_cc[VWERASE]; 871 tmp.t_lnextc = tty->termios.c_cc[VLNEXT]; 872 up_read(&tty->termios_rwsem); 873 return copy_to_user(ltchars, &tmp, sizeof(tmp)) ? -EFAULT : 0; 874 } 875 876 static int set_ltchars(struct tty_struct *tty, struct ltchars __user *ltchars) 877 { 878 struct ltchars tmp; 879 880 if (copy_from_user(&tmp, ltchars, sizeof(tmp))) 881 return -EFAULT; 882 883 down_write(&tty->termios_rwsem); 884 tty->termios.c_cc[VSUSP] = tmp.t_suspc; 885 /* what is dsuspc anyway? */ 886 tty->termios.c_cc[VEOL2] = tmp.t_dsuspc; 887 tty->termios.c_cc[VREPRINT] = tmp.t_rprntc; 888 /* what is flushc anyway? */ 889 tty->termios.c_cc[VEOL2] = tmp.t_flushc; 890 tty->termios.c_cc[VWERASE] = tmp.t_werasc; 891 tty->termios.c_cc[VLNEXT] = tmp.t_lnextc; 892 up_write(&tty->termios_rwsem); 893 return 0; 894 } 895 #endif 896 897 /** 898 * tty_change_softcar - carrier change ioctl helper 899 * @tty: tty to update 900 * @arg: enable/disable CLOCAL 901 * 902 * Perform a change to the CLOCAL state and call into the driver 903 * layer to make it visible. All done with the termios rwsem 904 */ 905 906 static int tty_change_softcar(struct tty_struct *tty, int arg) 907 { 908 int ret = 0; 909 int bit = arg ? CLOCAL : 0; 910 struct ktermios old; 911 912 down_write(&tty->termios_rwsem); 913 old = tty->termios; 914 tty->termios.c_cflag &= ~CLOCAL; 915 tty->termios.c_cflag |= bit; 916 if (tty->ops->set_termios) 917 tty->ops->set_termios(tty, &old); 918 if ((tty->termios.c_cflag & CLOCAL) != bit) 919 ret = -EINVAL; 920 up_write(&tty->termios_rwsem); 921 return ret; 922 } 923 924 /** 925 * tty_mode_ioctl - mode related ioctls 926 * @tty: tty for the ioctl 927 * @file: file pointer for the tty 928 * @cmd: command 929 * @arg: ioctl argument 930 * 931 * Perform non line discipline specific mode control ioctls. This 932 * is designed to be called by line disciplines to ensure they provide 933 * consistent mode setting. 934 */ 935 936 int tty_mode_ioctl(struct tty_struct *tty, struct file *file, 937 unsigned int cmd, unsigned long arg) 938 { 939 struct tty_struct *real_tty; 940 void __user *p = (void __user *)arg; 941 int ret = 0; 942 struct ktermios kterm; 943 944 BUG_ON(file == NULL); 945 946 if (tty->driver->type == TTY_DRIVER_TYPE_PTY && 947 tty->driver->subtype == PTY_TYPE_MASTER) 948 real_tty = tty->link; 949 else 950 real_tty = tty; 951 952 switch (cmd) { 953 #ifdef TIOCGETP 954 case TIOCGETP: 955 return get_sgttyb(real_tty, (struct sgttyb __user *) arg); 956 case TIOCSETP: 957 case TIOCSETN: 958 return set_sgttyb(real_tty, (struct sgttyb __user *) arg); 959 #endif 960 #ifdef TIOCGETC 961 case TIOCGETC: 962 return get_tchars(real_tty, p); 963 case TIOCSETC: 964 return set_tchars(real_tty, p); 965 #endif 966 #ifdef TIOCGLTC 967 case TIOCGLTC: 968 return get_ltchars(real_tty, p); 969 case TIOCSLTC: 970 return set_ltchars(real_tty, p); 971 #endif 972 case TCSETSF: 973 return set_termios(real_tty, p, TERMIOS_FLUSH | TERMIOS_WAIT | TERMIOS_OLD); 974 case TCSETSW: 975 return set_termios(real_tty, p, TERMIOS_WAIT | TERMIOS_OLD); 976 case TCSETS: 977 return set_termios(real_tty, p, TERMIOS_OLD); 978 #ifndef TCGETS2 979 case TCGETS: 980 copy_termios(real_tty, &kterm); 981 if (kernel_termios_to_user_termios((struct termios __user *)arg, &kterm)) 982 ret = -EFAULT; 983 return ret; 984 #else 985 case TCGETS: 986 copy_termios(real_tty, &kterm); 987 if (kernel_termios_to_user_termios_1((struct termios __user *)arg, &kterm)) 988 ret = -EFAULT; 989 return ret; 990 case TCGETS2: 991 copy_termios(real_tty, &kterm); 992 if (kernel_termios_to_user_termios((struct termios2 __user *)arg, &kterm)) 993 ret = -EFAULT; 994 return ret; 995 case TCSETSF2: 996 return set_termios(real_tty, p, TERMIOS_FLUSH | TERMIOS_WAIT); 997 case TCSETSW2: 998 return set_termios(real_tty, p, TERMIOS_WAIT); 999 case TCSETS2: 1000 return set_termios(real_tty, p, 0); 1001 #endif 1002 case TCGETA: 1003 return get_termio(real_tty, p); 1004 case TCSETAF: 1005 return set_termios(real_tty, p, TERMIOS_FLUSH | TERMIOS_WAIT | TERMIOS_TERMIO); 1006 case TCSETAW: 1007 return set_termios(real_tty, p, TERMIOS_WAIT | TERMIOS_TERMIO); 1008 case TCSETA: 1009 return set_termios(real_tty, p, TERMIOS_TERMIO); 1010 #ifndef TCGETS2 1011 case TIOCGLCKTRMIOS: 1012 copy_termios_locked(real_tty, &kterm); 1013 if (kernel_termios_to_user_termios((struct termios __user *)arg, &kterm)) 1014 ret = -EFAULT; 1015 return ret; 1016 case TIOCSLCKTRMIOS: 1017 if (!capable(CAP_SYS_ADMIN)) 1018 return -EPERM; 1019 copy_termios_locked(real_tty, &kterm); 1020 if (user_termios_to_kernel_termios(&kterm, 1021 (struct termios __user *) arg)) 1022 return -EFAULT; 1023 down_write(&real_tty->termios_rwsem); 1024 real_tty->termios_locked = kterm; 1025 up_write(&real_tty->termios_rwsem); 1026 return 0; 1027 #else 1028 case TIOCGLCKTRMIOS: 1029 copy_termios_locked(real_tty, &kterm); 1030 if (kernel_termios_to_user_termios_1((struct termios __user *)arg, &kterm)) 1031 ret = -EFAULT; 1032 return ret; 1033 case TIOCSLCKTRMIOS: 1034 if (!capable(CAP_SYS_ADMIN)) 1035 return -EPERM; 1036 copy_termios_locked(real_tty, &kterm); 1037 if (user_termios_to_kernel_termios_1(&kterm, 1038 (struct termios __user *) arg)) 1039 return -EFAULT; 1040 down_write(&real_tty->termios_rwsem); 1041 real_tty->termios_locked = kterm; 1042 up_write(&real_tty->termios_rwsem); 1043 return ret; 1044 #endif 1045 #ifdef TCGETX 1046 case TCGETX: { 1047 struct termiox ktermx; 1048 if (real_tty->termiox == NULL) 1049 return -EINVAL; 1050 down_read(&real_tty->termios_rwsem); 1051 memcpy(&ktermx, real_tty->termiox, sizeof(struct termiox)); 1052 up_read(&real_tty->termios_rwsem); 1053 if (copy_to_user(p, &ktermx, sizeof(struct termiox))) 1054 ret = -EFAULT; 1055 return ret; 1056 } 1057 case TCSETX: 1058 return set_termiox(real_tty, p, 0); 1059 case TCSETXW: 1060 return set_termiox(real_tty, p, TERMIOS_WAIT); 1061 case TCSETXF: 1062 return set_termiox(real_tty, p, TERMIOS_FLUSH); 1063 #endif 1064 case TIOCGSOFTCAR: 1065 copy_termios(real_tty, &kterm); 1066 ret = put_user((kterm.c_cflag & CLOCAL) ? 1 : 0, 1067 (int __user *)arg); 1068 return ret; 1069 case TIOCSSOFTCAR: 1070 if (get_user(arg, (unsigned int __user *) arg)) 1071 return -EFAULT; 1072 return tty_change_softcar(real_tty, arg); 1073 default: 1074 return -ENOIOCTLCMD; 1075 } 1076 } 1077 EXPORT_SYMBOL_GPL(tty_mode_ioctl); 1078 1079 1080 /* Caller guarantees ldisc reference is held */ 1081 static int __tty_perform_flush(struct tty_struct *tty, unsigned long arg) 1082 { 1083 struct tty_ldisc *ld = tty->ldisc; 1084 1085 switch (arg) { 1086 case TCIFLUSH: 1087 if (ld && ld->ops->flush_buffer) { 1088 ld->ops->flush_buffer(tty); 1089 tty_unthrottle(tty); 1090 } 1091 break; 1092 case TCIOFLUSH: 1093 if (ld && ld->ops->flush_buffer) { 1094 ld->ops->flush_buffer(tty); 1095 tty_unthrottle(tty); 1096 } 1097 /* fall through */ 1098 case TCOFLUSH: 1099 tty_driver_flush_buffer(tty); 1100 break; 1101 default: 1102 return -EINVAL; 1103 } 1104 return 0; 1105 } 1106 1107 int tty_perform_flush(struct tty_struct *tty, unsigned long arg) 1108 { 1109 struct tty_ldisc *ld; 1110 int retval = tty_check_change(tty); 1111 if (retval) 1112 return retval; 1113 1114 ld = tty_ldisc_ref_wait(tty); 1115 retval = __tty_perform_flush(tty, arg); 1116 if (ld) 1117 tty_ldisc_deref(ld); 1118 return retval; 1119 } 1120 EXPORT_SYMBOL_GPL(tty_perform_flush); 1121 1122 int n_tty_ioctl_helper(struct tty_struct *tty, struct file *file, 1123 unsigned int cmd, unsigned long arg) 1124 { 1125 int retval; 1126 1127 switch (cmd) { 1128 case TCXONC: 1129 retval = tty_check_change(tty); 1130 if (retval) 1131 return retval; 1132 switch (arg) { 1133 case TCOOFF: 1134 spin_lock_irq(&tty->flow_lock); 1135 if (!tty->flow_stopped) { 1136 tty->flow_stopped = 1; 1137 __stop_tty(tty); 1138 } 1139 spin_unlock_irq(&tty->flow_lock); 1140 break; 1141 case TCOON: 1142 spin_lock_irq(&tty->flow_lock); 1143 if (tty->flow_stopped) { 1144 tty->flow_stopped = 0; 1145 __start_tty(tty); 1146 } 1147 spin_unlock_irq(&tty->flow_lock); 1148 break; 1149 case TCIOFF: 1150 down_read(&tty->termios_rwsem); 1151 if (STOP_CHAR(tty) != __DISABLED_CHAR) 1152 retval = tty_send_xchar(tty, STOP_CHAR(tty)); 1153 up_read(&tty->termios_rwsem); 1154 break; 1155 case TCION: 1156 down_read(&tty->termios_rwsem); 1157 if (START_CHAR(tty) != __DISABLED_CHAR) 1158 retval = tty_send_xchar(tty, START_CHAR(tty)); 1159 up_read(&tty->termios_rwsem); 1160 break; 1161 default: 1162 return -EINVAL; 1163 } 1164 return retval; 1165 case TCFLSH: 1166 retval = tty_check_change(tty); 1167 if (retval) 1168 return retval; 1169 return __tty_perform_flush(tty, arg); 1170 default: 1171 /* Try the mode commands */ 1172 return tty_mode_ioctl(tty, file, cmd, arg); 1173 } 1174 } 1175 EXPORT_SYMBOL(n_tty_ioctl_helper); 1176 1177 #ifdef CONFIG_COMPAT 1178 long n_tty_compat_ioctl_helper(struct tty_struct *tty, struct file *file, 1179 unsigned int cmd, unsigned long arg) 1180 { 1181 switch (cmd) { 1182 case TIOCGLCKTRMIOS: 1183 case TIOCSLCKTRMIOS: 1184 return tty_mode_ioctl(tty, file, cmd, (unsigned long) compat_ptr(arg)); 1185 default: 1186 return -ENOIOCTLCMD; 1187 } 1188 } 1189 EXPORT_SYMBOL(n_tty_compat_ioctl_helper); 1190 #endif 1191 1192