Vendor dependencies for 0.3.0 release

This commit is contained in:
2025-09-27 10:29:08 -05:00
parent 0c8d39d483
commit 82ab7f317b
26803 changed files with 16134934 additions and 0 deletions

66
vendor/rustix/src/termios/ioctl.rs vendored Normal file
View File

@@ -0,0 +1,66 @@
//! Terminal-related `ioctl` functions.
#![allow(unsafe_code)]
use crate::fd::AsFd;
use crate::{backend, io, ioctl};
use backend::c;
/// `ioctl(fd, TIOCEXCL)`—Enables exclusive mode on a terminal.
///
/// In exclusive mode, subsequent unprivileged `open` calls on the terminal
/// device fail with [`io::Errno::BUSY`].
///
/// # References
/// - [Linux]
/// - [FreeBSD]
/// - [NetBSD]
/// - [OpenBSD]
///
/// [Linux]: https://man7.org/linux/man-pages/man4/tty_ioctl.4.html
/// [FreeBSD]: https://man.freebsd.org/cgi/man.cgi?query=tty&sektion=4
/// [NetBSD]: https://man.netbsd.org/tty.4
/// [OpenBSD]: https://man.openbsd.org/tty.4
#[cfg(not(any(
windows,
target_os = "horizon",
target_os = "redox",
target_os = "wasi"
)))]
#[inline]
#[doc(alias = "TIOCEXCL")]
pub fn ioctl_tiocexcl<Fd: AsFd>(fd: Fd) -> io::Result<()> {
// SAFETY: `TIOCEXCL` is a no-argument setter opcode.
unsafe {
let ctl = ioctl::NoArg::<{ c::TIOCEXCL as _ }>::new();
ioctl::ioctl(fd, ctl)
}
}
/// `ioctl(fd, TIOCNXCL)`—Disables exclusive mode on a terminal.
///
/// # References
/// - [Linux]
/// - [FreeBSD]
/// - [NetBSD]
/// - [OpenBSD]
///
/// [Linux]: https://man7.org/linux/man-pages/man4/tty_ioctl.4.html
/// [FreeBSD]: https://man.freebsd.org/cgi/man.cgi?query=tty&sektion=4
/// [NetBSD]: https://man.netbsd.org/tty.4
/// [OpenBSD]: https://man.openbsd.org/tty.4
#[cfg(not(any(
windows,
target_os = "horizon",
target_os = "redox",
target_os = "wasi"
)))]
#[inline]
#[doc(alias = "TIOCNXCL")]
pub fn ioctl_tiocnxcl<Fd: AsFd>(fd: Fd) -> io::Result<()> {
// SAFETY: `TIOCNXCL` is a no-argument setter opcode.
unsafe {
let ctl = ioctl::NoArg::<{ c::TIOCNXCL as _ }>::new();
ioctl::ioctl(fd, ctl)
}
}

38
vendor/rustix/src/termios/mod.rs vendored Normal file
View File

@@ -0,0 +1,38 @@
//! Terminal I/O stream operations.
//!
//! This API automatically supports setting arbitrary I/O speeds, on any
//! platform that supports them, including Linux and the BSDs.
//!
//! The [`speed`] module contains various predefined speed constants which are
//! more likely to be portable, however any `u32` value can be passed to
//! [`Termios::set_speed`], [`Termios::set_input_speed`], and
//! [`Termios::set_output_speed`], and they will simply fail if the speed is
//! not supported by the platform or the device.
#[cfg(not(any(
target_os = "cygwin",
target_os = "espidf",
target_os = "haiku",
target_os = "wasi",
)))]
mod ioctl;
#[cfg(not(target_os = "wasi"))]
mod tc;
#[cfg(not(windows))]
mod tty;
#[cfg(not(any(target_os = "espidf", target_os = "wasi")))]
mod types;
#[cfg(not(any(
target_os = "cygwin",
target_os = "espidf",
target_os = "haiku",
target_os = "wasi",
)))]
pub use ioctl::*;
#[cfg(not(target_os = "wasi"))]
pub use tc::*;
#[cfg(not(windows))]
pub use tty::*;
#[cfg(not(any(target_os = "espidf", target_os = "wasi")))]
pub use types::*;

225
vendor/rustix/src/termios/tc.rs vendored Normal file
View File

