2 * linux/drivers/char/tty_ioctl.c
4 * Copyright (C) 1991, 1992, 1993, 1994 Linus Torvalds
6 * Modified by Fred N. van Kempen, 01/29/93, to add line disciplines
7 * which can be dynamically activated and de-activated by the line
8 * discipline handling modules (like SLIP).
11 #include <linux/types.h>
12 #include <linux/termios.h>
13 #include <linux/errno.h>
14 #include <linux/sched.h>
15 #include <linux/kernel.h>
16 #include <linux/major.h>
17 #include <linux/tty.h>
18 #include <linux/fcntl.h>
19 #include <linux/string.h>
21 #include <linux/module.h>
22 #include <linux/bitops.h>
23 #include <linux/mutex.h>
24 #include <linux/smp_lock.h>
27 #include <asm/uaccess.h>
28 #include <asm/system.h>
30 #undef TTY_DEBUG_WAIT_UNTIL_SENT
35 * Internal flag options for termios setting behavior
37 #define TERMIOS_FLUSH 1
38 #define TERMIOS_WAIT 2
39 #define TERMIOS_TERMIO 4
44 * tty_chars_in_buffer - characters pending
47 * Return the number of bytes of data in the device private
48 * output queue. If no private method is supplied there is assumed
49 * to be no queue on the device.
52 int tty_chars_in_buffer(struct tty_struct *tty)
54 if (tty->ops->chars_in_buffer)
55 return tty->ops->chars_in_buffer(tty);
59 EXPORT_SYMBOL(tty_chars_in_buffer);
62 * tty_write_room - write queue space
65 * Return the number of bytes that can be queued to this device
66 * at the present time. The result should be treated as a guarantee
67 * and the driver cannot offer a value it later shrinks by more than
68 * the number of bytes written. If no method is provided 2K is always
69 * returned and data may be lost as there will be no flow control.
72 int tty_write_room(struct tty_struct *tty)
74 if (tty->ops->write_room)
75 return tty->ops->write_room(tty);
78 EXPORT_SYMBOL(tty_write_room);
81 * tty_driver_flush_buffer - discard internal buffer
84 * Discard the internal output buffer for this device. If no method
85 * is provided then either the buffer cannot be hardware flushed or
86 * there is no buffer driver side.
88 void tty_driver_flush_buffer(struct tty_struct *tty)
90 if (tty->ops->flush_buffer)
91 tty->ops->flush_buffer(tty);
93 EXPORT_SYMBOL(tty_driver_flush_buffer);
96 * tty_throttle - flow control
99 * Indicate that a tty should stop transmitting data down the stack.
102 void tty_throttle(struct tty_struct *tty)
104 /* check TTY_THROTTLED first so it indicates our state */
105 if (!test_and_set_bit(TTY_THROTTLED, &tty->flags) &&
107 tty->ops->throttle(tty);
109 EXPORT_SYMBOL(tty_throttle);
112 * tty_unthrottle - flow control
115 * Indicate that a tty may continue transmitting data down the stack.
118 void tty_unthrottle(struct tty_struct *tty)
120 if (test_and_clear_bit(TTY_THROTTLED, &tty->flags) &&
121 tty->ops->unthrottle)
122 tty->ops->unthrottle(tty);
124 EXPORT_SYMBOL(tty_unthrottle);
127 * tty_wait_until_sent - wait for I/O to finish
128 * @tty: tty we are waiting for
129 * @timeout: how long we will wait
131 * Wait for characters pending in a tty driver to hit the wire, or
132 * for a timeout to occur (eg due to flow control)
137 void tty_wait_until_sent(struct tty_struct *tty, long timeout)
139 #ifdef TTY_DEBUG_WAIT_UNTIL_SENT
142 printk(KERN_DEBUG "%s wait until sent...\n", tty_name(tty, buf));
145 timeout = MAX_SCHEDULE_TIMEOUT;
146 if (wait_event_interruptible_timeout(tty->write_wait,
147 !tty_chars_in_buffer(tty), timeout) >= 0) {
148 if (tty->ops->wait_until_sent)
149 tty->ops->wait_until_sent(tty, timeout);
152 EXPORT_SYMBOL(tty_wait_until_sent);
156 * Termios Helper Methods
159 static void unset_locked_termios(struct ktermios *termios,
160 struct ktermios *old,
161 struct ktermios *locked)
165 #define NOSET_MASK(x, y, z) (x = ((x) & ~(z)) | ((y) & (z)))
168 printk(KERN_WARNING "Warning?!? termios_locked is NULL.\n");
172 NOSET_MASK(termios->c_iflag, old->c_iflag, locked->c_iflag);
173 NOSET_MASK(termios->c_oflag, old->c_oflag, locked->c_oflag);
174 NOSET_MASK(termios->c_cflag, old->c_cflag, locked->c_cflag);
175 NOSET_MASK(termios->c_lflag, old->c_lflag, locked->c_lflag);
176 termios->c_line = locked->c_line ? old->c_line : termios->c_line;
177 for (i = 0; i < NCCS; i++)
178 termios->c_cc[i] = locked->c_cc[i] ?
179 old->c_cc[i] : termios->c_cc[i];
180 /* FIXME: What should we do for i/ospeed */
184 * Routine which returns the baud rate of the tty
186 * Note that the baud_table needs to be kept in sync with the
187 * include/asm/termbits.h file.
189 static const speed_t baud_table[] = {
190 0, 50, 75, 110, 134, 150, 200, 300, 600, 1200, 1800, 2400, 4800,
191 9600, 19200, 38400, 57600, 115200, 230400, 460800,
193 76800, 153600, 307200, 614400, 921600
195 500000, 576000, 921600, 1000000, 1152000, 1500000, 2000000,
196 2500000, 3000000, 3500000, 4000000
201 static const tcflag_t baud_bits[] = {
202 B0, B50, B75, B110, B134, B150, B200, B300, B600,
203 B1200, B1800, B2400, B4800, B9600, B19200, B38400,
204 B57600, B115200, B230400, B460800, B500000, B576000,
205 B921600, B1000000, B1152000, B1500000, B2000000, B2500000,
206 B3000000, B3500000, B4000000
209 static const tcflag_t baud_bits[] = {
210 B0, B50, B75, B110, B134, B150, B200, B300, B600,
211 B1200, B1800, B2400, B4800, B9600, B19200, B38400,
212 B57600, B115200, B230400, B460800, B76800, B153600,
213 B307200, B614400, B921600
217 static int n_baud_table = ARRAY_SIZE(baud_table);
220 * tty_termios_baud_rate
221 * @termios: termios structure
223 * Convert termios baud rate data into a speed. This should be called
224 * with the termios lock held if this termios is a terminal termios
225 * structure. May change the termios data. Device drivers can call this
226 * function but should use ->c_[io]speed directly as they are updated.
231 speed_t tty_termios_baud_rate(struct ktermios *termios)
235 cbaud = termios->c_cflag & CBAUD;
238 /* Magic token for arbitary speed via c_ispeed/c_ospeed */
240 return termios->c_ospeed;
242 if (cbaud & CBAUDEX) {
245 if (cbaud < 1 || cbaud + 15 > n_baud_table)
246 termios->c_cflag &= ~CBAUDEX;
250 return baud_table[cbaud];
252 EXPORT_SYMBOL(tty_termios_baud_rate);
255 * tty_termios_input_baud_rate
256 * @termios: termios structure
258 * Convert termios baud rate data into a speed. This should be called
259 * with the termios lock held if this termios is a terminal termios
260 * structure. May change the termios data. Device drivers can call this
261 * function but should use ->c_[io]speed directly as they are updated.
266 speed_t tty_termios_input_baud_rate(struct ktermios *termios)
269 unsigned int cbaud = (termios->c_cflag >> IBSHIFT) & CBAUD;
272 return tty_termios_baud_rate(termios);
274 /* Magic token for arbitary speed via c_ispeed*/
276 return termios->c_ispeed;
278 if (cbaud & CBAUDEX) {
281 if (cbaud < 1 || cbaud + 15 > n_baud_table)
282 termios->c_cflag &= ~(CBAUDEX << IBSHIFT);
286 return baud_table[cbaud];
288 return tty_termios_baud_rate(termios);
291 EXPORT_SYMBOL(tty_termios_input_baud_rate);
294 * tty_termios_encode_baud_rate
295 * @termios: ktermios structure holding user requested state
296 * @ispeed: input speed
297 * @ospeed: output speed
299 * Encode the speeds set into the passed termios structure. This is
300 * used as a library helper for drivers os that they can report back
301 * the actual speed selected when it differs from the speed requested
303 * For maximal back compatibility with legacy SYS5/POSIX *nix behaviour
304 * we need to carefully set the bits when the user does not get the
305 * desired speed. We allow small margins and preserve as much of possible
306 * of the input intent to keep compatiblity.
308 * Locking: Caller should hold termios lock. This is already held
309 * when calling this function from the driver termios handler.
311 * The ifdefs deal with platforms whose owners have yet to update them
312 * and will all go away once this is done.
315 void tty_termios_encode_baud_rate(struct ktermios *termios,
316 speed_t ibaud, speed_t obaud)
319 int ifound = -1, ofound = -1;
320 int iclose = ibaud/50, oclose = obaud/50;
323 if (obaud == 0) /* CD dropped */
324 ibaud = 0; /* Clear ibaud to be sure */
326 termios->c_ispeed = ibaud;
327 termios->c_ospeed = obaud;
330 /* If the user asked for a precise weird speed give a precise weird
331 answer. If they asked for a Bfoo speed they many have problems
332 digesting non-exact replies so fuzz a bit */
334 if ((termios->c_cflag & CBAUD) == BOTHER)
336 if (((termios->c_cflag >> IBSHIFT) & CBAUD) == BOTHER)
338 if ((termios->c_cflag >> IBSHIFT) & CBAUD)
339 ibinput = 1; /* An input speed was specified */
341 termios->c_cflag &= ~CBAUD;
344 * Our goal is to find a close match to the standard baud rate
345 * returned. Walk the baud rate table and if we get a very close
346 * match then report back the speed as a POSIX Bxxxx value by
351 if (obaud - oclose <= baud_table[i] &&
352 obaud + oclose >= baud_table[i]) {
353 termios->c_cflag |= baud_bits[i];
356 if (ibaud - iclose <= baud_table[i] &&
357 ibaud + iclose >= baud_table[i]) {
358 /* For the case input == output don't set IBAUD bits
359 if the user didn't do so */
360 if (ofound == i && !ibinput)
365 termios->c_cflag |= (baud_bits[i] << IBSHIFT);
369 } while (++i < n_baud_table);
372 * If we found no match then use BOTHER if provided or warn
373 * the user their platform maintainer needs to wake up if not.
377 termios->c_cflag |= BOTHER;
378 /* Set exact input bits only if the input and output differ or the
380 if (ifound == -1 && (ibaud != obaud || ibinput))
381 termios->c_cflag |= (BOTHER << IBSHIFT);
383 if (ifound == -1 || ofound == -1) {
386 printk(KERN_WARNING "tty: Unable to return correct "
387 "speed data as your architecture needs updating.\n");
391 EXPORT_SYMBOL_GPL(tty_termios_encode_baud_rate);
394 * tty_encode_baud_rate - set baud rate of the tty
395 * @ibaud: input baud rate
396 * @obad: output baud rate
398 * Update the current termios data for the tty with the new speed
399 * settings. The caller must hold the termios_mutex for the tty in
403 void tty_encode_baud_rate(struct tty_struct *tty, speed_t ibaud, speed_t obaud)
405 tty_termios_encode_baud_rate(tty->termios, ibaud, obaud);
407 EXPORT_SYMBOL_GPL(tty_encode_baud_rate);
410 * tty_get_baud_rate - get tty bit rates
413 * Returns the baud rate as an integer for this terminal. The
414 * termios lock must be held by the caller and the terminal bit
415 * flags may be updated.
420 speed_t tty_get_baud_rate(struct tty_struct *tty)
422 speed_t baud = tty_termios_baud_rate(tty->termios);
424 if (baud == 38400 && tty->alt_speed) {
426 printk(KERN_WARNING "Use of setserial/setrocket to "
427 "set SPD_* flags is deprecated\n");
430 baud = tty->alt_speed;
435 EXPORT_SYMBOL(tty_get_baud_rate);
438 * tty_termios_copy_hw - copy hardware settings
442 * Propogate the hardware specific terminal setting bits from
443 * the old termios structure to the new one. This is used in cases
444 * where the hardware does not support reconfiguration or as a helper
445 * in some cases where only minimal reconfiguration is supported
448 void tty_termios_copy_hw(struct ktermios *new, struct ktermios *old)
450 /* The bits a dumb device handles in software. Smart devices need
451 to always provide a set_termios method */
452 new->c_cflag &= HUPCL | CREAD | CLOCAL;
453 new->c_cflag |= old->c_cflag & ~(HUPCL | CREAD | CLOCAL);
454 new->c_ispeed = old->c_ispeed;
455 new->c_ospeed = old->c_ospeed;
457 EXPORT_SYMBOL(tty_termios_copy_hw);
460 * tty_termios_hw_change - check for setting change
462 * @b: termios to compare
464 * Check if any of the bits that affect a dumb device have changed
465 * between the two termios structures, or a speed change is needed.
468 int tty_termios_hw_change(struct ktermios *a, struct ktermios *b)
470 if (a->c_ispeed != b->c_ispeed || a->c_ospeed != b->c_ospeed)
472 if ((a->c_cflag ^ b->c_cflag) & ~(HUPCL | CREAD | CLOCAL))
476 EXPORT_SYMBOL(tty_termios_hw_change);
479 * change_termios - update termios values
480 * @tty: tty to update
481 * @new_termios: desired new value
483 * Perform updates to the termios values set on this terminal. There
484 * is a bit of layering violation here with n_tty in terms of the
485 * internal knowledge of this function.
487 * Locking: termios_mutex
490 static void change_termios(struct tty_struct *tty, struct ktermios *new_termios)
492 struct ktermios old_termios;
493 struct tty_ldisc *ld;
497 * Perform the actual termios internal changes under lock.
501 /* FIXME: we need to decide on some locking/ordering semantics
502 for the set_termios notification eventually */
503 mutex_lock(&tty->termios_mutex);
504 old_termios = *tty->termios;
505 *tty->termios = *new_termios;
506 unset_locked_termios(tty->termios, &old_termios, tty->termios_locked);
508 /* See if packet mode change of state. */
509 if (tty->link && tty->link->packet) {
510 int old_flow = ((old_termios.c_iflag & IXON) &&
511 (old_termios.c_cc[VSTOP] == '\023') &&
512 (old_termios.c_cc[VSTART] == '\021'));
513 int new_flow = (I_IXON(tty) &&
514 STOP_CHAR(tty) == '\023' &&
515 START_CHAR(tty) == '\021');
516 if (old_flow != new_flow) {
517 spin_lock_irqsave(&tty->ctrl_lock, flags);
518 tty->ctrl_status &= ~(TIOCPKT_DOSTOP | TIOCPKT_NOSTOP);
520 tty->ctrl_status |= TIOCPKT_DOSTOP;
522 tty->ctrl_status |= TIOCPKT_NOSTOP;
523 spin_unlock_irqrestore(&tty->ctrl_lock, flags);
524 wake_up_interruptible(&tty->link->read_wait);
528 if (tty->ops->set_termios)
529 (*tty->ops->set_termios)(tty, &old_termios);
531 tty_termios_copy_hw(tty->termios, &old_termios);
533 ld = tty_ldisc_ref(tty);
535 if (ld->ops->set_termios)
536 (ld->ops->set_termios)(tty, &old_termios);
539 mutex_unlock(&tty->termios_mutex);
543 * set_termios - set termios values for a tty
544 * @tty: terminal device
546 * @opt: option information
548 * Helper function to prepare termios data and run necessary other
549 * functions before using change_termios to do the actual changes.
552 * Called functions take ldisc and termios_mutex locks
555 static int set_termios(struct tty_struct *tty, void __user *arg, int opt)
557 struct ktermios tmp_termios;
558 struct tty_ldisc *ld;
559 int retval = tty_check_change(tty);
564 mutex_lock(&tty->termios_mutex);
565 memcpy(&tmp_termios, tty->termios, sizeof(struct ktermios));
566 mutex_unlock(&tty->termios_mutex);
568 if (opt & TERMIOS_TERMIO) {
569 if (user_termio_to_kernel_termios(&tmp_termios,
570 (struct termio __user *)arg))
573 } else if (opt & TERMIOS_OLD) {
574 if (user_termios_to_kernel_termios_1(&tmp_termios,
575 (struct termios __user *)arg))
578 if (user_termios_to_kernel_termios(&tmp_termios,
579 (struct termios2 __user *)arg))
583 } else if (user_termios_to_kernel_termios(&tmp_termios,
584 (struct termios __user *)arg))
588 /* If old style Bfoo values are used then load c_ispeed/c_ospeed
589 * with the real speed so its unconditionally usable */
590 tmp_termios.c_ispeed = tty_termios_input_baud_rate(&tmp_termios);
591 tmp_termios.c_ospeed = tty_termios_baud_rate(&tmp_termios);
593 ld = tty_ldisc_ref(tty);
596 if ((opt & TERMIOS_FLUSH) && ld->ops->flush_buffer)
597 ld->ops->flush_buffer(tty);
601 if (opt & TERMIOS_WAIT) {
602 tty_wait_until_sent(tty, 0);
603 if (signal_pending(current))
607 change_termios(tty, &tmp_termios);
609 /* FIXME: Arguably if tmp_termios == tty->termios AND the
610 actual requested termios was not tmp_termios then we may
611 want to return an error as no user requested change has
616 static int get_termio(struct tty_struct *tty, struct termio __user *termio)
618 if (kernel_termios_to_user_termio(termio, tty->termios))
627 * set_termiox - set termiox fields if possible
629 * @arg: termiox structure from user
630 * @opt: option flags for ioctl type
632 * Implement the device calling points for the SYS5 termiox ioctl
636 static int set_termiox(struct tty_struct *tty, void __user *arg, int opt)
639 struct tty_ldisc *ld;
641 if (tty->termiox == NULL)
643 if (copy_from_user(&tnew, arg, sizeof(struct termiox)))
646 ld = tty_ldisc_ref(tty);
648 if ((opt & TERMIOS_FLUSH) && ld->ops->flush_buffer)
649 ld->ops->flush_buffer(tty);
652 if (opt & TERMIOS_WAIT) {
653 tty_wait_until_sent(tty, 0);
654 if (signal_pending(current))
658 mutex_lock(&tty->termios_mutex);
659 if (tty->ops->set_termiox)
660 tty->ops->set_termiox(tty, &tnew);
661 mutex_unlock(&tty->termios_mutex);
670 * These are deprecated, but there is limited support..
672 * The "sg_flags" translation is a joke..
674 static int get_sgflags(struct tty_struct *tty)
678 if (!(tty->termios->c_lflag & ICANON)) {
679 if (tty->termios->c_lflag & ISIG)
680 flags |= 0x02; /* cbreak */
682 flags |= 0x20; /* raw */
684 if (tty->termios->c_lflag & ECHO)
685 flags |= 0x08; /* echo */
686 if (tty->termios->c_oflag & OPOST)
687 if (tty->termios->c_oflag & ONLCR)
688 flags |= 0x10; /* crmod */
692 static int get_sgttyb(struct tty_struct *tty, struct sgttyb __user *sgttyb)
696 mutex_lock(&tty->termios_mutex);
697 tmp.sg_ispeed = tty->termios->c_ispeed;
698 tmp.sg_ospeed = tty->termios->c_ospeed;
699 tmp.sg_erase = tty->termios->c_cc[VERASE];
700 tmp.sg_kill = tty->termios->c_cc[VKILL];
701 tmp.sg_flags = get_sgflags(tty);
702 mutex_unlock(&tty->termios_mutex);
704 return copy_to_user(sgttyb, &tmp, sizeof(tmp)) ? -EFAULT : 0;
707 static void set_sgflags(struct ktermios *termios, int flags)
709 termios->c_iflag = ICRNL | IXON;
710 termios->c_oflag = 0;
711 termios->c_lflag = ISIG | ICANON;
712 if (flags & 0x02) { /* cbreak */
713 termios->c_iflag = 0;
714 termios->c_lflag &= ~ICANON;
716 if (flags & 0x08) { /* echo */
717 termios->c_lflag |= ECHO | ECHOE | ECHOK |
718 ECHOCTL | ECHOKE | IEXTEN;
720 if (flags & 0x10) { /* crmod */
721 termios->c_oflag |= OPOST | ONLCR;
723 if (flags & 0x20) { /* raw */
724 termios->c_iflag = 0;
725 termios->c_lflag &= ~(ISIG | ICANON);
727 if (!(termios->c_lflag & ICANON)) {
728 termios->c_cc[VMIN] = 1;
729 termios->c_cc[VTIME] = 0;
734 * set_sgttyb - set legacy terminal values
735 * @tty: tty structure
736 * @sgttyb: pointer to old style terminal structure
738 * Updates a terminal from the legacy BSD style terminal information
741 * Locking: termios_mutex
744 static int set_sgttyb(struct tty_struct *tty, struct sgttyb __user *sgttyb)
748 struct ktermios termios;
750 retval = tty_check_change(tty);
754 if (copy_from_user(&tmp, sgttyb, sizeof(tmp)))
757 mutex_lock(&tty->termios_mutex);
758 termios = *tty->termios;
759 termios.c_cc[VERASE] = tmp.sg_erase;
760 termios.c_cc[VKILL] = tmp.sg_kill;
761 set_sgflags(&termios, tmp.sg_flags);
762 /* Try and encode into Bfoo format */
764 tty_termios_encode_baud_rate(&termios, termios.c_ispeed,
767 mutex_unlock(&tty->termios_mutex);
768 change_termios(tty, &termios);
774 static int get_tchars(struct tty_struct *tty, struct tchars __user *tchars)
778 mutex_lock(&tty->termios_mutex);
779 tmp.t_intrc = tty->termios->c_cc[VINTR];
780 tmp.t_quitc = tty->termios->c_cc[VQUIT];
781 tmp.t_startc = tty->termios->c_cc[VSTART];
782 tmp.t_stopc = tty->termios->c_cc[VSTOP];
783 tmp.t_eofc = tty->termios->c_cc[VEOF];
784 tmp.t_brkc = tty->termios->c_cc[VEOL2]; /* what is brkc anyway? */
785 mutex_unlock(&tty->termios_mutex);
786 return copy_to_user(tchars, &tmp, sizeof(tmp)) ? -EFAULT : 0;
789 static int set_tchars(struct tty_struct *tty, struct tchars __user *tchars)
793 if (copy_from_user(&tmp, tchars, sizeof(tmp)))
795 mutex_lock(&tty->termios_mutex);
796 tty->termios->c_cc[VINTR] = tmp.t_intrc;
797 tty->termios->c_cc[VQUIT] = tmp.t_quitc;
798 tty->termios->c_cc[VSTART] = tmp.t_startc;
799 tty->termios->c_cc[VSTOP] = tmp.t_stopc;
800 tty->termios->c_cc[VEOF] = tmp.t_eofc;
801 tty->termios->c_cc[VEOL2] = tmp.t_brkc; /* what is brkc anyway? */
802 mutex_unlock(&tty->termios_mutex);
808 static int get_ltchars(struct tty_struct *tty, struct ltchars __user *ltchars)
812 mutex_lock(&tty->termios_mutex);
813 tmp.t_suspc = tty->termios->c_cc[VSUSP];
814 /* what is dsuspc anyway? */
815 tmp.t_dsuspc = tty->termios->c_cc[VSUSP];
816 tmp.t_rprntc = tty->termios->c_cc[VREPRINT];
817 /* what is flushc anyway? */
818 tmp.t_flushc = tty->termios->c_cc[VEOL2];
819 tmp.t_werasc = tty->termios->c_cc[VWERASE];
820 tmp.t_lnextc = tty->termios->c_cc[VLNEXT];
821 mutex_unlock(&tty->termios_mutex);
822 return copy_to_user(ltchars, &tmp, sizeof(tmp)) ? -EFAULT : 0;
825 static int set_ltchars(struct tty_struct *tty, struct ltchars __user *ltchars)
829 if (copy_from_user(&tmp, ltchars, sizeof(tmp)))
832 mutex_lock(&tty->termios_mutex);
833 tty->termios->c_cc[VSUSP] = tmp.t_suspc;
834 /* what is dsuspc anyway? */
835 tty->termios->c_cc[VEOL2] = tmp.t_dsuspc;
836 tty->termios->c_cc[VREPRINT] = tmp.t_rprntc;
837 /* what is flushc anyway? */
838 tty->termios->c_cc[VEOL2] = tmp.t_flushc;
839 tty->termios->c_cc[VWERASE] = tmp.t_werasc;
840 tty->termios->c_cc[VLNEXT] = tmp.t_lnextc;
841 mutex_unlock(&tty->termios_mutex);
847 * send_prio_char - send priority character
849 * Send a high priority character to the tty even if stopped
851 * Locking: none for xchar method, write ordering for write method.
854 static int send_prio_char(struct tty_struct *tty, char ch)
856 int was_stopped = tty->stopped;
858 if (tty->ops->send_xchar) {
859 tty->ops->send_xchar(tty, ch);
863 if (tty_write_lock(tty, 0) < 0)
868 tty->ops->write(tty, &ch, 1);
871 tty_write_unlock(tty);
876 * tty_change_softcar - carrier change ioctl helper
877 * @tty: tty to update
878 * @arg: enable/disable CLOCAL
880 * Perform a change to the CLOCAL state and call into the driver
881 * layer to make it visible. All done with the termios mutex
884 static int tty_change_softcar(struct tty_struct *tty, int arg)
887 int bit = arg ? CLOCAL : 0;
890 mutex_lock(&tty->termios_mutex);
892 tty->termios->c_cflag &= ~CLOCAL;
893 tty->termios->c_cflag |= bit;
894 if (tty->ops->set_termios)
895 tty->ops->set_termios(tty, &old);
896 if ((tty->termios->c_cflag & CLOCAL) != bit)
898 mutex_unlock(&tty->termios_mutex);
903 * tty_mode_ioctl - mode related ioctls
904 * @tty: tty for the ioctl
905 * @file: file pointer for the tty
907 * @arg: ioctl argument
909 * Perform non line discipline specific mode control ioctls. This
910 * is designed to be called by line disciplines to ensure they provide
911 * consistent mode setting.
914 int tty_mode_ioctl(struct tty_struct *tty, struct file *file,
915 unsigned int cmd, unsigned long arg)
917 struct tty_struct *real_tty;
918 void __user *p = (void __user *)arg;
921 if (tty->driver->type == TTY_DRIVER_TYPE_PTY &&
922 tty->driver->subtype == PTY_TYPE_MASTER)
923 real_tty = tty->link;
930 return get_sgttyb(real_tty, (struct sgttyb __user *) arg);
933 return set_sgttyb(real_tty, (struct sgttyb __user *) arg);
937 return get_tchars(real_tty, p);
939 return set_tchars(real_tty, p);
943 return get_ltchars(real_tty, p);
945 return set_ltchars(real_tty, p);
948 return set_termios(real_tty, p, TERMIOS_FLUSH | TERMIOS_WAIT | TERMIOS_OLD);
950 return set_termios(real_tty, p, TERMIOS_WAIT | TERMIOS_OLD);
952 return set_termios(real_tty, p, TERMIOS_OLD);
955 mutex_lock(&real_tty->termios_mutex);
956 if (kernel_termios_to_user_termios((struct termios __user *)arg, real_tty->termios))
958 mutex_unlock(&real_tty->termios_mutex);
962 mutex_lock(&real_tty->termios_mutex);
963 if (kernel_termios_to_user_termios_1((struct termios __user *)arg, real_tty->termios))
965 mutex_unlock(&real_tty->termios_mutex);
968 mutex_lock(&real_tty->termios_mutex);
969 if (kernel_termios_to_user_termios((struct termios2 __user *)arg, real_tty->termios))
971 mutex_unlock(&real_tty->termios_mutex);
974 return set_termios(real_tty, p, TERMIOS_FLUSH | TERMIOS_WAIT);
976 return set_termios(real_tty, p, TERMIOS_WAIT);
978 return set_termios(real_tty, p, 0);
981 return get_termio(real_tty, p);
983 return set_termios(real_tty, p, TERMIOS_FLUSH | TERMIOS_WAIT | TERMIOS_TERMIO);
985 return set_termios(real_tty, p, TERMIOS_WAIT | TERMIOS_TERMIO);
987 return set_termios(real_tty, p, TERMIOS_TERMIO);
990 mutex_lock(&real_tty->termios_mutex);
991 if (kernel_termios_to_user_termios((struct termios __user *)arg, real_tty->termios_locked))
993 mutex_unlock(&real_tty->termios_mutex);
996 if (!capable(CAP_SYS_ADMIN))
998 mutex_lock(&real_tty->termios_mutex);
999 if (user_termios_to_kernel_termios(real_tty->termios_locked,
1000 (struct termios __user *) arg))
1002 mutex_unlock(&real_tty->termios_mutex);
1005 case TIOCGLCKTRMIOS:
1006 mutex_lock(&real_tty->termios_mutex);
1007 if (kernel_termios_to_user_termios_1((struct termios __user *)arg, real_tty->termios_locked))
1009 mutex_unlock(&real_tty->termios_mutex);
1011 case TIOCSLCKTRMIOS:
1012 if (!capable(CAP_SYS_ADMIN))
1014 mutex_lock(&real_tty->termios_mutex);
1015 if (user_termios_to_kernel_termios_1(real_tty->termios_locked,
1016 (struct termios __user *) arg))
1018 mutex_unlock(&real_tty->termios_mutex);
1023 if (real_tty->termiox == NULL)
1025 mutex_lock(&real_tty->termios_mutex);
1026 if (copy_to_user(p, real_tty->termiox, sizeof(struct termiox)))
1028 mutex_unlock(&real_tty->termios_mutex);
1031 return set_termiox(real_tty, p, 0);
1033 return set_termiox(real_tty, p, TERMIOS_WAIT);
1035 return set_termiox(real_tty, p, TERMIOS_FLUSH);
1038 mutex_lock(&real_tty->termios_mutex);
1039 ret = put_user(C_CLOCAL(real_tty) ? 1 : 0,
1041 mutex_unlock(&real_tty->termios_mutex);
1044 if (get_user(arg, (unsigned int __user *) arg))
1046 return tty_change_softcar(real_tty, arg);
1048 return -ENOIOCTLCMD;
1051 EXPORT_SYMBOL_GPL(tty_mode_ioctl);
1053 int tty_perform_flush(struct tty_struct *tty, unsigned long arg)
1055 struct tty_ldisc *ld;
1056 int retval = tty_check_change(tty);
1060 ld = tty_ldisc_ref_wait(tty);
1063 if (ld && ld->ops->flush_buffer)
1064 ld->ops->flush_buffer(tty);
1067 if (ld && ld->ops->flush_buffer)
1068 ld->ops->flush_buffer(tty);
1071 tty_driver_flush_buffer(tty);
1074 tty_ldisc_deref(ld);
1077 tty_ldisc_deref(ld);
1080 EXPORT_SYMBOL_GPL(tty_perform_flush);
1082 int n_tty_ioctl_helper(struct tty_struct *tty, struct file *file,
1083 unsigned int cmd, unsigned long arg)
1085 unsigned long flags;
1090 retval = tty_check_change(tty);
1095 if (!tty->flow_stopped) {
1096 tty->flow_stopped = 1;
1101 if (tty->flow_stopped) {
1102 tty->flow_stopped = 0;
1107 if (STOP_CHAR(tty) != __DISABLED_CHAR)
1108 return send_prio_char(tty, STOP_CHAR(tty));
1111 if (START_CHAR(tty) != __DISABLED_CHAR)
1112 return send_prio_char(tty, START_CHAR(tty));
1119 return tty_perform_flush(tty, arg);
1124 if (tty->driver->type != TTY_DRIVER_TYPE_PTY ||
1125 tty->driver->subtype != PTY_TYPE_MASTER)
1127 if (get_user(pktmode, (int __user *) arg))
1129 spin_lock_irqsave(&tty->ctrl_lock, flags);
1133 tty->link->ctrl_status = 0;
1137 spin_unlock_irqrestore(&tty->ctrl_lock, flags);
1141 /* Try the mode commands */
1142 return tty_mode_ioctl(tty, file, cmd, arg);
1145 EXPORT_SYMBOL(n_tty_ioctl_helper);