use crate::fd::AsFd; #[cfg(not(target_os = "espidf"))] use crate::termios::{Action, OptionalActions, QueueSelector, Termios, Winsize}; use crate::{backend, io}; pub use crate::pid::Pid; /// `tcgetattr(fd)`—Get terminal attributes. /// /// Also known as the `TCGETS` (or `TCGETS2` on Linux) operation with `ioctl`. /// /// # References /// - [POSIX `tcgetattr`] /// - [Linux `ioctl_tty`] /// - [Linux `termios`] /// /// [POSIX `tcgetattr`]: https://pubs.opengroup.org/onlinepubs/9699919799/functions/tcgetattr.html /// [Linux `ioctl_tty`]: https://man7.org/linux/man-pages/man4/tty_ioctl.4.html /// [Linux `termios`]: https://man7.org/linux/man-pages/man3/termios.3.html #[cfg(not(any(windows, target_os = "espidf", target_os = "wasi")))] #[inline] #[doc(alias = "TCGETS")] #[doc(alias = "TCGETS2")] #[doc(alias = "tcgetattr2")] pub fn tcgetattr(fd: Fd) -> io::Result { backend::termios::syscalls::tcgetattr(fd.as_fd()) } /// `tcgetwinsize(fd)`—Get the current terminal window size. /// /// Also known as the `TIOCGWINSZ` operation with `ioctl`. /// /// # References /// - [Linux] /// /// [Linux]: https://man7.org/linux/man-pages/man4/tty_ioctl.4.html #[cfg(not(any(windows, target_os = "espidf", target_os = "wasi")))] #[inline] #[doc(alias = "TIOCGWINSZ")] pub fn tcgetwinsize(fd: Fd) -> io::Result { backend::termios::syscalls::tcgetwinsize(fd.as_fd()) } /// `tcgetpgrp(fd)`—Get the terminal foreground process group. /// /// Also known as the `TIOCGPGRP` operation with `ioctl`. /// /// On Linux, if `fd` is a pseudo-terminal, the underlying system call here can /// return a pid of 0, which rustix's `Pid` type doesn't support. So rustix /// instead handles this case by failing with [`io::Errno::OPNOTSUPP`] if the /// pid is 0. /// /// # References /// - [POSIX] /// - [Linux] /// /// [POSIX]: https://pubs.opengroup.org/onlinepubs/9699919799/functions/tcgetpgrp.html /// [Linux]: https://man7.org/linux/man-pages/man3/tcgetpgrp.3.html #[cfg(not(any(windows, target_os = "wasi")))] #[inline] #[doc(alias = "TIOCGPGRP")] pub fn tcgetpgrp(fd: Fd) -> io::Result { backend::termios::syscalls::tcgetpgrp(fd.as_fd()) } /// `tcsetpgrp(fd, pid)`—Set the terminal foreground process group. /// /// Also known as the `TIOCSPGRP` operation with `ioctl`. /// /// # References /// - [POSIX] /// - [Linux] /// /// [POSIX]: https://pubs.opengroup.org/onlinepubs/9699919799/functions/tcsetpgrp.html /// [Linux]: https://man7.org/linux/man-pages/man3/tcsetpgrp.3.html #[cfg(not(any(windows, target_os = "wasi")))] #[inline] #[doc(alias = "TIOCSPGRP")] pub fn tcsetpgrp(fd: Fd, pid: Pid) -> io::Result<()> { backend::termios::syscalls::tcsetpgrp(fd.as_fd(), pid) } /// `tcsetattr(fd)`—Set terminal attributes. /// /// Also known as the `TCSETS` (or `TCSETS2 on Linux) operation with `ioctl`. /// /// # References /// - [POSIX `tcsetattr`] /// - [Linux `ioctl_tty`] /// - [Linux `termios`] /// /// [POSIX `tcsetattr`]: https://pubs.opengroup.org/onlinepubs/9699919799/functions/tcsetattr.html /// [Linux `ioctl_tty`]: https://man7.org/linux/man-pages/man4/tty_ioctl.4.html /// [Linux `termios`]: https://man7.org/linux/man-pages/man3/termios.3.html #[cfg(not(target_os = "espidf"))] #[inline] #[doc(alias = "TCSETS")] #[doc(alias = "TCSETS2")] #[doc(alias = "tcsetattr2")] pub fn tcsetattr( fd: Fd, optional_actions: OptionalActions, termios: &Termios, ) -> io::Result<()> { backend::termios::syscalls::tcsetattr(fd.as_fd(), optional_actions, termios) } /// `tcsendbreak(fd, 0)`—Transmit zero-valued bits. /// /// Also known as the `TCSBRK` operation with `ioctl`, with a duration of 0. /// /// This function always uses an effective duration parameter of zero. For the /// equivalent of a `tcsendbreak` with a non-zero duration parameter, use /// `tcdrain`. /// /// # References /// - [POSIX `tcsendbreak`] /// - [Linux `ioctl_tty`] /// - [Linux `termios`] /// /// [POSIX `tcsendbreak`]: https://pubs.opengroup.org/onlinepubs/9699919799/functions/tcsendbreak.html /// [Linux `ioctl_tty`]: https://man7.org/linux/man-pages/man4/tty_ioctl.4.html /// [Linux `termios`]: https://man7.org/linux/man-pages/man3/termios.3.html #[inline] #[doc(alias = "TCSBRK")] pub fn tcsendbreak(fd: Fd) -> io::Result<()> { backend::termios::syscalls::tcsendbreak(fd.as_fd()) } /// `tcdrain(fd, duration)`—Wait until all pending output has been written. /// /// # References /// - [POSIX `tcdrain`] /// - [Linux `ioctl_tty`] /// - [Linux `termios`] /// /// [POSIX `tcsetattr`]: https://pubs.opengroup.org/onlinepubs/9699919799/functions/tcdrain.html /// [Linux `ioctl_tty`]: https://man7.org/linux/man-pages/man4/tty_ioctl.4.html /// [Linux `termios`]: https://man7.org/linux/man-pages/man3/termios.3.html #[cfg(not(target_os = "espidf"))] #[inline] pub fn tcdrain(fd: Fd) -> io::Result<()> { backend::termios::syscalls::tcdrain(fd.as_fd()) } /// `tcflush(fd, queue_selector)`—Wait until all pending output has been /// written. /// /// # References /// - [POSIX `tcflush`] /// - [Linux `ioctl_tty`] /// - [Linux `termios`] /// /// [POSIX `tcflush`]: https://pubs.opengroup.org/onlinepubs/9699919799/functions/tcflush.html /// [Linux `ioctl_tty`]: https://man7.org/linux/man-pages/man4/tty_ioctl.4.html /// [Linux `termios`]: https://man7.org/linux/man-pages/man3/termios.3.html #[cfg(not(target_os = "espidf"))] #[inline] #[doc(alias = "TCFLSH")] pub fn tcflush(fd: Fd, queue_selector: QueueSelector) -> io::Result<()> { backend::termios::syscalls::tcflush(fd.as_fd(), queue_selector) } /// `tcflow(fd, action)`—Suspend or resume transmission or reception. /// /// # References /// - [POSIX `tcflow`] /// - [Linux `ioctl_tty`] /// - [Linux `termios`] /// /// [POSIX `tcflow`]: https://pubs.opengroup.org/onlinepubs/9699919799/functions/tcflow.html /// [Linux `ioctl_tty`]: https://man7.org/linux/man-pages/man4/tty_ioctl.4.html /// [Linux `termios`]: https://man7.org/linux/man-pages/man3/termios.3.html #[cfg(not(target_os = "espidf"))] #[inline] #[doc(alias = "TCXONC")] pub fn tcflow(fd: Fd, action: Action) -> io::Result<()> { backend::termios::syscalls::tcflow(fd.as_fd(), action) } /// `tcgetsid(fd)`—Return the session ID of the current session with `fd` as /// its controlling terminal. /// /// # References /// - [POSIX] /// - [Linux] /// /// [POSIX]: https://pubs.opengroup.org/onlinepubs/9699919799/functions/tcgetsid.html /// [Linux]: https://man7.org/linux/man-pages/man3/tcgetsid.3.html #[inline] #[doc(alias = "TIOCGSID")] pub fn tcgetsid(fd: Fd) -> io::Result { backend::termios::syscalls::tcgetsid(fd.as_fd()) } /// `tcsetwinsize(fd)`—Set the current terminal window size. /// /// Also known as the `TIOCSWINSZ` operation with `ioctl`. /// /// # References /// - [Linux] /// /// [Linux]: https://man7.org/linux/man-pages/man4/tty_ioctl.4.html #[cfg(not(target_os = "espidf"))] #[inline] #[doc(alias = "TIOCSWINSZ")] pub fn tcsetwinsize(fd: Fd, winsize: Winsize) -> io::Result<()> { backend::termios::syscalls::tcsetwinsize(fd.as_fd(), winsize) }