Coverage Report

Created: 2025-07-11 06:22

/rust/registry/src/index.crates.io-6f17d22bba15001f/rustix-1.0.7/src/termios/tc.rs
Line
Count
Source (jump to first uncovered line)
1
use crate::fd::AsFd;
2
#[cfg(not(target_os = "espidf"))]
3
use crate::termios::{Action, OptionalActions, QueueSelector, Termios, Winsize};
4
use crate::{backend, io};
5
6
pub use crate::pid::Pid;
7
8
/// `tcgetattr(fd)`—Get terminal attributes.
9
///
10
/// Also known as the `TCGETS` (or `TCGETS2` on Linux) operation with `ioctl`.
11
///
12
/// On Linux, this uses `TCGETS2`. If that fails in a way that indicates that
13
/// the host doesn't support it, this falls back to the old `TCGETS`, manually
14
/// initializes the fields that `TCGETS` doesn't initialize, and fails with
15
/// `io::Errno::RANGE` if the input or output speeds cannot be supported.
16
///
17
/// # References
18
///  - [POSIX `tcgetattr`]
19
///  - [Linux `ioctl_tty`]
20
///  - [Linux `termios`]
21
///
22
/// [POSIX `tcgetattr`]: https://pubs.opengroup.org/onlinepubs/9799919799/functions/tcgetattr.html
23
/// [Linux `ioctl_tty`]: https://man7.org/linux/man-pages/man4/tty_ioctl.4.html
24
/// [Linux `termios`]: https://man7.org/linux/man-pages/man3/termios.3.html
25
#[cfg(not(any(windows, target_os = "espidf", target_os = "wasi")))]
26
#[inline]
27
#[doc(alias = "TCGETS")]
28
#[doc(alias = "TCGETS2")]
29
#[doc(alias = "tcgetattr2")]
30
0
pub fn tcgetattr<Fd: AsFd>(fd: Fd) -> io::Result<Termios> {
31
0
    backend::termios::syscalls::tcgetattr(fd.as_fd())
32
0
}
33
34
/// `tcgetwinsize(fd)`—Get the current terminal window size.
35
///
36
/// Also known as the `TIOCGWINSZ` operation with `ioctl`.
37
///
38
/// # References
39
///  - [Linux]
40
///
41
/// [Linux]: https://man7.org/linux/man-pages/man4/tty_ioctl.4.html
42
#[cfg(not(any(
43
    windows,
44
    target_os = "horizon",
45
    target_os = "espidf",
46
    target_os = "wasi"