@@ -0,0 +1,225 @@
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`.
///
/// On Linux, this uses `TCGETS2`. If that fails in a way that indicates that
/// the host doesn't support it, this falls back to the old `TCGETS`, manually
/// initializes the fields that `TCGETS` doesn't initialize, and fails with
/// `io::Errno::RANGE` if the input or output speeds cannot be supported.
///
/// # References
/// - [POSIX `tcgetattr`]
/// - [Linux `ioctl_tty`]
/// - [Linux `termios`]
///
/// [POSIX `tcgetattr`]: https://pubs.opengroup.org/onlinepubs/9799919799/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: AsFd>(fd: Fd) -> io::Result<Termios> {
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 = "horizon",
target_os = "espidf",
target_os = "wasi"
)))]
#[inline]
#[doc(alias = "TIOCGWINSZ")]
pub fn tcgetwinsize<Fd: AsFd>(fd: Fd) -> io::Result<Winsize> {
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/9799919799/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: AsFd>(fd: Fd) -> io::Result<Pid> {
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/9799919799/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: AsFd>(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`.
///
/// On Linux, this uses `TCSETS2`. If that fails in a way that indicates that
/// the host doesn't support it, this falls back to the old `TCSETS`, and fails
/// with `io::Errno::RANGE` if the input or output speeds cannot be supported.
///
/// # References
/// - [POSIX `tcsetattr`]
/// - [Linux `ioctl_tty`]
/// - [Linux `termios`]
///
/// [POSIX `tcsetattr`]: https://pubs.opengroup.org/onlinepubs/9799919799/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: AsFd>(
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.
///
/// This transmits zero-valued bits for at least 0.25 seconds.
///
/// This function does not have a `duration` parameter, and always uses the
/// implementation-defined value, which transmits for at least 0.25 seconds.
///
/// Also known as the `TCSBRK` operation with `ioctl`, with a duration
/// parameter of 0.
///
/// # References
/// - [POSIX `tcsendbreak`]
/// - [Linux `ioctl_tty`]
/// - [Linux `termios`]
///
/// [POSIX `tcsendbreak`]: https://pubs.opengroup.org/onlinepubs/9799919799/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: AsFd>(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/9799919799/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: AsFd>(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/9799919799/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: AsFd>(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/9799919799/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: AsFd>(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/9799919799/functions/tcgetsid.html
/// [Linux]: https://man7.org/linux/man-pages/man3/tcgetsid.3.html
#[inline]
#[doc(alias = "TIOCGSID")]
pub fn tcgetsid<Fd: AsFd>(fd: Fd) -> io::Result<Pid> {
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(any(target_os = "espidf", target_os = "horizon")))]
#[inline]
#[doc(alias = "TIOCSWINSZ")]
pub fn tcsetwinsize<Fd: AsFd>(fd: Fd, winsize: Winsize) -> io::Result<()> {
backend::termios::syscalls::tcsetwinsize(fd.as_fd(), winsize)
}

90
vendor/rustix/src/termios/tty.rs vendored Normal file
View File

@@ -0,0 +1,90 @@
//! Functions which operate on file descriptors which might be terminals.
use crate::backend;
#[cfg(feature = "alloc")]
#[cfg(feature = "fs")]
#[cfg(not(any(target_os = "fuchsia", target_os = "wasi")))]
use crate::path::SMALL_PATH_BUFFER_SIZE;
use backend::fd::AsFd;
#[cfg(feature = "alloc")]
#[cfg(not(any(target_os = "fuchsia", target_os = "wasi")))]
use {crate::ffi::CString, crate::io, alloc::vec::Vec, backend::fd::BorrowedFd};
/// `isatty(fd)`—Tests whether a file descriptor refers to a terminal.
///
/// # References
/// - [POSIX]
/// - [Linux]
///
/// [POSIX]: https://pubs.opengroup.org/onlinepubs/9799919799/functions/isatty.html
/// [Linux]: https://man7.org/linux/man-pages/man3/isatty.3.html
#[inline]
pub fn isatty<Fd: AsFd>(fd: Fd) -> bool {
backend::termios::syscalls::isatty(fd.as_fd())
}
/// `ttyname_r(fd)`—Returns the name of the tty open on `fd`.
///
/// If `reuse` already has available capacity, reuse it if possible.
///
/// On Linux, this function depends on procfs being mounted on /proc.
///
/// # References
/// - [POSIX]
/// - [Linux]
///
/// [POSIX]: https://pubs.opengroup.org/onlinepubs/9799919799/functions/ttyname.html
/// [Linux]: https://man7.org/linux/man-pages/man3/ttyname.3.html
#[cfg(not(any(target_os = "fuchsia", target_os = "wasi")))]
#[cfg(feature = "alloc")]
#[cfg(feature = "fs")]
#[doc(alias = "ttyname_r")]
#[cfg_attr(docsrs, doc(cfg(feature = "fs")))]
#[cfg_attr(docsrs, doc(cfg(feature = "alloc")))]
#[inline]
pub fn ttyname<Fd: AsFd, B: Into<Vec<u8>>>(fd: Fd, reuse: B) -> io::Result<CString> {
_ttyname(fd.as_fd(), reuse.into())
}
#[cfg(not(any(target_os = "fuchsia", target_os = "wasi")))]
#[cfg(feature = "alloc")]
#[cfg(feature = "fs")]
#[allow(unsafe_code)]
fn _ttyname(fd: BorrowedFd<'_>, mut buffer: Vec<u8>) -> io::Result<CString> {
buffer.clear();
buffer.reserve(SMALL_PATH_BUFFER_SIZE);
loop {
match backend::termios::syscalls::ttyname(fd, buffer.spare_capacity_mut()) {
Err(io::Errno::RANGE) => {
// Use `Vec` reallocation strategy to grow capacity
// exponentially.
buffer.reserve(buffer.capacity() + 1);
}
Ok(len) => {
// SAFETY: Assume the backend returns the length of the string
// excluding the NUL.
unsafe {
buffer.set_len(len + 1);
}
// SAFETY:
// - “ttyname_r stores this pathname in the buffer buf”
// - [POSIX definition 3.271: Pathname]: “A string that is
// used to identify a file.”
// - [POSIX definition 3.375: String]: “A contiguous sequence
// of bytes terminated by and including the first null byte.”
//
// Thus, there will be a single NUL byte at the end of the
// string.
//
// [POSIX definition 3.271: Pathname]: https://pubs.opengroup.org/onlinepubs/9799919799/basedefs/V1_chap03.html#tag_03_271
// [POSIX definition 3.375: String]: https://pubs.opengroup.org/onlinepubs/9799919799/basedefs/V1_chap03.html#tag_03_375
unsafe {
return Ok(CString::from_vec_with_nul_unchecked(buffer));
}
}
Err(errno) => return Err(errno),
}
}
}

1654
vendor/rustix/src/termios/types.rs vendored Normal file

File diff suppressed because it is too large Load Diff