1 // SPDX-License-Identifier: GPL-2.0
3 * Copyright (C) 1991, 1992, 1993, 1994 Linus Torvalds
5 * Modified by Fred N. van Kempen, 01/29/93, to add line disciplines
6 * which can be dynamically activated and de-activated by the line
7 * discipline handling modules (like SLIP).
10 #include <linux/bits.h>
11 #include <linux/types.h>
12 #include <linux/termios.h>
13 #include <linux/errno.h>
14 #include <linux/sched/signal.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/compat.h>
25 #include <linux/termios_internal.h>
29 #include <linux/uaccess.h>
34 * Internal flag options for termios setting behavior
36 #define TERMIOS_FLUSH BIT(0)
37 #define TERMIOS_WAIT BIT(1)
38 #define TERMIOS_TERMIO BIT(2)
39 #define TERMIOS_OLD BIT(3)
42 * tty_chars_in_buffer - characters pending
45 * Returns: the number of bytes of data in the device private output queue. If
46 * no private method is supplied there is assumed to be no queue on the device.
48 unsigned int tty_chars_in_buffer(struct tty_struct
*tty
)
50 if (tty
->ops
->chars_in_buffer
)
51 return tty
->ops
->chars_in_buffer(tty
);
54 EXPORT_SYMBOL(tty_chars_in_buffer
);
57 * tty_write_room - write queue space
60 * Returns: the number of bytes that can be queued to this device at the present
61 * time. The result should be treated as a guarantee and the driver cannot
62 * offer a value it later shrinks by more than the number of bytes written. If
63 * no method is provided, 2K is always returned and data may be lost as there
64 * will be no flow control.
66 unsigned int tty_write_room(struct tty_struct
*tty
)
68 if (tty
->ops
->write_room
)
69 return tty
->ops
->write_room(tty
);
72 EXPORT_SYMBOL(tty_write_room
);
75 * tty_driver_flush_buffer - discard internal buffer
78 * Discard the internal output buffer for this device. If no method is provided,
79 * then either the buffer cannot be hardware flushed or there is no buffer
82 void tty_driver_flush_buffer(struct tty_struct
*tty
)
84 if (tty
->ops
->flush_buffer
)
85 tty
->ops
->flush_buffer(tty
);
87 EXPORT_SYMBOL(tty_driver_flush_buffer
);
90 * tty_unthrottle - flow control
93 * Indicate that a @tty may continue transmitting data down the stack. Takes
94 * the &tty_struct->termios_rwsem to protect against parallel
95 * throttle/unthrottle and also to ensure the driver can consistently reference
96 * its own termios data at this point when implementing software flow control.
98 * Drivers should however remember that the stack can issue a throttle, then
99 * change flow control method, then unthrottle.
101 void tty_unthrottle(struct tty_struct
*tty
)
103 down_write(&tty
->termios_rwsem
);
104 if (test_and_clear_bit(TTY_THROTTLED
, &tty
->flags
) &&
105 tty
->ops
->unthrottle
)
106 tty
->ops
->unthrottle(tty
);
107 tty
->flow_change
= TTY_FLOW_NO_CHANGE
;
108 up_write(&tty
->termios_rwsem
);
110 EXPORT_SYMBOL(tty_unthrottle
);
113 * tty_throttle_safe - flow control
116 * Indicate that a @tty should stop transmitting data down the stack.
117 * tty_throttle_safe() will only attempt throttle if @tty->flow_change is
118 * %TTY_THROTTLE_SAFE. Prevents an accidental throttle due to race conditions
119 * when throttling is conditional on factors evaluated prior to throttling.
121 * Returns: %true if @tty is throttled (or was already throttled)
123 bool tty_throttle_safe(struct tty_struct
*tty
)
127 mutex_lock(&tty
->throttle_mutex
);
128 if (!tty_throttled(tty
)) {
129 if (tty
->flow_change
!= TTY_THROTTLE_SAFE
)
132 set_bit(TTY_THROTTLED
, &tty
->flags
);
133 if (tty
->ops
->throttle
)
134 tty
->ops
->throttle(tty
);
137 mutex_unlock(&tty
->throttle_mutex
);
143 * tty_unthrottle_safe - flow control
146 * Similar to tty_unthrottle() but will only attempt unthrottle if
147 * @tty->flow_change is %TTY_UNTHROTTLE_SAFE. Prevents an accidental unthrottle
148 * due to race conditions when unthrottling is conditional on factors evaluated
149 * prior to unthrottling.
151 * Returns: %true if @tty is unthrottled (or was already unthrottled)
153 bool tty_unthrottle_safe(struct tty_struct
*tty
)
157 mutex_lock(&tty
->throttle_mutex
);
158 if (tty_throttled(tty
)) {
159 if (tty
->flow_change
!= TTY_UNTHROTTLE_SAFE
)
162 clear_bit(TTY_THROTTLED
, &tty
->flags
);
163 if (tty
->ops
->unthrottle
)
164 tty
->ops
->unthrottle(tty
);
167 mutex_unlock(&tty
->throttle_mutex
);
173 * tty_wait_until_sent - wait for I/O to finish
174 * @tty: tty we are waiting for
175 * @timeout: how long we will wait
177 * Wait for characters pending in a tty driver to hit the wire, or for a
178 * timeout to occur (eg due to flow control).
183 void tty_wait_until_sent(struct tty_struct
*tty
, long timeout
)
186 timeout
= MAX_SCHEDULE_TIMEOUT
;
188 timeout
= wait_event_interruptible_timeout(tty
->write_wait
,
189 !tty_chars_in_buffer(tty
), timeout
);
193 if (timeout
== MAX_SCHEDULE_TIMEOUT
)
196 if (tty
->ops
->wait_until_sent
)
197 tty
->ops
->wait_until_sent(tty
, timeout
);
199 EXPORT_SYMBOL(tty_wait_until_sent
);
203 * Termios Helper Methods
206 static void unset_locked_termios(struct tty_struct
*tty
, const struct ktermios
*old
)
208 struct ktermios
*termios
= &tty
->termios
;
209 struct ktermios
*locked
= &tty
->termios_locked
;
212 #define NOSET_MASK(x, y, z) (x = ((x) & ~(z)) | ((y) & (z)))
214 NOSET_MASK(termios
->c_iflag
, old
->c_iflag
, locked
->c_iflag
);
215 NOSET_MASK(termios
->c_oflag
, old
->c_oflag
, locked
->c_oflag
);
216 NOSET_MASK(termios
->c_cflag
, old
->c_cflag
, locked
->c_cflag
);
217 NOSET_MASK(termios
->c_lflag
, old
->c_lflag
, locked
->c_lflag
);
218 termios
->c_line
= locked
->c_line
? old
->c_line
: termios
->c_line
;
219 for (i
= 0; i
< NCCS
; i
++)
220 termios
->c_cc
[i
] = locked
->c_cc
[i
] ?
221 old
->c_cc
[i
] : termios
->c_cc
[i
];
222 /* FIXME: What should we do for i/ospeed */
226 * tty_termios_copy_hw - copy hardware settings
230 * Propagate the hardware specific terminal setting bits from the @old termios
231 * structure to the @new one. This is used in cases where the hardware does not
232 * support reconfiguration or as a helper in some cases where only minimal
233 * reconfiguration is supported.
235 void tty_termios_copy_hw(struct ktermios
*new, const struct ktermios
*old
)
237 /* The bits a dumb device handles in software. Smart devices need
238 to always provide a set_termios method */
239 new->c_cflag
&= HUPCL
| CREAD
| CLOCAL
;
240 new->c_cflag
|= old
->c_cflag
& ~(HUPCL
| CREAD
| CLOCAL
);
241 new->c_ispeed
= old
->c_ispeed
;
242 new->c_ospeed
= old
->c_ospeed
;
244 EXPORT_SYMBOL(tty_termios_copy_hw
);
247 * tty_termios_hw_change - check for setting change
249 * @b: termios to compare
251 * Check if any of the bits that affect a dumb device have changed between the
252 * two termios structures, or a speed change is needed.
254 * Returns: %true if change is needed
256 bool tty_termios_hw_change(const struct ktermios
*a
, const struct ktermios
*b
)
258 if (a
->c_ispeed
!= b
->c_ispeed
|| a
->c_ospeed
!= b
->c_ospeed
)
260 if ((a
->c_cflag
^ b
->c_cflag
) & ~(HUPCL
| CREAD
| CLOCAL
))
264 EXPORT_SYMBOL(tty_termios_hw_change
);
267 * tty_get_char_size - get size of a character
268 * @cflag: termios cflag value
270 * Returns: size (in bits) of a character depending on @cflag's %CSIZE setting
272 unsigned char tty_get_char_size(unsigned int cflag
)
274 switch (cflag
& CSIZE
) {
286 EXPORT_SYMBOL_GPL(tty_get_char_size
);
289 * tty_get_frame_size - get size of a frame
290 * @cflag: termios cflag value
292 * Get the size (in bits) of a frame depending on @cflag's %CSIZE, %CSTOPB, and
293 * %PARENB setting. The result is a sum of character size, start and stop bits
294 * -- one bit each -- second stop bit (if set), and parity bit (if set).
296 * Returns: size (in bits) of a frame depending on @cflag's setting.
298 unsigned char tty_get_frame_size(unsigned int cflag
)
300 unsigned char bits
= 2 + tty_get_char_size(cflag
);
311 EXPORT_SYMBOL_GPL(tty_get_frame_size
);
314 * tty_set_termios - update termios values
315 * @tty: tty to update
316 * @new_termios: desired new value
318 * Perform updates to the termios values set on this @tty. A master pty's
319 * termios should never be set.
321 * Locking: &tty_struct->termios_rwsem
323 int tty_set_termios(struct tty_struct
*tty
, struct ktermios
*new_termios
)
325 struct ktermios old_termios
;
326 struct tty_ldisc
*ld
;
328 WARN_ON(tty
->driver
->type
== TTY_DRIVER_TYPE_PTY
&&
329 tty
->driver
->subtype
== PTY_TYPE_MASTER
);
331 * Perform the actual termios internal changes under lock.
335 /* FIXME: we need to decide on some locking/ordering semantics
336 for the set_termios notification eventually */
337 down_write(&tty
->termios_rwsem
);
338 old_termios
= tty
->termios
;
339 tty
->termios
= *new_termios
;
340 unset_locked_termios(tty
, &old_termios
);
341 /* Reset any ADDRB changes, ADDRB is changed through ->rs485_config() */
342 tty
->termios
.c_cflag
^= (tty
->termios
.c_cflag
^ old_termios
.c_cflag
) & ADDRB
;
344 if (tty
->ops
->set_termios
)
345 tty
->ops
->set_termios(tty
, &old_termios
);
347 tty_termios_copy_hw(&tty
->termios
, &old_termios
);
349 ld
= tty_ldisc_ref(tty
);
351 if (ld
->ops
->set_termios
)
352 ld
->ops
->set_termios(tty
, &old_termios
);
355 up_write(&tty
->termios_rwsem
);
358 EXPORT_SYMBOL_GPL(tty_set_termios
);
362 * Translate a "termio" structure into a "termios". Ugh.
364 __weak
int user_termio_to_kernel_termios(struct ktermios
*termios
,
365 struct termio __user
*termio
)
369 if (copy_from_user(&v
, termio
, sizeof(struct termio
)))
372 termios
->c_iflag
= (0xffff0000 & termios
->c_iflag
) | v
.c_iflag
;
373 termios
->c_oflag
= (0xffff0000 & termios
->c_oflag
) | v
.c_oflag
;
374 termios
->c_cflag
= (0xffff0000 & termios
->c_cflag
) | v
.c_cflag
;
375 termios
->c_lflag
= (0xffff0000 & termios
->c_lflag
) | v
.c_lflag
;
376 termios
->c_line
= (0xffff0000 & termios
->c_lflag
) | v
.c_line
;
377 memcpy(termios
->c_cc
, v
.c_cc
, NCC
);
382 * Translate a "termios" structure into a "termio". Ugh.
384 __weak
int kernel_termios_to_user_termio(struct termio __user
*termio
,
385 struct ktermios
*termios
)
388 memset(&v
, 0, sizeof(struct termio
));
389 v
.c_iflag
= termios
->c_iflag
;
390 v
.c_oflag
= termios
->c_oflag
;
391 v
.c_cflag
= termios
->c_cflag
;
392 v
.c_lflag
= termios
->c_lflag
;
393 v
.c_line
= termios
->c_line
;
394 memcpy(v
.c_cc
, termios
->c_cc
, NCC
);
395 return copy_to_user(termio
, &v
, sizeof(struct termio
));
399 __weak
int user_termios_to_kernel_termios(struct ktermios
*k
,
400 struct termios2 __user
*u
)
402 return copy_from_user(k
, u
, sizeof(struct termios2
));
404 __weak
int kernel_termios_to_user_termios(struct termios2 __user
*u
,
407 return copy_to_user(u
, k
, sizeof(struct termios2
));
409 __weak
int user_termios_to_kernel_termios_1(struct ktermios
*k
,
410 struct termios __user
*u
)
412 return copy_from_user(k
, u
, sizeof(struct termios
));
414 __weak
int kernel_termios_to_user_termios_1(struct termios __user
*u
,
417 return copy_to_user(u
, k
, sizeof(struct termios
));
422 __weak
int user_termios_to_kernel_termios(struct ktermios
*k
,
423 struct termios __user
*u
)
425 return copy_from_user(k
, u
, sizeof(struct termios
));
427 __weak
int kernel_termios_to_user_termios(struct termios __user
*u
,
430 return copy_to_user(u
, k
, sizeof(struct termios
));
435 * set_termios - set termios values for a tty
436 * @tty: terminal device
438 * @opt: option information
440 * Helper function to prepare termios data and run necessary other functions
441 * before using tty_set_termios() to do the actual changes.
443 * Locking: called functions take &tty_struct->ldisc_sem and
444 * &tty_struct->termios_rwsem locks
446 * Returns: 0 on success, an error otherwise
448 static int set_termios(struct tty_struct
*tty
, void __user
*arg
, int opt
)
450 struct ktermios tmp_termios
;
451 struct tty_ldisc
*ld
;
452 int retval
= tty_check_change(tty
);
457 down_read(&tty
->termios_rwsem
);
458 tmp_termios
= tty
->termios
;
459 up_read(&tty
->termios_rwsem
);
461 if (opt
& TERMIOS_TERMIO
) {
462 if (user_termio_to_kernel_termios(&tmp_termios
,
463 (struct termio __user
*)arg
))
466 } else if (opt
& TERMIOS_OLD
) {
467 if (user_termios_to_kernel_termios_1(&tmp_termios
,
468 (struct termios __user
*)arg
))
471 if (user_termios_to_kernel_termios(&tmp_termios
,
472 (struct termios2 __user
*)arg
))
476 } else if (user_termios_to_kernel_termios(&tmp_termios
,
477 (struct termios __user
*)arg
))
481 /* If old style Bfoo values are used then load c_ispeed/c_ospeed
482 * with the real speed so its unconditionally usable */
483 tmp_termios
.c_ispeed
= tty_termios_input_baud_rate(&tmp_termios
);
484 tmp_termios
.c_ospeed
= tty_termios_baud_rate(&tmp_termios
);
486 if (opt
& (TERMIOS_FLUSH
|TERMIOS_WAIT
)) {
488 retval
= wait_event_interruptible(tty
->write_wait
, !tty_chars_in_buffer(tty
));
492 if (tty_write_lock(tty
, false) < 0)
493 goto retry_write_wait
;
496 if (tty_chars_in_buffer(tty
)) {
497 tty_write_unlock(tty
);
498 goto retry_write_wait
;
501 ld
= tty_ldisc_ref(tty
);
503 if ((opt
& TERMIOS_FLUSH
) && ld
->ops
->flush_buffer
)
504 ld
->ops
->flush_buffer(tty
);
508 if ((opt
& TERMIOS_WAIT
) && tty
->ops
->wait_until_sent
) {
509 tty
->ops
->wait_until_sent(tty
, 0);
510 if (signal_pending(current
)) {
511 tty_write_unlock(tty
);
516 tty_set_termios(tty
, &tmp_termios
);
518 tty_write_unlock(tty
);
520 tty_set_termios(tty
, &tmp_termios
);
523 /* FIXME: Arguably if tmp_termios == tty->termios AND the
524 actual requested termios was not tmp_termios then we may
525 want to return an error as no user requested change has
530 static void copy_termios(struct tty_struct
*tty
, struct ktermios
*kterm
)
532 down_read(&tty
->termios_rwsem
);
533 *kterm
= tty
->termios
;
534 up_read(&tty
->termios_rwsem
);
537 static void copy_termios_locked(struct tty_struct
*tty
, struct ktermios
*kterm
)
539 down_read(&tty
->termios_rwsem
);
540 *kterm
= tty
->termios_locked
;
541 up_read(&tty
->termios_rwsem
);
544 static int get_termio(struct tty_struct
*tty
, struct termio __user
*termio
)
546 struct ktermios kterm
;
547 copy_termios(tty
, &kterm
);
548 if (kernel_termios_to_user_termio(termio
, &kterm
))
555 * These are deprecated, but there is limited support..
557 * The "sg_flags" translation is a joke..
559 static int get_sgflags(struct tty_struct
*tty
)
563 if (!L_ICANON(tty
)) {
565 flags
|= 0x02; /* cbreak */
567 flags
|= 0x20; /* raw */
570 flags
|= 0x08; /* echo */
573 flags
|= 0x10; /* crmod */
577 static int get_sgttyb(struct tty_struct
*tty
, struct sgttyb __user
*sgttyb
)
581 down_read(&tty
->termios_rwsem
);
582 tmp
.sg_ispeed
= tty
->termios
.c_ispeed
;
583 tmp
.sg_ospeed
= tty
->termios
.c_ospeed
;
584 tmp
.sg_erase
= tty
->termios
.c_cc
[VERASE
];
585 tmp
.sg_kill
= tty
->termios
.c_cc
[VKILL
];
586 tmp
.sg_flags
= get_sgflags(tty
);
587 up_read(&tty
->termios_rwsem
);
589 return copy_to_user(sgttyb
, &tmp
, sizeof(tmp
)) ? -EFAULT
: 0;
592 static void set_sgflags(struct ktermios
*termios
, int flags
)
594 termios
->c_iflag
= ICRNL
| IXON
;
595 termios
->c_oflag
= 0;
596 termios
->c_lflag
= ISIG
| ICANON
;
597 if (flags
& 0x02) { /* cbreak */
598 termios
->c_iflag
= 0;
599 termios
->c_lflag
&= ~ICANON
;
601 if (flags
& 0x08) { /* echo */
602 termios
->c_lflag
|= ECHO
| ECHOE
| ECHOK
|
603 ECHOCTL
| ECHOKE
| IEXTEN
;
605 if (flags
& 0x10) { /* crmod */
606 termios
->c_oflag
|= OPOST
| ONLCR
;
608 if (flags
& 0x20) { /* raw */
609 termios
->c_iflag
= 0;
610 termios
->c_lflag
&= ~(ISIG
| ICANON
);
612 if (!(termios
->c_lflag
& ICANON
)) {
613 termios
->c_cc
[VMIN
] = 1;
614 termios
->c_cc
[VTIME
] = 0;
619 * set_sgttyb - set legacy terminal values
620 * @tty: tty structure
621 * @sgttyb: pointer to old style terminal structure
623 * Updates a terminal from the legacy BSD style terminal information structure.
625 * Locking: &tty_struct->termios_rwsem
627 * Returns: 0 on success, an error otherwise
629 static int set_sgttyb(struct tty_struct
*tty
, struct sgttyb __user
*sgttyb
)
633 struct ktermios termios
;
635 retval
= tty_check_change(tty
);
639 if (copy_from_user(&tmp
, sgttyb
, sizeof(tmp
)))
642 down_write(&tty
->termios_rwsem
);
643 termios
= tty
->termios
;
644 termios
.c_cc
[VERASE
] = tmp
.sg_erase
;
645 termios
.c_cc
[VKILL
] = tmp
.sg_kill
;
646 set_sgflags(&termios
, tmp
.sg_flags
);
647 /* Try and encode into Bfoo format */
648 tty_termios_encode_baud_rate(&termios
, termios
.c_ispeed
,
650 up_write(&tty
->termios_rwsem
);
651 tty_set_termios(tty
, &termios
);
657 static int get_tchars(struct tty_struct
*tty
, struct tchars __user
*tchars
)
661 down_read(&tty
->termios_rwsem
);
662 tmp
.t_intrc
= tty
->termios
.c_cc
[VINTR
];
663 tmp
.t_quitc
= tty
->termios
.c_cc
[VQUIT
];
664 tmp
.t_startc
= tty
->termios
.c_cc
[VSTART
];
665 tmp
.t_stopc
= tty
->termios
.c_cc
[VSTOP
];
666 tmp
.t_eofc
= tty
->termios
.c_cc
[VEOF
];
667 tmp
.t_brkc
= tty
->termios
.c_cc
[VEOL2
]; /* what is brkc anyway? */
668 up_read(&tty
->termios_rwsem
);
669 return copy_to_user(tchars
, &tmp
, sizeof(tmp
)) ? -EFAULT
: 0;
672 static int set_tchars(struct tty_struct
*tty
, struct tchars __user
*tchars
)
676 if (copy_from_user(&tmp
, tchars
, sizeof(tmp
)))
678 down_write(&tty
->termios_rwsem
);
679 tty
->termios
.c_cc
[VINTR
] = tmp
.t_intrc
;
680 tty
->termios
.c_cc
[VQUIT
] = tmp
.t_quitc
;
681 tty
->termios
.c_cc
[VSTART
] = tmp
.t_startc
;
682 tty
->termios
.c_cc
[VSTOP
] = tmp
.t_stopc
;
683 tty
->termios
.c_cc
[VEOF
] = tmp
.t_eofc
;
684 tty
->termios
.c_cc
[VEOL2
] = tmp
.t_brkc
; /* what is brkc anyway? */
685 up_write(&tty
->termios_rwsem
);
691 static int get_ltchars(struct tty_struct
*tty
, struct ltchars __user
*ltchars
)
695 down_read(&tty
->termios_rwsem
);
696 tmp
.t_suspc
= tty
->termios
.c_cc
[VSUSP
];
697 /* what is dsuspc anyway? */
698 tmp
.t_dsuspc
= tty
->termios
.c_cc
[VSUSP
];
699 tmp
.t_rprntc
= tty
->termios
.c_cc
[VREPRINT
];
700 /* what is flushc anyway? */
701 tmp
.t_flushc
= tty
->termios
.c_cc
[VEOL2
];
702 tmp
.t_werasc
= tty
->termios
.c_cc
[VWERASE
];
703 tmp
.t_lnextc
= tty
->termios
.c_cc
[VLNEXT
];
704 up_read(&tty
->termios_rwsem
);
705 return copy_to_user(ltchars
, &tmp
, sizeof(tmp
)) ? -EFAULT
: 0;
708 static int set_ltchars(struct tty_struct
*tty
, struct ltchars __user
*ltchars
)
712 if (copy_from_user(&tmp
, ltchars
, sizeof(tmp
)))
715 down_write(&tty
->termios_rwsem
);
716 tty
->termios
.c_cc
[VSUSP
] = tmp
.t_suspc
;
717 /* what is dsuspc anyway? */
718 tty
->termios
.c_cc
[VEOL2
] = tmp
.t_dsuspc
;
719 tty
->termios
.c_cc
[VREPRINT
] = tmp
.t_rprntc
;
720 /* what is flushc anyway? */
721 tty
->termios
.c_cc
[VEOL2
] = tmp
.t_flushc
;
722 tty
->termios
.c_cc
[VWERASE
] = tmp
.t_werasc
;
723 tty
->termios
.c_cc
[VLNEXT
] = tmp
.t_lnextc
;
724 up_write(&tty
->termios_rwsem
);
730 * tty_change_softcar - carrier change ioctl helper
731 * @tty: tty to update
732 * @enable: enable/disable %CLOCAL
734 * Perform a change to the %CLOCAL state and call into the driver layer to make
737 * Locking: &tty_struct->termios_rwsem.
739 * Returns: 0 on success, an error otherwise
741 static int tty_change_softcar(struct tty_struct
*tty
, bool enable
)
745 tcflag_t bit
= enable
? CLOCAL
: 0;
747 down_write(&tty
->termios_rwsem
);
749 tty
->termios
.c_cflag
&= ~CLOCAL
;
750 tty
->termios
.c_cflag
|= bit
;
751 if (tty
->ops
->set_termios
)
752 tty
->ops
->set_termios(tty
, &old
);
753 if (C_CLOCAL(tty
) != bit
)
755 up_write(&tty
->termios_rwsem
);
760 * tty_mode_ioctl - mode related ioctls
761 * @tty: tty for the ioctl
763 * @arg: ioctl argument
765 * Perform non-line discipline specific mode control ioctls. This is designed
766 * to be called by line disciplines to ensure they provide consistent mode
769 int tty_mode_ioctl(struct tty_struct
*tty
, unsigned int cmd
, unsigned long arg
)
771 struct tty_struct
*real_tty
;
772 void __user
*p
= (void __user
*)arg
;
774 struct ktermios kterm
;
776 if (tty
->driver
->type
== TTY_DRIVER_TYPE_PTY
&&
777 tty
->driver
->subtype
== PTY_TYPE_MASTER
)
778 real_tty
= tty
->link
;
785 return get_sgttyb(real_tty
, (struct sgttyb __user
*) arg
);
788 return set_sgttyb(real_tty
, (struct sgttyb __user
*) arg
);
792 return get_tchars(real_tty
, p
);
794 return set_tchars(real_tty
, p
);
798 return get_ltchars(real_tty
, p
);
800 return set_ltchars(real_tty
, p
);
803 return set_termios(real_tty
, p
, TERMIOS_FLUSH
| TERMIOS_WAIT
| TERMIOS_OLD
);
805 return set_termios(real_tty
, p
, TERMIOS_WAIT
| TERMIOS_OLD
);
807 return set_termios(real_tty
, p
, TERMIOS_OLD
);
810 copy_termios(real_tty
, &kterm
);
811 if (kernel_termios_to_user_termios((struct termios __user
*)arg
, &kterm
))
816 copy_termios(real_tty
, &kterm
);
817 if (kernel_termios_to_user_termios_1((struct termios __user
*)arg
, &kterm
))
821 copy_termios(real_tty
, &kterm
);
822 if (kernel_termios_to_user_termios((struct termios2 __user
*)arg
, &kterm
))
826 return set_termios(real_tty
, p
, TERMIOS_FLUSH
| TERMIOS_WAIT
);
828 return set_termios(real_tty
, p
, TERMIOS_WAIT
);
830 return set_termios(real_tty
, p
, 0);
833 return get_termio(real_tty
, p
);
835 return set_termios(real_tty
, p
, TERMIOS_FLUSH
| TERMIOS_WAIT
| TERMIOS_TERMIO
);
837 return set_termios(real_tty
, p
, TERMIOS_WAIT
| TERMIOS_TERMIO
);
839 return set_termios(real_tty
, p
, TERMIOS_TERMIO
);
842 copy_termios_locked(real_tty
, &kterm
);
843 if (kernel_termios_to_user_termios((struct termios __user
*)arg
, &kterm
))
847 if (!checkpoint_restore_ns_capable(&init_user_ns
))
849 copy_termios_locked(real_tty
, &kterm
);
850 if (user_termios_to_kernel_termios(&kterm
,
851 (struct termios __user
*) arg
))
853 down_write(&real_tty
->termios_rwsem
);
854 real_tty
->termios_locked
= kterm
;
855 up_write(&real_tty
->termios_rwsem
);
859 copy_termios_locked(real_tty
, &kterm
);
860 if (kernel_termios_to_user_termios_1((struct termios __user
*)arg
, &kterm
))
864 if (!checkpoint_restore_ns_capable(&init_user_ns
))
866 copy_termios_locked(real_tty
, &kterm
);
867 if (user_termios_to_kernel_termios_1(&kterm
,
868 (struct termios __user
*) arg
))
870 down_write(&real_tty
->termios_rwsem
);
871 real_tty
->termios_locked
= kterm
;
872 up_write(&real_tty
->termios_rwsem
);
883 copy_termios(real_tty
, &kterm
);
884 ret
= put_user((kterm
.c_cflag
& CLOCAL
) ? 1 : 0,
888 if (get_user(arg
, (unsigned int __user
*) arg
))
890 return tty_change_softcar(real_tty
, arg
);
895 EXPORT_SYMBOL_GPL(tty_mode_ioctl
);
898 /* Caller guarantees ldisc reference is held */
899 static int __tty_perform_flush(struct tty_struct
*tty
, unsigned long arg
)
901 struct tty_ldisc
*ld
= tty
->ldisc
;
905 if (ld
&& ld
->ops
->flush_buffer
) {
906 ld
->ops
->flush_buffer(tty
);
911 if (ld
&& ld
->ops
->flush_buffer
) {
912 ld
->ops
->flush_buffer(tty
);
917 tty_driver_flush_buffer(tty
);
925 int tty_perform_flush(struct tty_struct
*tty
, unsigned long arg
)
927 struct tty_ldisc
*ld
;
928 int retval
= tty_check_change(tty
);
932 ld
= tty_ldisc_ref_wait(tty
);
933 retval
= __tty_perform_flush(tty
, arg
);
938 EXPORT_SYMBOL_GPL(tty_perform_flush
);
940 int n_tty_ioctl_helper(struct tty_struct
*tty
, unsigned int cmd
,
947 retval
= tty_check_change(tty
);
952 spin_lock_irq(&tty
->flow
.lock
);
953 if (!tty
->flow
.tco_stopped
) {
954 tty
->flow
.tco_stopped
= true;
957 spin_unlock_irq(&tty
->flow
.lock
);
960 spin_lock_irq(&tty
->flow
.lock
);
961 if (tty
->flow
.tco_stopped
) {
962 tty
->flow
.tco_stopped
= false;
965 spin_unlock_irq(&tty
->flow
.lock
);
968 if (STOP_CHAR(tty
) != __DISABLED_CHAR
)
969 retval
= tty_send_xchar(tty
, STOP_CHAR(tty
));
972 if (START_CHAR(tty
) != __DISABLED_CHAR
)
973 retval
= tty_send_xchar(tty
, START_CHAR(tty
));
980 retval
= tty_check_change(tty
);
983 return __tty_perform_flush(tty
, arg
);
985 /* Try the mode commands */
986 return tty_mode_ioctl(tty
, cmd
, arg
);
989 EXPORT_SYMBOL(n_tty_ioctl_helper
);