47
)))]
48
#[inline]
49
#[doc(alias = "TIOCGWINSZ")]
50
0
pub fn tcgetwinsize<Fd: AsFd>(fd: Fd) -> io::Result<Winsize> {
51
0
    backend::termios::syscalls::tcgetwinsize(fd.as_fd())
52
0
}
53
54
/// `tcgetpgrp(fd)`—Get the terminal foreground process group.
55
///
56
/// Also known as the `TIOCGPGRP` operation with `ioctl`.
57
///
58
/// On Linux, if `fd` is a pseudo-terminal, the underlying system call here can
59
/// return a pid of 0, which rustix's `Pid` type doesn't support. So rustix
60
/// instead handles this case by failing with [`io::Errno::OPNOTSUPP`] if the
61
/// pid is 0.
62
///
63
/// # References
64
///  - [POSIX]
65
///  - [Linux]
66
///
67
/// [POSIX]: https://pubs.opengroup.org/onlinepubs/9799919799/functions/tcgetpgrp.html
68
/// [Linux]: https://man7.org/linux/man-pages/man3/tcgetpgrp.3.html
69
#[cfg(not(any(windows, target_os = "wasi")))]
70
#[inline]
71
#[doc(alias = "TIOCGPGRP")]
72
0
pub fn tcgetpgrp<Fd: AsFd>(fd: Fd) -> io::Result<Pid> {
73
0
    backend::termios::syscalls::tcgetpgrp(fd.as_fd())
74
0
}
75
76
/// `tcsetpgrp(fd, pid)`—Set the terminal foreground process group.
77
///
78
/// Also known as the `TIOCSPGRP` operation with `ioctl`.
79
///
80
/// # References
81
///  - [POSIX]
82
///  - [Linux]
83
///
84
/// [POSIX]: https://pubs.opengroup.org/onlinepubs/9799919799/functions/tcsetpgrp.html
85
/// [Linux]: https://man7.org/linux/man-pages/man3/tcsetpgrp.3.html
86
#[cfg(not(any(windows, target_os = "wasi")))]
87
#[inline]
88
#[doc(alias = "TIOCSPGRP")]
89
0
pub fn tcsetpgrp<Fd: AsFd>(fd: Fd, pid: Pid) -> io::Result<()> {
90
0
    backend::termios::syscalls::tcsetpgrp(fd.as_fd(), pid)
91
0
}
92
93
/// `tcsetattr(fd)`—Set terminal attributes.
94
///
95
/// Also known as the `TCSETS` (or `TCSETS2` on Linux) operation with `ioctl`.
96
///
97
/// On Linux, this uses `TCSETS2`. If that fails in a way that indicates that
98
/// the host doesn't support it, this falls back to the old `TCSETS`, and fails
99
/// with `io::Errno::RANGE` if the input or output speeds cannot be supported.
100
///
101
/// # References
102
///  - [POSIX `tcsetattr`]
103
///  - [Linux `ioctl_tty`]
104
///  - [Linux `termios`]
105
///
106
/// [POSIX `tcsetattr`]: https://pubs.opengroup.org/onlinepubs/9799919799/functions/tcsetattr.html
107
/// [Linux `ioctl_tty`]: https://man7.org/linux/man-pages/man4/tty_ioctl.4.html
108
/// [Linux `termios`]: https://man7.org/linux/man-pages/man3/termios.3.html
109
#[cfg(not(target_os = "espidf"))]
110
#[inline]
111
#[doc(alias = "TCSETS")]
112
#[doc(alias = "TCSETS2")]
113
#[doc(alias = "tcsetattr2")]
114
0
pub fn tcsetattr<Fd: AsFd>(
115
0
    fd: Fd,
116
0
    optional_actions: OptionalActions,
117
0
    termios: &Termios,
118
0
) -> io::Result<()> {
119
0
    backend::termios::syscalls::tcsetattr(fd.as_fd(), optional_actions, termios)
120
0
}
121
122
/// `tcsendbreak(fd, 0)`—Transmit zero-valued bits.
123
///
124
/// This transmits zero-valued bits for at least 0.25 seconds.
125
///
126
/// This function does not have a `duration` parameter, and always uses the
127
/// implementation-defined value, which transmits for at least 0.25 seconds.
128
///
129
/// Also known as the `TCSBRK` operation with `ioctl`, with a duration
130
/// parameter of 0.
131
///
132
/// # References
133
///  - [POSIX `tcsendbreak`]
134
///  - [Linux `ioctl_tty`]
135
///  - [Linux `termios`]
136
///
137
/// [POSIX `tcsendbreak`]: https://pubs.opengroup.org/onlinepubs/9799919799/functions/tcsendbreak.html
138
/// [Linux `ioctl_tty`]: https://man7.org/linux/man-pages/man4/tty_ioctl.4.html
139
/// [Linux `termios`]: https://man7.org/linux/man-pages/man3/termios.3.html
140
#[inline]
141
#[doc(alias = "TCSBRK")]
142
0
pub fn tcsendbreak<Fd: AsFd>(fd: Fd) -> io::Result<()> {
143
0
    backend::termios::syscalls::tcsendbreak(fd.as_fd())
144
0
}
145
146
/// `tcdrain(fd, duration)`—Wait until all pending output has been written.
147
///
148
/// # References
149
///  - [POSIX `tcdrain`]
150
///  - [Linux `ioctl_tty`]
151
///  - [Linux `termios`]
152
///
153
/// [POSIX `tcsetattr`]: https://pubs.opengroup.org/onlinepubs/9799919799/functions/tcdrain.html
154
/// [Linux `ioctl_tty`]: https://man7.org/linux/man-pages/man4/tty_ioctl.4.html
155
/// [Linux `termios`]: https://man7.org/linux/man-pages/man3/termios.3.html
156
#[cfg(not(target_os = "espidf"))]
157
#[inline]
158
0
pub fn tcdrain<Fd: AsFd>(fd: Fd) -> io::Result<()> {
159
0
    backend::termios::syscalls::tcdrain(fd.as_fd())
160
0
}
161
162
/// `tcflush(fd, queue_selector)`—Wait until all pending output has been
163
/// written.
164
///
165
/// # References
166
///  - [POSIX `tcflush`]
167
///  - [Linux `ioctl_tty`]
168
///  - [Linux `termios`]
169
///
170
/// [POSIX `tcflush`]: https://pubs.opengroup.org/onlinepubs/9799919799/functions/tcflush.html
171
/// [Linux `ioctl_tty`]: https://man7.org/linux/man-pages/man4/tty_ioctl.4.html
172
/// [Linux `termios`]: https://man7.org/linux/man-pages/man3/termios.3.html
173
#[cfg(not(target_os = "espidf"))]
174
#[inline]
175
#[doc(alias = "TCFLSH")]
176
0
pub fn tcflush<Fd: AsFd>(fd: Fd, queue_selector: QueueSelector) -> io::Result<()> {
177
0
    backend::termios::syscalls::tcflush(fd.as_fd(), queue_selector)
178
0
}
179
180
/// `tcflow(fd, action)`—Suspend or resume transmission or reception.
181
///
182
/// # References
183
///  - [POSIX `tcflow`]
184
///  - [Linux `ioctl_tty`]
185
///  - [Linux `termios`]
186
///
187
/// [POSIX `tcflow`]: https://pubs.opengroup.org/onlinepubs/9799919799/functions/tcflow.html
188
/// [Linux `ioctl_tty`]: https://man7.org/linux/man-pages/man4/tty_ioctl.4.html
189
/// [Linux `termios`]: https://man7.org/linux/man-pages/man3/termios.3.html
190
#[cfg(not(target_os = "espidf"))]
191
#[inline]
192
#[doc(alias = "TCXONC")]
193
0
pub fn tcflow<Fd: AsFd>(fd: Fd, action: Action) -> io::Result<()> {
194
0
    backend::termios::syscalls::tcflow(fd.as_fd(), action)
195
0
}
196
197
/// `tcgetsid(fd)`—Return the session ID of the current session with `fd` as
198
/// its controlling terminal.
199
///
200
/// # References
201
///  - [POSIX]
202
///  - [Linux]
203
///
204
/// [POSIX]: https://pubs.opengroup.org/onlinepubs/9799919799/functions/tcgetsid.html
205
/// [Linux]: https://man7.org/linux/man-pages/man3/tcgetsid.3.html
206
#[inline]
207
#[doc(alias = "TIOCGSID")]
208
0
pub fn tcgetsid<Fd: AsFd>(fd: Fd) -> io::Result<Pid> {
209
0
    backend::termios::syscalls::tcgetsid(fd.as_fd())
210
0
}
211
212
/// `tcsetwinsize(fd)`—Set the current terminal window size.
213
///
214
/// Also known as the `TIOCSWINSZ` operation with `ioctl`.
215
///
216
/// # References
217
///  - [Linux]
218
///
219
/// [Linux]: https://man7.org/linux/man-pages/man4/tty_ioctl.4.html
220
#[cfg(not(any(target_os = "espidf", target_os = "horizon")))]
221
#[inline]
222
#[doc(alias = "TIOCSWINSZ")]
223
0
pub fn tcsetwinsize<Fd: AsFd>(fd: Fd, winsize: Winsize) -> io::Result<()> {
224
0
    backend::termios::syscalls::tcsetwinsize(fd.as_fd(), winsize)
225
0
}