2 * Copyright (C) 1991, 1992, 1993, 1994 Linus Torvalds
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).
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>
19 #include <linux/module.h>
20 #include <linux/bitops.h>
21 #include <linux/mutex.h>
22 #include <linux/compat.h>
25 #include <asm/uaccess.h>
27 #undef TTY_DEBUG_WAIT_UNTIL_SENT
29 #ifdef TTY_DEBUG_WAIT_UNTIL_SENT
30 # define tty_debug_wait_until_sent(tty, f, args...) tty_debug(tty, f, ##args)
32 # define tty_debug_wait_until_sent(tty, f, args...) do {} while (0)
38 * Internal flag options for termios setting behavior
40 #define TERMIOS_FLUSH 1
41 #define TERMIOS_WAIT 2
42 #define TERMIOS_TERMIO 4
47 * tty_chars_in_buffer - characters pending
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.
55 int tty_chars_in_buffer(struct tty_struct *tty)
57 if (tty->ops->chars_in_buffer)
58 return tty->ops->chars_in_buffer(tty);
62 EXPORT_SYMBOL(tty_chars_in_buffer);
65 * tty_write_room - write queue space
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.
75 int tty_write_room(struct tty_struct *tty)
77 if (tty->ops->write_room)
78 return tty->ops->write_room(tty);
81 EXPORT_SYMBOL(tty_write_room);
84 * tty_driver_flush_buffer - discard internal buffer
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.
91 void tty_driver_flush_buffer(struct tty_struct *tty)
93 if (tty->ops->flush_buffer)
94 tty->ops->flush_buffer(tty);
96 EXPORT_SYMBOL(tty_driver_flush_buffer);
99 * tty_throttle - flow control
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.
108 void tty_throttle(struct tty_struct *tty)
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) &&
114 tty->ops->throttle(tty);
115 tty->flow_change = 0;
116 up_write(&tty->termios_rwsem);
118 EXPORT_SYMBOL(tty_throttle);
121 * tty_unthrottle - flow control
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.
129 * Drivers should however remember that the stack can issue a throttle,
130 * then change flow control method, then unthrottle.
133 void tty_unthrottle(struct tty_struct *tty)
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);
142 EXPORT_SYMBOL(tty_unthrottle);
145 * tty_throttle_safe - flow control
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.
153 * Returns 0 if tty is throttled (or was already throttled)
156 int tty_throttle_safe(struct tty_struct *tty)
160 mutex_lock(&tty->throttle_mutex);
161 if (!test_bit(TTY_THROTTLED, &tty->flags)) {
162 if (tty->flow_change != TTY_THROTTLE_SAFE)
165 set_bit(TTY_THROTTLED, &tty->flags);
166 if (tty->ops->throttle)
167 tty->ops->throttle(tty);
170 mutex_unlock(&tty->throttle_mutex);
176 * tty_unthrottle_safe - flow control
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.
184 * Returns 0 if tty is unthrottled (or was already unthrottled)
187 int tty_unthrottle_safe(struct tty_struct *tty)
191 mutex_lock(&tty->throttle_mutex);
192 if (test_bit(TTY_THROTTLED, &tty->flags)) {
193 if (tty->flow_change != TTY_UNTHROTTLE_SAFE)
196 clear_bit(TTY_THROTTLED, &tty->flags);
197 if (tty->ops->unthrottle)
198 tty->ops->unthrottle(tty);
201 mutex_unlock(&tty->throttle_mutex);
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
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)
217 void tty_wait_until_sent(struct tty_struct *tty, long timeout)
219 tty_debug_wait_until_sent(tty, "\n");
222 timeout = MAX_SCHEDULE_TIMEOUT;
224 timeout = wait_event_interruptible_timeout(tty->write_wait,
225 !tty_chars_in_buffer(tty), timeout);
229 if (timeout == MAX_SCHEDULE_TIMEOUT)
232 if (tty->ops->wait_until_sent)
233 tty->ops->wait_until_sent(tty, timeout);
235 EXPORT_SYMBOL(tty_wait_until_sent);
239 * Termios Helper Methods
242 static void unset_locked_termios(struct ktermios *termios,
243 struct ktermios *old,
244 struct ktermios *locked)
248 #define NOSET_MASK(x, y, z) (x = ((x) & ~(z)) | ((y) & (z)))
251 printk(KERN_WARNING "Warning?!? termios_locked is NULL.\n");
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 */
267 * Routine which returns the baud rate of the tty
269 * Note that the baud_table needs to be kept in sync with the
270 * include/asm/termbits.h file.
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,
276 76800, 153600, 307200, 614400, 921600
278 500000, 576000, 921600, 1000000, 1152000, 1500000, 2000000,
279 2500000, 3000000, 3500000, 4000000
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
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
300 static int n_baud_table = ARRAY_SIZE(baud_table);
303 * tty_termios_baud_rate
304 * @termios: termios structure
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.
314 speed_t tty_termios_baud_rate(struct ktermios *termios)
318 cbaud = termios->c_cflag & CBAUD;
321 /* Magic token for arbitrary speed via c_ispeed/c_ospeed */
323 return termios->c_ospeed;
325 if (cbaud & CBAUDEX) {
328 if (cbaud < 1 || cbaud + 15 > n_baud_table)
329 termios->c_cflag &= ~CBAUDEX;
333 return baud_table[cbaud];
335 EXPORT_SYMBOL(tty_termios_baud_rate);
338 * tty_termios_input_baud_rate
339 * @termios: termios structure
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.
349 speed_t tty_termios_input_baud_rate(struct ktermios *termios)
352 unsigned int cbaud = (termios->c_cflag >> IBSHIFT) & CBAUD;
355 return tty_termios_baud_rate(termios);
357 /* Magic token for arbitrary speed via c_ispeed*/
359 return termios->c_ispeed;
361 if (cbaud & CBAUDEX) {
364 if (cbaud < 1 || cbaud + 15 > n_baud_table)
365 termios->c_cflag &= ~(CBAUDEX << IBSHIFT);
369 return baud_table[cbaud];
371 return tty_termios_baud_rate(termios);
374 EXPORT_SYMBOL(tty_termios_input_baud_rate);
377 * tty_termios_encode_baud_rate
378 * @termios: ktermios structure holding user requested state
379 * @ispeed: input speed
380 * @ospeed: output speed
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
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.
391 * Locking: Caller should hold termios lock. This is already held
392 * when calling this function from the driver termios handler.
394 * The ifdefs deal with platforms whose owners have yet to update them
395 * and will all go away once this is done.
398 void tty_termios_encode_baud_rate(struct ktermios *termios,
399 speed_t ibaud, speed_t obaud)
402 int ifound = -1, ofound = -1;
403 int iclose = ibaud/50, oclose = obaud/50;
406 if (obaud == 0) /* CD dropped */
407 ibaud = 0; /* Clear ibaud to be sure */
409 termios->c_ispeed = ibaud;
410 termios->c_ospeed = obaud;
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 */
417 if ((termios->c_cflag & CBAUD) == BOTHER)
419 if (((termios->c_cflag >> IBSHIFT) & CBAUD) == BOTHER)
421 if ((termios->c_cflag >> IBSHIFT) & CBAUD)
422 ibinput = 1; /* An input speed was specified */
424 termios->c_cflag &= ~CBAUD;
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
434 if (obaud - oclose <= baud_table[i] &&
435 obaud + oclose >= baud_table[i]) {
436 termios->c_cflag |= baud_bits[i];
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)
448 termios->c_cflag |= (baud_bits[i] << IBSHIFT);
452 } while (++i < n_baud_table);
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.
460 termios->c_cflag |= BOTHER;
461 /* Set exact input bits only if the input and output differ or the
463 if (ifound == -1 && (ibaud != obaud || ibinput))
464 termios->c_cflag |= (BOTHER << IBSHIFT);
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");
472 EXPORT_SYMBOL_GPL(tty_termios_encode_baud_rate);
475 * tty_encode_baud_rate - set baud rate of the tty
476 * @ibaud: input baud rate
477 * @obad: output baud rate
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
484 void tty_encode_baud_rate(struct tty_struct *tty, speed_t ibaud, speed_t obaud)
486 tty_termios_encode_baud_rate(&tty->termios, ibaud, obaud);
488 EXPORT_SYMBOL_GPL(tty_encode_baud_rate);
491 * tty_termios_copy_hw - copy hardware settings
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
501 void tty_termios_copy_hw(struct ktermios *new, struct ktermios *old)
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;
510 EXPORT_SYMBOL(tty_termios_copy_hw);
513 * tty_termios_hw_change - check for setting change
515 * @b: termios to compare
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.
521 int tty_termios_hw_change(struct ktermios *a, struct ktermios *b)
523 if (a->c_ispeed != b->c_ispeed || a->c_ospeed != b->c_ospeed)
525 if ((a->c_cflag ^ b->c_cflag) & ~(HUPCL | CREAD | CLOCAL))
529 EXPORT_SYMBOL(tty_termios_hw_change);
532 * tty_set_termios - update termios values
533 * @tty: tty to update
534 * @new_termios: desired new value
536 * Perform updates to the termios values set on this terminal.
537 * A master pty's termios should never be set.
539 * Locking: termios_rwsem
542 int tty_set_termios(struct tty_struct *tty, struct ktermios *new_termios)
544 struct ktermios old_termios;
545 struct tty_ldisc *ld;
547 WARN_ON(tty->driver->type == TTY_DRIVER_TYPE_PTY &&
548 tty->driver->subtype == PTY_TYPE_MASTER);
550 * Perform the actual termios internal changes under lock.
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);
561 if (tty->ops->set_termios)
562 tty->ops->set_termios(tty, &old_termios);
564 tty_termios_copy_hw(&tty->termios, &old_termios);
566 ld = tty_ldisc_ref(tty);
568 if (ld->ops->set_termios)
569 ld->ops->set_termios(tty, &old_termios);
572 up_write(&tty->termios_rwsem);
575 EXPORT_SYMBOL_GPL(tty_set_termios);
578 * set_termios - set termios values for a tty
579 * @tty: terminal device
581 * @opt: option information
583 * Helper function to prepare termios data and run necessary other
584 * functions before using tty_set_termios to do the actual changes.
587 * Called functions take ldisc and termios_rwsem locks
590 static int set_termios(struct tty_struct *tty, void __user *arg, int opt)
592 struct ktermios tmp_termios;
593 struct tty_ldisc *ld;
594 int retval = tty_check_change(tty);
599 down_read(&tty->termios_rwsem);
600 tmp_termios = tty->termios;
601 up_read(&tty->termios_rwsem);
603 if (opt & TERMIOS_TERMIO) {
604 if (user_termio_to_kernel_termios(&tmp_termios,
605 (struct termio __user *)arg))
608 } else if (opt & TERMIOS_OLD) {
609 if (user_termios_to_kernel_termios_1(&tmp_termios,
610 (struct termios __user *)arg))
613 if (user_termios_to_kernel_termios(&tmp_termios,
614 (struct termios2 __user *)arg))
618 } else if (user_termios_to_kernel_termios(&tmp_termios,
619 (struct termios __user *)arg))
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);
628 ld = tty_ldisc_ref(tty);
631 if ((opt & TERMIOS_FLUSH) && ld->ops->flush_buffer)
632 ld->ops->flush_buffer(tty);
636 if (opt & TERMIOS_WAIT) {
637 tty_wait_until_sent(tty, 0);
638 if (signal_pending(current))
642 tty_set_termios(tty, &tmp_termios);
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
651 static void copy_termios(struct tty_struct *tty, struct ktermios *kterm)
653 down_read(&tty->termios_rwsem);
654 *kterm = tty->termios;
655 up_read(&tty->termios_rwsem);
658 static void copy_termios_locked(struct tty_struct *tty, struct ktermios *kterm)
660 down_read(&tty->termios_rwsem);
661 *kterm = tty->termios_locked;
662 up_read(&tty->termios_rwsem);
665 static int get_termio(struct tty_struct *tty, struct termio __user *termio)
667 struct ktermios kterm;
668 copy_termios(tty, &kterm);
669 if (kernel_termios_to_user_termio(termio, &kterm))
678 * set_termiox - set termiox fields if possible
680 * @arg: termiox structure from user
681 * @opt: option flags for ioctl type
683 * Implement the device calling points for the SYS5 termiox ioctl
687 static int set_termiox(struct tty_struct *tty, void __user *arg, int opt)
690 struct tty_ldisc *ld;
692 if (tty->termiox == NULL)
694 if (copy_from_user(&tnew, arg, sizeof(struct termiox)))
697 ld = tty_ldisc_ref(tty);
699 if ((opt & TERMIOS_FLUSH) && ld->ops->flush_buffer)
700 ld->ops->flush_buffer(tty);
703 if (opt & TERMIOS_WAIT) {
704 tty_wait_until_sent(tty, 0);
705 if (signal_pending(current))
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);
721 * These are deprecated, but there is limited support..
723 * The "sg_flags" translation is a joke..
725 static int get_sgflags(struct tty_struct *tty)
729 if (!(tty->termios.c_lflag & ICANON)) {
730 if (tty->termios.c_lflag & ISIG)
731 flags |= 0x02; /* cbreak */
733 flags |= 0x20; /* raw */
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 */
743 static int get_sgttyb(struct tty_struct *tty, struct sgttyb __user *sgttyb)
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);
755 return copy_to_user(sgttyb, &tmp, sizeof(tmp)) ? -EFAULT : 0;
758 static void set_sgflags(struct ktermios *termios, int flags)
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;
767 if (flags & 0x08) { /* echo */
768 termios->c_lflag |= ECHO | ECHOE | ECHOK |
769 ECHOCTL | ECHOKE | IEXTEN;
771 if (flags & 0x10) { /* crmod */
772 termios->c_oflag |= OPOST | ONLCR;
774 if (flags & 0x20) { /* raw */
775 termios->c_iflag = 0;
776 termios->c_lflag &= ~(ISIG | ICANON);
778 if (!(termios->c_lflag & ICANON)) {
779 termios->c_cc[VMIN] = 1;
780 termios->c_cc[VTIME] = 0;
785 * set_sgttyb - set legacy terminal values
786 * @tty: tty structure
787 * @sgttyb: pointer to old style terminal structure
789 * Updates a terminal from the legacy BSD style terminal information
792 * Locking: termios_rwsem
795 static int set_sgttyb(struct tty_struct *tty, struct sgttyb __user *sgttyb)
799 struct ktermios termios;
801 retval = tty_check_change(tty);
805 if (copy_from_user(&tmp, sgttyb, sizeof(tmp)))
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 */
815 tty_termios_encode_baud_rate(&termios, termios.c_ispeed,
818 up_write(&tty->termios_rwsem);
819 tty_set_termios(tty, &termios);
825 static int get_tchars(struct tty_struct *tty, struct tchars __user *tchars)
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;
840 static int set_tchars(struct tty_struct *tty, struct tchars __user *tchars)
844 if (copy_from_user(&tmp, tchars, sizeof(tmp)))
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);
859 static int get_ltchars(struct tty_struct *tty, struct ltchars __user *ltchars)
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;
876 static int set_ltchars(struct tty_struct *tty, struct ltchars __user *ltchars)
880 if (copy_from_user(&tmp, ltchars, sizeof(tmp)))
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);
898 * tty_change_softcar - carrier change ioctl helper
899 * @tty: tty to update
900 * @arg: enable/disable CLOCAL
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
906 static int tty_change_softcar(struct tty_struct *tty, int arg)
909 int bit = arg ? CLOCAL : 0;
912 down_write(&tty->termios_rwsem);
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)
920 up_write(&tty->termios_rwsem);
925 * tty_mode_ioctl - mode related ioctls
926 * @tty: tty for the ioctl
927 * @file: file pointer for the tty
929 * @arg: ioctl argument
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.
936 int tty_mode_ioctl(struct tty_struct *tty, struct file *file,
937 unsigned int cmd, unsigned long arg)
939 struct tty_struct *real_tty;
940 void __user *p = (void __user *)arg;
942 struct ktermios kterm;
944 BUG_ON(file == NULL);
946 if (tty->driver->type == TTY_DRIVER_TYPE_PTY &&
947 tty->driver->subtype == PTY_TYPE_MASTER)
948 real_tty = tty->link;
955 return get_sgttyb(real_tty, (struct sgttyb __user *) arg);
958 return set_sgttyb(real_tty, (struct sgttyb __user *) arg);
962 return get_tchars(real_tty, p);
964 return set_tchars(real_tty, p);
968 return get_ltchars(real_tty, p);
970 return set_ltchars(real_tty, p);
973 return set_termios(real_tty, p, TERMIOS_FLUSH | TERMIOS_WAIT | TERMIOS_OLD);
975 return set_termios(real_tty, p, TERMIOS_WAIT | TERMIOS_OLD);
977 return set_termios(real_tty, p, TERMIOS_OLD);
980 copy_termios(real_tty, &kterm);
981 if (kernel_termios_to_user_termios((struct termios __user *)arg, &kterm))
986 copy_termios(real_tty, &kterm);
987 if (kernel_termios_to_user_termios_1((struct termios __user *)arg, &kterm))
991 copy_termios(real_tty, &kterm);
992 if (kernel_termios_to_user_termios((struct termios2 __user *)arg, &kterm))
996 return set_termios(real_tty, p, TERMIOS_FLUSH | TERMIOS_WAIT);
998 return set_termios(real_tty, p, TERMIOS_WAIT);
1000 return set_termios(real_tty, p, 0);
1003 return get_termio(real_tty, p);
1005 return set_termios(real_tty, p, TERMIOS_FLUSH | TERMIOS_WAIT | TERMIOS_TERMIO);
1007 return set_termios(real_tty, p, TERMIOS_WAIT | TERMIOS_TERMIO);
1009 return set_termios(real_tty, p, TERMIOS_TERMIO);
1011 case TIOCGLCKTRMIOS:
1012 copy_termios_locked(real_tty, &kterm);
1013 if (kernel_termios_to_user_termios((struct termios __user *)arg, &kterm))
1016 case TIOCSLCKTRMIOS:
1017 if (!capable(CAP_SYS_ADMIN))
1019 copy_termios_locked(real_tty, &kterm);
1020 if (user_termios_to_kernel_termios(&kterm,
1021 (struct termios __user *) arg))
1023 down_write(&real_tty->termios_rwsem);
1024 real_tty->termios_locked = kterm;
1025 up_write(&real_tty->termios_rwsem);
1028 case TIOCGLCKTRMIOS:
1029 copy_termios_locked(real_tty, &kterm);
1030 if (kernel_termios_to_user_termios_1((struct termios __user *)arg, &kterm))
1033 case TIOCSLCKTRMIOS:
1034 if (!capable(CAP_SYS_ADMIN))
1036 copy_termios_locked(real_tty, &kterm);
1037 if (user_termios_to_kernel_termios_1(&kterm,
1038 (struct termios __user *) arg))
1040 down_write(&real_tty->termios_rwsem);
1041 real_tty->termios_locked = kterm;
1042 up_write(&real_tty->termios_rwsem);
1047 struct termiox ktermx;
1048 if (real_tty->termiox == NULL)
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)))
1058 return set_termiox(real_tty, p, 0);
1060 return set_termiox(real_tty, p, TERMIOS_WAIT);
1062 return set_termiox(real_tty, p, TERMIOS_FLUSH);
1065 copy_termios(real_tty, &kterm);
1066 ret = put_user((kterm.c_cflag & CLOCAL) ? 1 : 0,
1070 if (get_user(arg, (unsigned int __user *) arg))
1072 return tty_change_softcar(real_tty, arg);
1074 return -ENOIOCTLCMD;
1077 EXPORT_SYMBOL_GPL(tty_mode_ioctl);
1080 /* Caller guarantees ldisc reference is held */
1081 static int __tty_perform_flush(struct tty_struct *tty, unsigned long arg)
1083 struct tty_ldisc *ld = tty->ldisc;
1087 if (ld && ld->ops->flush_buffer) {
1088 ld->ops->flush_buffer(tty);
1089 tty_unthrottle(tty);
1093 if (ld && ld->ops->flush_buffer) {
1094 ld->ops->flush_buffer(tty);
1095 tty_unthrottle(tty);
1099 tty_driver_flush_buffer(tty);
1107 int tty_perform_flush(struct tty_struct *tty, unsigned long arg)
1109 struct tty_ldisc *ld;
1110 int retval = tty_check_change(tty);
1114 ld = tty_ldisc_ref_wait(tty);
1115 retval = __tty_perform_flush(tty, arg);
1117 tty_ldisc_deref(ld);
1120 EXPORT_SYMBOL_GPL(tty_perform_flush);
1122 int n_tty_ioctl_helper(struct tty_struct *tty, struct file *file,
1123 unsigned int cmd, unsigned long arg)
1129 retval = tty_check_change(tty);
1134 spin_lock_irq(&tty->flow_lock);
1135 if (!tty->flow_stopped) {
1136 tty->flow_stopped = 1;
1139 spin_unlock_irq(&tty->flow_lock);
1142 spin_lock_irq(&tty->flow_lock);
1143 if (tty->flow_stopped) {
1144 tty->flow_stopped = 0;
1147 spin_unlock_irq(&tty->flow_lock);
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);
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);
1166 retval = tty_check_change(tty);
1169 return __tty_perform_flush(tty, arg);
1171 /* Try the mode commands */
1172 return tty_mode_ioctl(tty, file, cmd, arg);
1175 EXPORT_SYMBOL(n_tty_ioctl_helper);
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)
1182 case TIOCGLCKTRMIOS:
1183 case TIOCSLCKTRMIOS:
1184 return tty_mode_ioctl(tty, file, cmd, (unsigned long) compat_ptr(arg));
1186 return -ENOIOCTLCMD;
1189 EXPORT_SYMBOL(n_tty_compat_ioctl_helper);