1 use crate::fd::AsFd;
2 use crate::process::Pid;
3 use crate::{backend, io};
4
5 pub use backend::termios::types::{
6 Action, OptionalActions, QueueSelector, Speed, Tcflag, Termios, Winsize,
7 };
8
9 /// `tcgetattr(fd)`—Get terminal attributes.
10 ///
11 /// Also known as the `TCGETS` operation with `ioctl`.
12 ///
13 /// # References
14 /// - [POSIX `tcgetattr`]
15 /// - [Linux `ioctl_tty`]
16 /// - [Linux `termios`]
17 ///
18 /// [POSIX `tcgetattr`]: https://pubs.opengroup.org/onlinepubs/9699919799/functions/tcgetattr.html
19 /// [Linux `ioctl_tty`]: https://man7.org/linux/man-pages/man4/tty_ioctl.4.html
20 /// [Linux `termios`]: https://man7.org/linux/man-pages/man3/termios.3.html
21 #[cfg(not(any(windows, target_os = "wasi")))]
22 #[inline]
23 #[doc(alias = "TCGETS")]
tcgetattr<Fd: AsFd>(fd: Fd) -> io::Result<Termios>24 pub fn tcgetattr<Fd: AsFd>(fd: Fd) -> io::Result<Termios> {
25 backend::termios::syscalls::tcgetattr(fd.as_fd())
26 }
27
28 /// `tcgetwinsize(fd)`—Get the current terminal window size.
29 ///
30 /// Also known as the `TIOCGWINSZ` operation with `ioctl`.
31 ///
32 /// # References
33 /// - [Linux]
34 ///
35 /// [Linux]: https://man7.org/linux/man-pages/man4/tty_ioctl.4.html
36 #[cfg(not(any(windows, target_os = "wasi")))]
37 #[inline]
38 #[doc(alias = "TIOCGWINSZ")]
tcgetwinsize<Fd: AsFd>(fd: Fd) -> io::Result<Winsize>39 pub fn tcgetwinsize<Fd: AsFd>(fd: Fd) -> io::Result<Winsize> {
40 backend::termios::syscalls::tcgetwinsize(fd.as_fd())
41 }
42
43 /// `tcgetpgrp(fd)`—Get the terminal foreground process group.
44 ///
45 /// Also known as the `TIOCGPGRP` operation with `ioctl`.
46 ///
47 /// # References
48 /// - [POSIX]
49 /// - [Linux]
50 ///
51 /// [POSIX]: https://pubs.opengroup.org/onlinepubs/9699919799/functions/tcgetpgrp.html
52 /// [Linux]: https://man7.org/linux/man-pages/man3/tcgetpgrp.3.html
53 #[cfg(not(any(windows, target_os = "wasi")))]
54 #[inline]
55 #[doc(alias = "TIOCGPGRP")]
tcgetpgrp<Fd: AsFd>(fd: Fd) -> io::Result<Pid>56 pub fn tcgetpgrp<Fd: AsFd>(fd: Fd) -> io::Result<Pid> {
57 backend::termios::syscalls::tcgetpgrp(fd.as_fd())
58 }
59
60 /// `tcsetpgrp(fd, pid)`—Set the terminal foreground process group.
61 ///
62 /// Also known as the `TIOCSPGRP` operation with `ioctl`.
63 ///
64 /// # References
65 /// - [POSIX]
66 /// - [Linux]
67 ///
68 /// [POSIX]: https://pubs.opengroup.org/onlinepubs/9699919799/functions/tcsetpgrp.html
69 /// [Linux]: https://man7.org/linux/man-pages/man3/tcsetpgrp.3.html
70 #[cfg(not(any(windows, target_os = "wasi")))]
71 #[inline]
72 #[doc(alias = "TIOCSPGRP")]
tcsetpgrp<Fd: AsFd>(fd: Fd, pid: Pid) -> io::Result<()>73 pub fn tcsetpgrp<Fd: AsFd>(fd: Fd, pid: Pid) -> io::Result<()> {
74 backend::termios::syscalls::tcsetpgrp(fd.as_fd(), pid)
75 }
76
77 /// `tcsetattr(fd)`—Set terminal attributes.
78 ///
79 /// Also known as the `TCSETS` operation with `ioctl`.
80 ///
81 /// # References
82 /// - [POSIX `tcsetattr`]
83 /// - [Linux `ioctl_tty`]
84 /// - [Linux `termios`]
85 ///
86 /// [POSIX `tcsetattr`]: https://pubs.opengroup.org/onlinepubs/9699919799/functions/tcsetattr.html
87 /// [Linux `ioctl_tty`]: https://man7.org/linux/man-pages/man4/tty_ioctl.4.html
88 /// [Linux `termios`]: https://man7.org/linux/man-pages/man3/termios.3.html
89 #[inline]
90 #[doc(alias = "TCSETS")]
tcsetattr<Fd: AsFd>( fd: Fd, optional_actions: OptionalActions, termios: &Termios, ) -> io::Result<()>91 pub fn tcsetattr<Fd: AsFd>(
92 fd: Fd,
93 optional_actions: OptionalActions,
94 termios: &Termios,
95 ) -> io::Result<()> {
96 backend::termios::syscalls::tcsetattr(fd.as_fd(), optional_actions, termios)
97 }
98
99 /// `tcsendbreak(fd, 0)`—Transmit zero-valued bits.
100 ///
101 /// Also known as the `TCSBRK` operation with `ioctl`, with a duration of 0.
102 ///
103 /// This function always uses an effective duration parameter of zero. For the
104 /// equivalent of a `tcsendbreak` with a non-zero duration parameter, use
105 /// `tcdrain`.
106 ///
107 /// # References
108 /// - [POSIX `tcsendbreak`]
109 /// - [Linux `ioctl_tty`]
110 /// - [Linux `termios`]
111 ///
112 /// [POSIX `tcsendbreak`]: https://pubs.opengroup.org/onlinepubs/9699919799/functions/tcsendbreak.html
113 /// [Linux `ioctl_tty`]: https://man7.org/linux/man-pages/man4/tty_ioctl.4.html
114 /// [Linux `termios`]: https://man7.org/linux/man-pages/man3/termios.3.html
115 #[inline]
116 #[doc(alias = "TCSBRK")]
tcsendbreak<Fd: AsFd>(fd: Fd) -> io::Result<()>117 pub fn tcsendbreak<Fd: AsFd>(fd: Fd) -> io::Result<()> {
118 backend::termios::syscalls::tcsendbreak(fd.as_fd())
119 }
120
121 /// `tcdrain(fd, duration)`—Wait until all pending output has been written.
122 ///
123 /// # References
124 /// - [POSIX `tcdrain`]
125 /// - [Linux `ioctl_tty`]
126 /// - [Linux `termios`]
127 ///
128 /// [POSIX `tcsetattr`]: https://pubs.opengroup.org/onlinepubs/9699919799/functions/tcdrain.html
129 /// [Linux `ioctl_tty`]: https://man7.org/linux/man-pages/man4/tty_ioctl.4.html
130 /// [Linux `termios`]: https://man7.org/linux/man-pages/man3/termios.3.html
131 #[inline]
tcdrain<Fd: AsFd>(fd: Fd) -> io::Result<()>132 pub fn tcdrain<Fd: AsFd>(fd: Fd) -> io::Result<()> {
133 backend::termios::syscalls::tcdrain(fd.as_fd())
134 }
135
136 /// `tcflush(fd, queue_selector)`—Wait until all pending output has been
137 /// written.
138 ///
139 /// # References
140 /// - [POSIX `tcflush`]
141 /// - [Linux `ioctl_tty`]
142 /// - [Linux `termios`]
143 ///
144 /// [POSIX `tcflush`]: https://pubs.opengroup.org/onlinepubs/9699919799/functions/tcflush.html
145 /// [Linux `ioctl_tty`]: https://man7.org/linux/man-pages/man4/tty_ioctl.4.html
146 /// [Linux `termios`]: https://man7.org/linux/man-pages/man3/termios.3.html
147 #[inline]
148 #[doc(alias = "TCFLSH")]
tcflush<Fd: AsFd>(fd: Fd, queue_selector: QueueSelector) -> io::Result<()>149 pub fn tcflush<Fd: AsFd>(fd: Fd, queue_selector: QueueSelector) -> io::Result<()> {
150 backend::termios::syscalls::tcflush(fd.as_fd(), queue_selector)
151 }
152
153 /// `tcflow(fd, action)`—Suspend or resume transmission or reception.
154 ///
155 /// # References
156 /// - [POSIX `tcflow`]
157 /// - [Linux `ioctl_tty`]
158 /// - [Linux `termios`]
159 ///
160 /// [POSIX `tcflow`]: https://pubs.opengroup.org/onlinepubs/9699919799/functions/tcflow.html
161 /// [Linux `ioctl_tty`]: https://man7.org/linux/man-pages/man4/tty_ioctl.4.html
162 /// [Linux `termios`]: https://man7.org/linux/man-pages/man3/termios.3.html
163 #[inline]
164 #[doc(alias = "TCXONC")]
tcflow<Fd: AsFd>(fd: Fd, action: Action) -> io::Result<()>165 pub fn tcflow<Fd: AsFd>(fd: Fd, action: Action) -> io::Result<()> {
166 backend::termios::syscalls::tcflow(fd.as_fd(), action)
167 }
168
169 /// `tcgetsid(fd)`—Return the session ID of the current session with `fd` as
170 /// its controlling terminal.
171 ///
172 /// # References
173 /// - [POSIX]
174 /// - [Linux]
175 ///
176 /// [POSIX]: https://pubs.opengroup.org/onlinepubs/9699919799/functions/tcgetsid.html
177 /// [Linux]: https://man7.org/linux/man-pages/man3/tcgetsid.3.html
178 #[inline]
179 #[doc(alias = "TIOCGSID")]
tcgetsid<Fd: AsFd>(fd: Fd) -> io::Result<Pid>180 pub fn tcgetsid<Fd: AsFd>(fd: Fd) -> io::Result<Pid> {
181 backend::termios::syscalls::tcgetsid(fd.as_fd())
182 }
183
184 /// `tcsetwinsize(fd)`—Set the current terminal window size.
185 ///
186 /// Also known as the `TIOCSWINSZ` operation with `ioctl`.
187 ///
188 /// # References
189 /// - [Linux]
190 ///
191 /// [Linux]: https://man7.org/linux/man-pages/man4/tty_ioctl.4.html
192 #[inline]
193 #[doc(alias = "TIOCSWINSZ")]
tcsetwinsize<Fd: AsFd>(fd: Fd, winsize: Winsize) -> io::Result<()>194 pub fn tcsetwinsize<Fd: AsFd>(fd: Fd, winsize: Winsize) -> io::Result<()> {
195 backend::termios::syscalls::tcsetwinsize(fd.as_fd(), winsize)
196 }
197