diff options
author | Valentin Popov <valentin@popov.link> | 2024-07-19 15:37:58 +0300 |
---|---|---|
committer | Valentin Popov <valentin@popov.link> | 2024-07-19 15:37:58 +0300 |
commit | a990de90fe41456a23e58bd087d2f107d321f3a1 (patch) | |
tree | 15afc392522a9e85dc3332235e311b7d39352ea9 /vendor/rustix/src/backend | |
parent | 3d48cd3f81164bbfc1a755dc1d4a9a02f98c8ddd (diff) | |
download | fparkan-a990de90fe41456a23e58bd087d2f107d321f3a1.tar.xz fparkan-a990de90fe41456a23e58bd087d2f107d321f3a1.zip |
Deleted vendor folder
Diffstat (limited to 'vendor/rustix/src/backend')
162 files changed, 0 insertions, 34317 deletions
diff --git a/vendor/rustix/src/backend/libc/c.rs b/vendor/rustix/src/backend/libc/c.rs deleted file mode 100644 index d3a1e5f..0000000 --- a/vendor/rustix/src/backend/libc/c.rs +++ /dev/null @@ -1,468 +0,0 @@ -//! Libc and supplemental types and constants. - -#![allow(unused_imports)] - -// Import everything from libc, but we'll add some stuff and override some -// things below. -pub(crate) use libc::*; - -/// `PROC_SUPER_MAGIC`—The magic number for the procfs filesystem. -#[cfg(all(linux_kernel, target_env = "musl"))] -pub(crate) const PROC_SUPER_MAGIC: u32 = 0x0000_9fa0; - -/// `NFS_SUPER_MAGIC`—The magic number for the NFS filesystem. -#[cfg(all(linux_kernel, target_env = "musl"))] -pub(crate) const NFS_SUPER_MAGIC: u32 = 0x0000_6969; - -#[cfg(feature = "process")] -#[cfg(not(any(target_os = "espidf", target_os = "wasi")))] -pub(crate) const EXIT_SIGNALED_SIGABRT: c_int = 128 + SIGABRT as c_int; - -// TODO: Upstream these. -#[cfg(all(linux_kernel, feature = "net"))] -pub(crate) const ETH_P_TSN: c_int = linux_raw_sys::if_ether::ETH_P_TSN as _; -#[cfg(all(linux_kernel, feature = "net"))] -pub(crate) const ETH_P_ERSPAN2: c_int = linux_raw_sys::if_ether::ETH_P_ERSPAN2 as _; -#[cfg(all(linux_kernel, feature = "net"))] -pub(crate) const ETH_P_ERSPAN: c_int = linux_raw_sys::if_ether::ETH_P_ERSPAN as _; -#[cfg(all(linux_kernel, feature = "net"))] -pub(crate) const ETH_P_PROFINET: c_int = linux_raw_sys::if_ether::ETH_P_PROFINET as _; -#[cfg(all(linux_kernel, feature = "net"))] -pub(crate) const ETH_P_REALTEK: c_int = linux_raw_sys::if_ether::ETH_P_REALTEK as _; -#[cfg(all(linux_kernel, feature = "net"))] -pub(crate) const ETH_P_ETHERCAT: c_int = linux_raw_sys::if_ether::ETH_P_ETHERCAT as _; -#[cfg(all(linux_kernel, feature = "net"))] -pub(crate) const ETH_P_PREAUTH: c_int = linux_raw_sys::if_ether::ETH_P_PREAUTH as _; -#[cfg(all(linux_kernel, feature = "net"))] -pub(crate) const ETH_P_LLDP: c_int = linux_raw_sys::if_ether::ETH_P_LLDP as _; -#[cfg(all(linux_kernel, feature = "net"))] -pub(crate) const ETH_P_MRP: c_int = linux_raw_sys::if_ether::ETH_P_MRP as _; -#[cfg(all(linux_kernel, feature = "net"))] -pub(crate) const ETH_P_NCSI: c_int = linux_raw_sys::if_ether::ETH_P_NCSI as _; -#[cfg(all(linux_kernel, feature = "net"))] -pub(crate) const ETH_P_CFM: c_int = linux_raw_sys::if_ether::ETH_P_CFM as _; -#[cfg(all(linux_kernel, feature = "net"))] -pub(crate) const ETH_P_IBOE: c_int = linux_raw_sys::if_ether::ETH_P_IBOE as _; -#[cfg(all(linux_kernel, feature = "net"))] -pub(crate) const ETH_P_HSR: c_int = linux_raw_sys::if_ether::ETH_P_HSR as _; -#[cfg(all(linux_kernel, feature = "net"))] -pub(crate) const ETH_P_NSH: c_int = linux_raw_sys::if_ether::ETH_P_NSH as _; -#[cfg(all(linux_kernel, feature = "net"))] -pub(crate) const ETH_P_DSA_8021Q: c_int = linux_raw_sys::if_ether::ETH_P_DSA_8021Q as _; -#[cfg(all(linux_kernel, feature = "net"))] -pub(crate) const ETH_P_DSA_A5PSW: c_int = linux_raw_sys::if_ether::ETH_P_DSA_A5PSW as _; -#[cfg(all(linux_kernel, feature = "net"))] -pub(crate) const ETH_P_IFE: c_int = linux_raw_sys::if_ether::ETH_P_IFE as _; -#[cfg(all(linux_kernel, feature = "net"))] -pub(crate) const ETH_P_CAN: c_int = linux_raw_sys::if_ether::ETH_P_CAN as _; -#[cfg(all(linux_kernel, feature = "net"))] -pub(crate) const ETH_P_CANXL: c_int = linux_raw_sys::if_ether::ETH_P_CANXL as _; -#[cfg(all(linux_kernel, feature = "net"))] -pub(crate) const ETH_P_XDSA: c_int = linux_raw_sys::if_ether::ETH_P_XDSA as _; -#[cfg(all(linux_kernel, feature = "net"))] -pub(crate) const ETH_P_MAP: c_int = linux_raw_sys::if_ether::ETH_P_MAP as _; -#[cfg(all(linux_kernel, feature = "net"))] -pub(crate) const ETH_P_MCTP: c_int = linux_raw_sys::if_ether::ETH_P_MCTP as _; - -#[cfg(all( - linux_kernel, - any( - target_arch = "mips", - target_arch = "mips32r6", - target_arch = "mips64", - target_arch = "mips64r6", - target_arch = "sparc", - target_arch = "sparc64" - ) -))] -pub(crate) const SIGEMT: c_int = linux_raw_sys::general::SIGEMT as _; - -// TODO: Upstream these. -#[cfg(all(linux_kernel, feature = "termios"))] -pub(crate) const IUCLC: tcflag_t = linux_raw_sys::general::IUCLC as _; -#[cfg(all(linux_kernel, feature = "termios"))] -pub(crate) const XCASE: tcflag_t = linux_raw_sys::general::XCASE as _; - -#[cfg(target_os = "aix")] -pub(crate) const MSG_DONTWAIT: c_int = libc::MSG_NONBLOCK; - -// TODO: Remove once https://github.com/rust-lang/libc/pull/3377 is merged and released. -#[cfg(target_os = "netbsd")] -#[cfg(feature = "net")] -pub(crate) const SO_NOSIGPIPE: c_int = 0x0800; - -// On PowerPC, the regular `termios` has the `termios2` fields and there is no -// `termios2`. linux-raw-sys has aliases `termios2` to `termios` to cover this -// difference, but we still need to manually import it since `libc` doesn't -// have this. -#[cfg(all( - linux_kernel, - feature = "termios", - any(target_arch = "powerpc", target_arch = "powerpc64") -))] -pub(crate) use { - linux_raw_sys::general::{termios2, CIBAUD}, - linux_raw_sys::ioctl::{TCGETS2, TCSETS2, TCSETSF2, TCSETSW2}, -}; - -// Automatically enable “large file” support (LFS) features. - -#[cfg(target_os = "vxworks")] -pub(super) use libc::_Vx_ticks64_t as _Vx_ticks_t; -#[cfg(linux_kernel)] -pub(super) use libc::fallocate64 as fallocate; -#[cfg(not(any(target_arch = "aarch64", target_arch = "riscv64")))] -#[cfg(any(linux_like, target_os = "aix"))] -pub(super) use libc::open64 as open; -#[cfg(any( - linux_kernel, - target_os = "aix", - target_os = "hurd", - target_os = "l4re" -))] -pub(super) use libc::posix_fallocate64 as posix_fallocate; -#[cfg(any(all(linux_like, not(target_os = "android")), target_os = "aix"))] -pub(super) use libc::{blkcnt64_t as blkcnt_t, rlim64_t as rlim_t}; -// TODO: AIX has `stat64x`, `fstat64x`, `lstat64x`, and `stat64xat`; add them -// to the upstream libc crate and implement rustix's `statat` etc. with them. -#[cfg(target_os = "aix")] -pub(super) use libc::{ - blksize64_t as blksize_t, fstat64 as fstat, fstatfs64 as fstatfs, fstatvfs64 as fstatvfs, - ftruncate64 as ftruncate, getrlimit64 as getrlimit, ino_t, lseek64 as lseek, mmap, - off64_t as off_t, openat, posix_fadvise64 as posix_fadvise, preadv, pwritev, - rlimit64 as rlimit, setrlimit64 as setrlimit, stat64at as fstatat, statfs64 as statfs, - statvfs64 as statvfs, RLIM_INFINITY, -}; -#[cfg(any(linux_like, target_os = "hurd"))] -pub(super) use libc::{ - fstat64 as fstat, fstatat64 as fstatat, fstatfs64 as fstatfs, fstatvfs64 as fstatvfs, - ftruncate64 as ftruncate, getrlimit64 as getrlimit, ino64_t as ino_t, lseek64 as lseek, - mmap64 as mmap, off64_t as off_t, openat64 as openat, posix_fadvise64 as posix_fadvise, - rlimit64 as rlimit, setrlimit64 as setrlimit, statfs64 as statfs, statvfs64 as statvfs, - RLIM64_INFINITY as RLIM_INFINITY, -}; -#[cfg(apple)] -pub(super) use libc::{ - host_info64_t as host_info_t, host_statistics64 as host_statistics, - vm_statistics64_t as vm_statistics_t, -}; -#[cfg(not(all( - linux_kernel, - any( - target_pointer_width = "32", - target_arch = "mips64", - target_arch = "mips64r6" - ) -)))] -#[cfg(any(linux_like, target_os = "aix", target_os = "hurd"))] -pub(super) use libc::{lstat64 as lstat, stat64 as stat}; -#[cfg(any( - linux_kernel, - target_os = "aix", - target_os = "hurd", - target_os = "emscripten" -))] -pub(super) use libc::{pread64 as pread, pwrite64 as pwrite}; -#[cfg(any(target_os = "linux", target_os = "hurd", target_os = "emscripten"))] -pub(super) use libc::{preadv64 as preadv, pwritev64 as pwritev}; - -#[cfg(all(target_os = "linux", target_env = "gnu"))] -pub(super) unsafe fn prlimit( - pid: libc::pid_t, - resource: libc::__rlimit_resource_t, - new_limit: *const libc::rlimit64, - old_limit: *mut libc::rlimit64, -) -> libc::c_int { - // `prlimit64` wasn't supported in glibc until 2.13. - weak_or_syscall! { - fn prlimit64( - pid: libc::pid_t, - resource: libc::__rlimit_resource_t, - new_limit: *const libc::rlimit64, - old_limit: *mut libc::rlimit64 - ) via SYS_prlimit64 -> libc::c_int - } - - prlimit64(pid, resource, new_limit, old_limit) -} - -#[cfg(all(target_os = "linux", target_env = "musl"))] -pub(super) unsafe fn prlimit( - pid: libc::pid_t, - resource: libc::c_int, - new_limit: *const libc::rlimit64, - old_limit: *mut libc::rlimit64, -) -> libc::c_int { - weak_or_syscall! { - fn prlimit64( - pid: libc::pid_t, - resource: libc::c_int, - new_limit: *const libc::rlimit64, - old_limit: *mut libc::rlimit64 - ) via SYS_prlimit64 -> libc::c_int - } - - prlimit64(pid, resource, new_limit, old_limit) -} - -#[cfg(target_os = "android")] -pub(super) unsafe fn prlimit( - pid: libc::pid_t, - resource: libc::c_int, - new_limit: *const libc::rlimit64, - old_limit: *mut libc::rlimit64, -) -> libc::c_int { - weak_or_syscall! { - fn prlimit64( - pid: libc::pid_t, - resource: libc::c_int, - new_limit: *const libc::rlimit64, - old_limit: *mut libc::rlimit64 - ) via SYS_prlimit64 -> libc::c_int - } - - prlimit64(pid, resource, new_limit, old_limit) -} - -#[cfg(target_os = "android")] -mod readwrite_pv64 { - use super::*; - - pub(in super::super) unsafe fn preadv64( - fd: libc::c_int, - iov: *const libc::iovec, - iovcnt: libc::c_int, - offset: libc::off64_t, - ) -> libc::ssize_t { - // Older Android libc lacks `preadv64`, so use the `weak!` mechanism to - // test for it, and call back to `libc::syscall`. We don't use - // `weak_or_syscall` here because we need to pass the 64-bit offset - // specially. - weak! { - fn preadv64(libc::c_int, *const libc::iovec, libc::c_int, libc::off64_t) -> libc::ssize_t - } - if let Some(fun) = preadv64.get() { - fun(fd, iov, iovcnt, offset) - } else { - // Unlike the plain "p" functions, the "pv" functions pass their - // offset in an endian-independent way, and always in two registers. - syscall! { - fn preadv( - fd: libc::c_int, - iov: *const libc::iovec, - iovcnt: libc::c_int, - offset_lo: usize, - offset_hi: usize - ) via SYS_preadv -> libc::ssize_t - } - preadv(fd, iov, iovcnt, offset as usize, (offset >> 32) as usize) - } - } - pub(in super::super) unsafe fn pwritev64( - fd: libc::c_int, - iov: *const libc::iovec, - iovcnt: libc::c_int, - offset: libc::off64_t, - ) -> libc::ssize_t { - // See the comments in `preadv64`. - weak! { - fn pwritev64(libc::c_int, *const libc::iovec, libc::c_int, libc::off64_t) -> libc::ssize_t - } - if let Some(fun) = pwritev64.get() { - fun(fd, iov, iovcnt, offset) - } else { - // Unlike the plain "p" functions, the "pv" functions pass their - // offset in an endian-independent way, and always in two registers. - syscall! { - fn pwritev( - fd: libc::c_int, - iov: *const libc::iovec, - iovcnt: libc::c_int, - offset_lo: usize, - offset_hi: usize - ) via SYS_pwritev -> libc::ssize_t - } - pwritev(fd, iov, iovcnt, offset as usize, (offset >> 32) as usize) - } - } -} -#[cfg(target_os = "android")] -pub(super) use readwrite_pv64::{preadv64 as preadv, pwritev64 as pwritev}; - -// macOS added `preadv` and `pwritev` in version 11.0. -#[cfg(apple)] -mod readwrite_pv { - weakcall! { - pub(in super::super) fn preadv( - fd: libc::c_int, - iov: *const libc::iovec, - iovcnt: libc::c_int, - offset: libc::off_t - ) -> libc::ssize_t - } - weakcall! { - pub(in super::super) fn pwritev( - fd: libc::c_int, - iov: *const libc::iovec, - iovcnt: libc::c_int, offset: libc::off_t - ) -> libc::ssize_t - } -} -#[cfg(apple)] -pub(super) use readwrite_pv::{preadv, pwritev}; - -// glibc added `preadv64v2` and `pwritev64v2` in version 2.26. -#[cfg(all(target_os = "linux", target_env = "gnu"))] -mod readwrite_pv64v2 { - use super::*; - - pub(in super::super) unsafe fn preadv64v2( - fd: libc::c_int, - iov: *const libc::iovec, - iovcnt: libc::c_int, - offset: libc::off64_t, - flags: libc::c_int, - ) -> libc::ssize_t { - // Older glibc lacks `preadv64v2`, so use the `weak!` mechanism to - // test for it, and call back to `libc::syscall`. We don't use - // `weak_or_syscall` here because we need to pass the 64-bit offset - // specially. - weak! { - fn preadv64v2(libc::c_int, *const libc::iovec, libc::c_int, libc::off64_t, libc::c_int) -> libc::ssize_t - } - if let Some(fun) = preadv64v2.get() { - fun(fd, iov, iovcnt, offset, flags) - } else { - // Unlike the plain "p" functions, the "pv" functions pass their - // offset in an endian-independent way, and always in two registers. - syscall! { - fn preadv2( - fd: libc::c_int, - iov: *const libc::iovec, - iovcnt: libc::c_int, - offset_lo: usize, - offset_hi: usize, - flags: libc::c_int - ) via SYS_preadv2 -> libc::ssize_t - } - preadv2( - fd, - iov, - iovcnt, - offset as usize, - (offset >> 32) as usize, - flags, - ) - } - } - pub(in super::super) unsafe fn pwritev64v2( - fd: libc::c_int, - iov: *const libc::iovec, - iovcnt: libc::c_int, - offset: libc::off64_t, - flags: libc::c_int, - ) -> libc::ssize_t { - // See the comments in `preadv64v2`. - weak! { - fn pwritev64v2(libc::c_int, *const libc::iovec, libc::c_int, libc::off64_t, libc::c_int) -> libc::ssize_t - } - if let Some(fun) = pwritev64v2.get() { - fun(fd, iov, iovcnt, offset, flags) - } else { - // Unlike the plain "p" functions, the "pv" functions pass their - // offset in an endian-independent way, and always in two registers. - syscall! { - fn pwritev2( - fd: libc::c_int, - iov: *const libc::iovec, - iovec: libc::c_int, - offset_lo: usize, - offset_hi: usize, - flags: libc::c_int - ) via SYS_pwritev2 -> libc::ssize_t - } - pwritev2( - fd, - iov, - iovcnt, - offset as usize, - (offset >> 32) as usize, - flags, - ) - } - } -} -#[cfg(all(target_os = "linux", target_env = "gnu"))] -pub(super) use readwrite_pv64v2::{preadv64v2 as preadv2, pwritev64v2 as pwritev2}; - -// On non-glibc, assume we don't have `pwritev2`/`preadv2` in libc and use -// `c::syscall` instead. -#[cfg(any( - target_os = "android", - all(target_os = "linux", not(target_env = "gnu")), -))] -mod readwrite_pv64v2 { - use super::*; - - pub(in super::super) unsafe fn preadv64v2( - fd: libc::c_int, - iov: *const libc::iovec, - iovcnt: libc::c_int, - offset: libc::off64_t, - flags: libc::c_int, - ) -> libc::ssize_t { - // Unlike the plain "p" functions, the "pv" functions pass their offset - // in an endian-independent way, and always in two registers. - syscall! { - fn preadv2( - fd: libc::c_int, - iov: *const libc::iovec, - iovcnt: libc::c_int, - offset_lo: usize, - offset_hi: usize, - flags: libc::c_int - ) via SYS_preadv2 -> libc::ssize_t - } - preadv2( - fd, - iov, - iovcnt, - offset as usize, - (offset >> 32) as usize, - flags, - ) - } - pub(in super::super) unsafe fn pwritev64v2( - fd: libc::c_int, - iov: *const libc::iovec, - iovcnt: libc::c_int, - offset: libc::off64_t, - flags: libc::c_int, - ) -> libc::ssize_t { - // Unlike the plain "p" functions, the "pv" functions pass their offset - // in an endian-independent way, and always in two registers. - syscall! { - fn pwritev2( - fd: libc::c_int, - iov: *const libc::iovec, - iovcnt: libc::c_int, - offset_lo: usize, - offset_hi: usize, - flags: libc::c_int - ) via SYS_pwritev2 -> libc::ssize_t - } - pwritev2( - fd, - iov, - iovcnt, - offset as usize, - (offset >> 32) as usize, - flags, - ) - } -} -#[cfg(any( - target_os = "android", - all(target_os = "linux", not(target_env = "gnu")), -))] -pub(super) use readwrite_pv64v2::{preadv64v2 as preadv2, pwritev64v2 as pwritev2}; diff --git a/vendor/rustix/src/backend/libc/conv.rs b/vendor/rustix/src/backend/libc/conv.rs deleted file mode 100644 index 2539510..0000000 --- a/vendor/rustix/src/backend/libc/conv.rs +++ /dev/null @@ -1,247 +0,0 @@ -//! Libc call arguments and return values are often things like `c_int`, -//! `c_uint`, or libc-specific pointer types. This module provides functions -//! for converting between rustix's types and libc types. - -use super::c; -#[cfg(all(feature = "alloc", not(any(windows, target_os = "espidf"))))] -use super::fd::IntoRawFd; -use super::fd::{AsRawFd, BorrowedFd, FromRawFd, LibcFd, OwnedFd, RawFd}; -#[cfg(not(windows))] -use crate::ffi::CStr; -use crate::io; - -#[cfg(not(windows))] -#[inline] -pub(super) fn c_str(c: &CStr) -> *const c::c_char { - c.as_ptr() -} - -#[cfg(not(any(windows, target_os = "espidf", target_os = "vita", target_os = "wasi")))] -#[inline] -pub(super) fn no_fd() -> LibcFd { - -1 -} - -#[inline] -pub(super) fn borrowed_fd(fd: BorrowedFd<'_>) -> LibcFd { - fd.as_raw_fd() as LibcFd -} - -#[cfg(all( - feature = "alloc", - not(any(windows, target_os = "espidf", target_os = "redox")) -))] -#[inline] -pub(super) fn owned_fd(fd: OwnedFd) -> LibcFd { - fd.into_raw_fd() as LibcFd -} - -#[inline] -pub(super) fn ret(raw: c::c_int) -> io::Result<()> { - if raw == 0 { - Ok(()) - } else { - Err(io::Errno::last_os_error()) - } -} - -#[cfg(apple)] -#[inline] -pub(super) fn nonnegative_ret(raw: c::c_int) -> io::Result<()> { - if raw >= 0 { - Ok(()) - } else { - Err(io::Errno::last_os_error()) - } -} - -#[cfg(not(any(windows, target_os = "wasi")))] -#[inline] -pub(super) unsafe fn ret_infallible(raw: c::c_int) { - debug_assert_eq!(raw, 0, "unexpected error: {:?}", io::Errno::last_os_error()); -} - -#[inline] -pub(super) fn ret_c_int(raw: c::c_int) -> io::Result<c::c_int> { - if raw == -1 { - Err(io::Errno::last_os_error()) - } else { - Ok(raw) - } -} - -#[cfg(linux_kernel)] -#[inline] -pub(super) fn ret_u32(raw: c::c_int) -> io::Result<u32> { - if raw == -1 { - Err(io::Errno::last_os_error()) - } else { - Ok(raw as u32) - } -} - -#[inline] -pub(super) fn ret_usize(raw: c::ssize_t) -> io::Result<usize> { - if raw == -1 { - Err(io::Errno::last_os_error()) - } else { - debug_assert!(raw >= 0); - Ok(raw as usize) - } -} - -#[cfg(not(windows))] -#[cfg(feature = "fs")] -#[inline] -pub(super) fn ret_off_t(raw: c::off_t) -> io::Result<c::off_t> { - if raw == -1 { - Err(io::Errno::last_os_error()) - } else { - Ok(raw) - } -} - -#[cfg(not(any(windows, target_os = "wasi")))] -#[inline] -pub(super) fn ret_pid_t(raw: c::pid_t) -> io::Result<c::pid_t> { - if raw == -1 { - Err(io::Errno::last_os_error()) - } else { - Ok(raw) - } -} - -/// Convert a `c_int` returned from a libc function to an `OwnedFd`, if valid. -/// -/// # Safety -/// -/// The caller must ensure that this is the return value of a libc function -/// which returns an owned file descriptor. -#[inline] -pub(super) unsafe fn ret_owned_fd(raw: LibcFd) -> io::Result<OwnedFd> { - if raw == !0 { - Err(io::Errno::last_os_error()) - } else { - Ok(OwnedFd::from_raw_fd(raw as RawFd)) - } -} - -#[cfg(not(any(windows, target_os = "wasi")))] -#[inline] -pub(super) fn ret_discarded_fd(raw: LibcFd) -> io::Result<()> { - if raw == !0 { - Err(io::Errno::last_os_error()) - } else { - Ok(()) - } -} - -#[cfg(all(feature = "alloc", not(any(windows, target_os = "wasi"))))] -#[inline] -pub(super) fn ret_discarded_char_ptr(raw: *mut c::c_char) -> io::Result<()> { - if raw.is_null() { - Err(io::Errno::last_os_error()) - } else { - Ok(()) - } -} - -/// Convert the buffer-length argument value of a `send` or `recv` call. -#[cfg(not(any(windows, target_os = "redox", target_os = "wasi")))] -#[inline] -pub(super) fn send_recv_len(len: usize) -> usize { - len -} - -/// Convert the buffer-length argument value of a `send` or `recv` call. -#[cfg(windows)] -#[inline] -pub(super) fn send_recv_len(len: usize) -> i32 { - // On Windows, the length argument has type `i32`; saturate the length, - // since `send` and `recv` are allowed to send and recv less data than - // requested. - len.try_into().unwrap_or(i32::MAX) -} - -/// Convert the return value of a `send` or `recv` call. -#[cfg(not(any(windows, target_os = "redox", target_os = "wasi")))] -#[inline] -pub(super) fn ret_send_recv(len: isize) -> io::Result<usize> { - ret_usize(len) -} - -/// Convert the return value of a `send` or `recv` call. -#[cfg(windows)] -#[inline] -pub(super) fn ret_send_recv(len: i32) -> io::Result<usize> { - ret_usize(len as isize) -} - -/// Convert the value to the `msg_iovlen` field of a `msghdr` struct. -#[cfg(all( - not(any(windows, target_os = "espidf", target_os = "redox", target_os = "wasi")), - any( - target_os = "android", - all(target_os = "linux", not(target_env = "musl")) - ) -))] -#[inline] -pub(super) fn msg_iov_len(len: usize) -> c::size_t { - len -} - -/// Convert the value to the `msg_iovlen` field of a `msghdr` struct. -#[cfg(all( - not(any( - windows, - target_os = "espidf", - target_os = "redox", - target_os = "vita", - target_os = "wasi" - )), - not(any( - target_os = "android", - all(target_os = "linux", not(target_env = "musl")) - )) -))] -#[inline] -pub(crate) fn msg_iov_len(len: usize) -> c::c_int { - len.try_into().unwrap_or(c::c_int::MAX) -} - -/// Convert the value to a `socklen_t`. -#[cfg(any( - bsd, - solarish, - target_env = "musl", - target_os = "aix", - target_os = "emscripten", - target_os = "fuchsia", - target_os = "haiku", - target_os = "nto", -))] -#[inline] -pub(crate) fn msg_control_len(len: usize) -> c::socklen_t { - len.try_into().unwrap_or(c::socklen_t::MAX) -} - -/// Convert the value to a `size_t`. -#[cfg(not(any( - bsd, - solarish, - windows, - target_env = "musl", - target_os = "aix", - target_os = "emscripten", - target_os = "espidf", - target_os = "fuchsia", - target_os = "haiku", - target_os = "nto", - target_os = "redox", - target_os = "vita", - target_os = "wasi", -)))] -#[inline] -pub(crate) fn msg_control_len(len: usize) -> c::size_t { - len -} diff --git a/vendor/rustix/src/backend/libc/event/epoll.rs b/vendor/rustix/src/backend/libc/event/epoll.rs deleted file mode 100644 index ced3be1..0000000 --- a/vendor/rustix/src/backend/libc/event/epoll.rs +++ /dev/null @@ -1,496 +0,0 @@ -//! Linux `epoll` support. -//! -//! # Examples -//! -//! ```no_run -//! # #[cfg(feature = "net")] -//! # fn main() -> std::io::Result<()> { -//! use rustix::event::epoll; -//! use rustix::fd::AsFd; -//! use rustix::io::{ioctl_fionbio, read, write}; -//! use rustix::net::{ -//! accept, bind_v4, listen, socket, AddressFamily, Ipv4Addr, SocketAddrV4, SocketType, -//! }; -//! use std::collections::HashMap; -//! use std::os::unix::io::AsRawFd; -//! -//! // Create a socket and listen on it. -//! let listen_sock = socket(AddressFamily::INET, SocketType::STREAM, None)?; -//! bind_v4(&listen_sock, &SocketAddrV4::new(Ipv4Addr::LOCALHOST, 0))?; -//! listen(&listen_sock, 1)?; -//! -//! // Create an epoll object. Using `Owning` here means the epoll object will -//! // take ownership of the file descriptors registered with it. -//! let epoll = epoll::create(epoll::CreateFlags::CLOEXEC)?; -//! -//! // Register the socket with the epoll object. -//! epoll::add( -//! &epoll, -//! &listen_sock, -//! epoll::EventData::new_u64(1), -//! epoll::EventFlags::IN, -//! )?; -//! -//! // Keep track of the sockets we've opened. -//! let mut next_id = epoll::EventData::new_u64(2); -//! let mut sockets = HashMap::new(); -//! -//! // Process events. -//! let mut event_list = epoll::EventVec::with_capacity(4); -//! loop { -//! epoll::wait(&epoll, &mut event_list, -1)?; -//! for event in &event_list { -//! let target = event.data; -//! if target.u64() == 1 { -//! // Accept a new connection, set it to non-blocking, and -//! // register to be notified when it's ready to write to. -//! let conn_sock = accept(&listen_sock)?; -//! ioctl_fionbio(&conn_sock, true)?; -//! epoll::add( -//! &epoll, -//! &conn_sock, -//! next_id, -//! epoll::EventFlags::OUT | epoll::EventFlags::ET, -//! )?; -//! -//! // Keep track of the socket. -//! sockets.insert(next_id, conn_sock); -//! next_id = epoll::EventData::new_u64(next_id.u64() + 1); -//! } else { -//! // Write a message to the stream and then unregister it. -//! let target = sockets.remove(&target).unwrap(); -//! write(&target, b"hello\n")?; -//! let _ = epoll::delete(&epoll, &target)?; -//! } -//! } -//! } -//! # } -//! # #[cfg(not(feature = "net"))] -//! # fn main() {} -//! ``` - -use crate::backend::c; -#[cfg(feature = "alloc")] -use crate::backend::conv::ret_u32; -use crate::backend::conv::{ret, ret_owned_fd}; -use crate::fd::{AsFd, AsRawFd, OwnedFd}; -use crate::io; -use crate::utils::as_mut_ptr; -#[cfg(feature = "alloc")] -use alloc::vec::Vec; -use bitflags::bitflags; -use core::ffi::c_void; -use core::hash::{Hash, Hasher}; -use core::ptr::null_mut; -use core::slice; - -bitflags! { - /// `EPOLL_*` for use with [`new`]. - #[repr(transparent)] - #[derive(Copy, Clone, Eq, PartialEq, Hash, Debug)] - pub struct CreateFlags: u32 { - /// `EPOLL_CLOEXEC` - const CLOEXEC = bitcast!(c::EPOLL_CLOEXEC); - - /// <https://docs.rs/bitflags/*/bitflags/#externally-defined-flags> - const _ = !0; - } -} - -bitflags! { - /// `EPOLL*` for use with [`add`]. - #[repr(transparent)] - #[derive(Default, Copy, Clone, Eq, PartialEq, Hash, Debug)] - pub struct EventFlags: u32 { - /// `EPOLLIN` - const IN = bitcast!(c::EPOLLIN); - - /// `EPOLLOUT` - const OUT = bitcast!(c::EPOLLOUT); - - /// `EPOLLPRI` - const PRI = bitcast!(c::EPOLLPRI); - - /// `EPOLLERR` - const ERR = bitcast!(c::EPOLLERR); - - /// `EPOLLHUP` - const HUP = bitcast!(c::EPOLLHUP); - - /// `EPOLLRDNORM` - const RDNORM = bitcast!(c::EPOLLRDNORM); - - /// `EPOLLRDBAND` - const RDBAND = bitcast!(c::EPOLLRDBAND); - - /// `EPOLLWRNORM` - const WRNORM = bitcast!(c::EPOLLWRNORM); - - /// `EPOLLWRBAND` - const WRBAND = bitcast!(c::EPOLLWRBAND); - - /// `EPOLLMSG` - const MSG = bitcast!(c::EPOLLMSG); - - /// `EPOLLRDHUP` - const RDHUP = bitcast!(c::EPOLLRDHUP); - - /// `EPOLLET` - const ET = bitcast!(c::EPOLLET); - - /// `EPOLLONESHOT` - const ONESHOT = bitcast!(c::EPOLLONESHOT); - - /// `EPOLLWAKEUP` - const WAKEUP = bitcast!(c::EPOLLWAKEUP); - - /// `EPOLLEXCLUSIVE` - #[cfg(not(target_os = "android"))] - const EXCLUSIVE = bitcast!(c::EPOLLEXCLUSIVE); - - /// <https://docs.rs/bitflags/*/bitflags/#externally-defined-flags> - const _ = !0; - } -} - -/// `epoll_create1(flags)`—Creates a new epoll object. -/// -/// Use the [`CreateFlags::CLOEXEC`] flag to prevent the resulting file -/// descriptor from being implicitly passed across `exec` boundaries. -#[inline] -#[doc(alias = "epoll_create1")] -pub fn create(flags: CreateFlags) -> io::Result<OwnedFd> { - // SAFETY: We're calling `epoll_create1` via FFI and we know how it - // behaves. - unsafe { ret_owned_fd(c::epoll_create1(bitflags_bits!(flags))) } -} - -/// `epoll_ctl(self, EPOLL_CTL_ADD, data, event)`—Adds an element to an epoll -/// object. -/// -/// This registers interest in any of the events set in `events` occurring on -/// the file descriptor associated with `data`. -/// -/// If [`delete`] is not called on the I/O source passed into this function -/// before the I/O source is `close`d, then the `epoll` will act as if the I/O -/// source is still registered with it. This can lead to spurious events being -/// returned from [`wait`]. If a file descriptor is an -/// `Arc<dyn SystemResource>`, then `epoll` can be thought to maintain a -/// `Weak<dyn SystemResource>` to the file descriptor. -#[doc(alias = "epoll_ctl")] -pub fn add( - epoll: impl AsFd, - source: impl AsFd, - data: EventData, - event_flags: EventFlags, -) -> io::Result<()> { - // SAFETY: We're calling `epoll_ctl` via FFI and we know how it - // behaves. We use our own `Event` struct instead of libc's because - // ours preserves pointer provenance instead of just using a `u64`, - // and we have tests elsehwere for layout equivalence. - unsafe { - let raw_fd = source.as_fd().as_raw_fd(); - ret(c::epoll_ctl( - epoll.as_fd().as_raw_fd(), - c::EPOLL_CTL_ADD, - raw_fd, - as_mut_ptr(&mut Event { - flags: event_flags, - data, - }) - .cast(), - )) - } -} - -/// `epoll_ctl(self, EPOLL_CTL_MOD, target, event)`—Modifies an element in a -/// given epoll object. -/// -/// This sets the events of interest with `target` to `events`. -#[doc(alias = "epoll_ctl")] -pub fn modify( - epoll: impl AsFd, - source: impl AsFd, - data: EventData, - event_flags: EventFlags, -) -> io::Result<()> { - let raw_fd = source.as_fd().as_raw_fd(); - - // SAFETY: We're calling `epoll_ctl` via FFI and we know how it - // behaves. We use our own `Event` struct instead of libc's because - // ours preserves pointer provenance instead of just using a `u64`, - // and we have tests elsehwere for layout equivalence. - unsafe { - ret(c::epoll_ctl( - epoll.as_fd().as_raw_fd(), - c::EPOLL_CTL_MOD, - raw_fd, - as_mut_ptr(&mut Event { - flags: event_flags, - data, - }) - .cast(), - )) - } -} - -/// `epoll_ctl(self, EPOLL_CTL_DEL, target, NULL)`—Removes an element in a -/// given epoll object. -#[doc(alias = "epoll_ctl")] -pub fn delete(epoll: impl AsFd, source: impl AsFd) -> io::Result<()> { - // SAFETY: We're calling `epoll_ctl` via FFI and we know how it - // behaves. - unsafe { - let raw_fd = source.as_fd().as_raw_fd(); - ret(c::epoll_ctl( - epoll.as_fd().as_raw_fd(), - c::EPOLL_CTL_DEL, - raw_fd, - null_mut(), - )) - } -} - -/// `epoll_wait(self, events, timeout)`—Waits for registered events of -/// interest. -/// -/// For each event of interest, an element is written to `events`. On -/// success, this returns the number of written elements. -#[cfg(feature = "alloc")] -#[cfg_attr(doc_cfg, doc(cfg(feature = "alloc")))] -pub fn wait(epoll: impl AsFd, event_list: &mut EventVec, timeout: c::c_int) -> io::Result<()> { - // SAFETY: We're calling `epoll_wait` via FFI and we know how it - // behaves. - unsafe { - event_list.events.set_len(0); - let nfds = ret_u32(c::epoll_wait( - epoll.as_fd().as_raw_fd(), - event_list.events.as_mut_ptr().cast::<c::epoll_event>(), - event_list.events.capacity().try_into().unwrap_or(i32::MAX), - timeout, - ))?; - event_list.events.set_len(nfds as usize); - } - - Ok(()) -} - -/// An iterator over the `Event`s in an `EventVec`. -pub struct Iter<'a> { - /// Use `Copied` to copy the struct, since `Event` is `packed` on some - /// platforms, and it's common for users to directly destructure it, which - /// would lead to errors about forming references to packed fields. - iter: core::iter::Copied<slice::Iter<'a, Event>>, -} - -impl<'a> Iterator for Iter<'a> { - type Item = Event; - - #[inline] - fn next(&mut self) -> Option<Self::Item> { - self.iter.next() - } -} - -/// A record of an event that occurred. -#[repr(C)] -#[cfg_attr( - any( - all( - target_arch = "x86", - not(target_env = "musl"), - not(target_os = "android"), - ), - target_arch = "x86_64", - ), - repr(packed) -)] -#[derive(Copy, Clone, Eq, PartialEq, Hash)] -pub struct Event { - /// Which specific event(s) occurred. - pub flags: EventFlags, - /// User data. - pub data: EventData, -} - -/// Data associated with an [`Event`]. This can either be a 64-bit integer -/// value or a pointer which preserves pointer provenance. -#[repr(C)] -#[derive(Copy, Clone)] -pub union EventData { - /// A 64-bit integer value. - as_u64: u64, - - /// A `*mut c_void` which preserves pointer provenance, extended to be - /// 64-bit so that if we read the value as a `u64` union field, we don't - /// get uninitialized memory. - sixty_four_bit_pointer: SixtyFourBitPointer, -} - -impl EventData { - /// Construct a new value containing a `u64`. - #[inline] - pub const fn new_u64(value: u64) -> Self { - Self { as_u64: value } - } - - /// Construct a new value containing a `*mut c_void`. - #[inline] - pub const fn new_ptr(value: *mut c_void) -> Self { - Self { - sixty_four_bit_pointer: SixtyFourBitPointer { - pointer: value, - #[cfg(target_pointer_width = "32")] - _padding: 0, - }, - } - } - - /// Return the value as a `u64`. - /// - /// If the stored value was a pointer, the pointer is zero-extended to a - /// `u64`. - #[inline] - pub fn u64(self) -> u64 { - unsafe { self.as_u64 } - } - - /// Return the value as a `*mut c_void`. - /// - /// If the stored value was a `u64`, the least-significant bits of the - /// `u64` are returned as a pointer value. - #[inline] - pub fn ptr(self) -> *mut c_void { - unsafe { self.sixty_four_bit_pointer.pointer } - } -} - -impl PartialEq for EventData { - #[inline] - fn eq(&self, other: &Self) -> bool { - self.u64() == other.u64() - } -} - -impl Eq for EventData {} - -impl Hash for EventData { - #[inline] - fn hash<H: Hasher>(&self, state: &mut H) { - self.u64().hash(state) - } -} - -#[repr(C)] -#[derive(Copy, Clone)] -struct SixtyFourBitPointer { - #[cfg(target_endian = "big")] - #[cfg(target_pointer_width = "32")] - _padding: u32, - - pointer: *mut c_void, - - #[cfg(target_endian = "little")] - #[cfg(target_pointer_width = "32")] - _padding: u32, -} - -/// A vector of `Event`s, plus context for interpreting them. -#[cfg(feature = "alloc")] -pub struct EventVec { - events: Vec<Event>, -} - -#[cfg(feature = "alloc")] -impl EventVec { - /// Constructs an `EventVec` from raw pointer, length, and capacity. - /// - /// # Safety - /// - /// This function calls [`Vec::from_raw_parts`] with its arguments. - /// - /// [`Vec::from_raw_parts`]: https://doc.rust-lang.org/stable/std/vec/struct.Vec.html#method.from_raw_parts - #[inline] - pub unsafe fn from_raw_parts(ptr: *mut Event, len: usize, capacity: usize) -> Self { - Self { - events: Vec::from_raw_parts(ptr, len, capacity), - } - } - - /// Constructs an `EventVec` with memory for `capacity` `Event`s. - #[inline] - pub fn with_capacity(capacity: usize) -> Self { - Self { - events: Vec::with_capacity(capacity), - } - } - - /// Returns the current `Event` capacity of this `EventVec`. - #[inline] - pub fn capacity(&self) -> usize { - self.events.capacity() - } - - /// Reserves enough memory for at least `additional` more `Event`s. - #[inline] - pub fn reserve(&mut self, additional: usize) { - self.events.reserve(additional); - } - - /// Reserves enough memory for exactly `additional` more `Event`s. - #[inline] - pub fn reserve_exact(&mut self, additional: usize) { - self.events.reserve_exact(additional); - } - - /// Clears all the `Events` out of this `EventVec`. - #[inline] - pub fn clear(&mut self) { - self.events.clear(); - } - - /// Shrinks the capacity of this `EventVec` as much as possible. - #[inline] - pub fn shrink_to_fit(&mut self) { - self.events.shrink_to_fit(); - } - - /// Returns an iterator over the `Event`s in this `EventVec`. - #[inline] - pub fn iter(&self) -> Iter<'_> { - Iter { - iter: self.events.iter().copied(), - } - } - - /// Returns the number of `Event`s logically contained in this `EventVec`. - #[inline] - pub fn len(&mut self) -> usize { - self.events.len() - } - - /// Tests whether this `EventVec` is logically empty. - #[inline] - pub fn is_empty(&mut self) -> bool { - self.events.is_empty() - } -} - -#[cfg(feature = "alloc")] -impl<'a> IntoIterator for &'a EventVec { - type IntoIter = Iter<'a>; - type Item = Event; - - #[inline] - fn into_iter(self) -> Self::IntoIter { - self.iter() - } -} - -#[test] -fn test_epoll_layouts() { - check_renamed_type!(Event, epoll_event); - check_renamed_type!(Event, epoll_event); - check_renamed_struct_renamed_field!(Event, epoll_event, flags, events); - check_renamed_struct_renamed_field!(Event, epoll_event, data, u64); -} diff --git a/vendor/rustix/src/backend/libc/event/mod.rs b/vendor/rustix/src/backend/libc/event/mod.rs deleted file mode 100644 index 6aed461..0000000 --- a/vendor/rustix/src/backend/libc/event/mod.rs +++ /dev/null @@ -1,9 +0,0 @@ -pub(crate) mod poll_fd; -#[cfg(not(windows))] -pub(crate) mod types; - -#[cfg_attr(windows, path = "windows_syscalls.rs")] -pub(crate) mod syscalls; - -#[cfg(linux_kernel)] -pub mod epoll; diff --git a/vendor/rustix/src/backend/libc/event/poll_fd.rs b/vendor/rustix/src/backend/libc/event/poll_fd.rs deleted file mode 100644 index 32fd83d..0000000 --- a/vendor/rustix/src/backend/libc/event/poll_fd.rs +++ /dev/null @@ -1,142 +0,0 @@ -use crate::backend::c; -use crate::backend::conv::borrowed_fd; -use crate::backend::fd::{AsFd, AsRawFd, BorrowedFd, LibcFd}; -use bitflags::bitflags; -use core::marker::PhantomData; -#[cfg(windows)] -use { - crate::backend::fd::{AsSocket, RawFd}, - core::fmt, -}; - -bitflags! { - /// `POLL*` flags for use with [`poll`]. - /// - /// [`poll`]: crate::event::poll - #[repr(transparent)] - #[derive(Copy, Clone, Eq, PartialEq, Hash, Debug)] - pub struct PollFlags: c::c_short { - /// `POLLIN` - const IN = c::POLLIN; - /// `POLLPRI` - #[cfg(not(target_os = "wasi"))] - const PRI = c::POLLPRI; - /// `POLLOUT` - const OUT = c::POLLOUT; - /// `POLLRDNORM` - const RDNORM = c::POLLRDNORM; - /// `POLLWRNORM` - #[cfg(not(target_os = "l4re"))] - const WRNORM = c::POLLWRNORM; - /// `POLLRDBAND` - #[cfg(not(any(target_os = "l4re", target_os = "wasi")))] - const RDBAND = c::POLLRDBAND; - /// `POLLWRBAND` - #[cfg(not(any(target_os = "l4re", target_os = "wasi")))] - const WRBAND = c::POLLWRBAND; - /// `POLLERR` - const ERR = c::POLLERR; - /// `POLLHUP` - const HUP = c::POLLHUP; - /// `POLLNVAL` - #[cfg(not(target_os = "espidf"))] - const NVAL = c::POLLNVAL; - /// `POLLRDHUP` - #[cfg(all( - linux_kernel, - not(any(target_arch = "sparc", target_arch = "sparc64"))), - )] - const RDHUP = c::POLLRDHUP; - - /// <https://docs.rs/bitflags/*/bitflags/#externally-defined-flags> - const _ = !0; - } -} - -/// `struct pollfd`—File descriptor and flags for use with [`poll`]. -/// -/// [`poll`]: crate::event::poll -#[doc(alias = "pollfd")] -#[derive(Clone)] -#[cfg_attr(not(windows), derive(Debug))] -#[repr(transparent)] -pub struct PollFd<'fd> { - pollfd: c::pollfd, - _phantom: PhantomData<BorrowedFd<'fd>>, -} - -#[cfg(windows)] -impl<'fd> fmt::Debug for PollFd<'fd> { - fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result { - fmt.debug_struct("pollfd") - .field("fd", &self.pollfd.fd) - .field("events", &self.pollfd.events) - .field("revents", &self.pollfd.revents) - .finish() - } -} - -impl<'fd> PollFd<'fd> { - /// Constructs a new `PollFd` holding `fd` and `events`. - #[inline] - pub fn new<Fd: AsFd>(fd: &'fd Fd, events: PollFlags) -> Self { - Self::from_borrowed_fd(fd.as_fd(), events) - } - - /// Sets the contained file descriptor to `fd`. - #[inline] - pub fn set_fd<Fd: AsFd>(&mut self, fd: &'fd Fd) { - self.pollfd.fd = fd.as_fd().as_raw_fd() as LibcFd; - } - - /// Clears the ready events. - #[inline] - pub fn clear_revents(&mut self) { - self.pollfd.revents = 0; - } - - /// Constructs a new `PollFd` holding `fd` and `events`. - /// - /// This is the same as `new`, but can be used to avoid borrowing the - /// `BorrowedFd`, which can be tricky in situations where the `BorrowedFd` - /// is a temporary. - #[inline] - pub fn from_borrowed_fd(fd: BorrowedFd<'fd>, events: PollFlags) -> Self { - Self { - pollfd: c::pollfd { - fd: borrowed_fd(fd), - events: events.bits(), - revents: 0, - }, - _phantom: PhantomData, - } - } - - /// Returns the ready events. - #[inline] - pub fn revents(&self) -> PollFlags { - // Use `.unwrap()` here because in theory we know we know all the bits - // the OS might set here, but OS's have added extensions in the past. - PollFlags::from_bits(self.pollfd.revents).unwrap() - } -} - -#[cfg(not(windows))] -impl<'fd> AsFd for PollFd<'fd> { - #[inline] - fn as_fd(&self) -> BorrowedFd<'_> { - // SAFETY: Our constructors and `set_fd` require `pollfd.fd` to be - // valid for the `'fd` lifetime. - unsafe { BorrowedFd::borrow_raw(self.pollfd.fd) } - } -} - -#[cfg(windows)] -impl<'fd> AsSocket for PollFd<'fd> { - #[inline] - fn as_socket(&self) -> BorrowedFd<'_> { - // SAFETY: Our constructors and `set_fd` require `pollfd.fd` to be - // valid for the `'fd` lifetime. - unsafe { BorrowedFd::borrow_raw(self.pollfd.fd as RawFd) } - } -} diff --git a/vendor/rustix/src/backend/libc/event/syscalls.rs b/vendor/rustix/src/backend/libc/event/syscalls.rs deleted file mode 100644 index 725ec82..0000000 --- a/vendor/rustix/src/backend/libc/event/syscalls.rs +++ /dev/null @@ -1,191 +0,0 @@ -//! libc syscalls supporting `rustix::event`. - -use crate::backend::c; -use crate::backend::conv::ret_c_int; -#[cfg(any(apple, netbsdlike, target_os = "dragonfly", target_os = "solaris"))] -use crate::backend::conv::ret_owned_fd; -use crate::event::PollFd; -#[cfg(any(linux_kernel, bsd, solarish, target_os = "espidf"))] -use crate::fd::OwnedFd; -use crate::io; -#[cfg(any(bsd, solarish))] -use {crate::backend::conv::borrowed_fd, crate::fd::BorrowedFd, core::mem::MaybeUninit}; -#[cfg(solarish)] -use { - crate::backend::conv::ret, crate::event::port::Event, crate::utils::as_mut_ptr, - core::ptr::null_mut, -}; -#[cfg(any( - linux_kernel, - target_os = "freebsd", - target_os = "illumos", - target_os = "espidf" -))] -use {crate::backend::conv::ret_owned_fd, crate::event::EventfdFlags}; -#[cfg(all(feature = "alloc", bsd))] -use {crate::event::kqueue::Event, crate::utils::as_ptr, core::ptr::null}; - -#[cfg(any( - linux_kernel, - target_os = "freebsd", - target_os = "illumos", - target_os = "espidf" -))] -pub(crate) fn eventfd(initval: u32, flags: EventfdFlags) -> io::Result<OwnedFd> { - #[cfg(linux_kernel)] - unsafe { - syscall! { - fn eventfd2( - initval: c::c_uint, - flags: c::c_int - ) via SYS_eventfd2 -> c::c_int - } - ret_owned_fd(eventfd2(initval, bitflags_bits!(flags))) - } - - // `eventfd` was added in FreeBSD 13, so it isn't available on FreeBSD 12. - #[cfg(target_os = "freebsd")] - unsafe { - weakcall! { - fn eventfd( - initval: c::c_uint, - flags: c::c_int - ) -> c::c_int - } - ret_owned_fd(eventfd(initval, bitflags_bits!(flags))) - } - - #[cfg(any(target_os = "illumos", target_os = "espidf"))] - unsafe { - ret_owned_fd(c::eventfd(initval, bitflags_bits!(flags))) - } -} - -#[cfg(all(feature = "alloc", bsd))] -pub(crate) fn kqueue() -> io::Result<OwnedFd> { - unsafe { ret_owned_fd(c::kqueue()) } -} - -#[cfg(all(feature = "alloc", bsd))] -pub(crate) unsafe fn kevent( - kq: BorrowedFd<'_>, - changelist: &[Event], - eventlist: &mut [MaybeUninit<Event>], - timeout: Option<&c::timespec>, -) -> io::Result<c::c_int> { - ret_c_int(c::kevent( - borrowed_fd(kq), - changelist.as_ptr().cast(), - changelist - .len() - .try_into() - .map_err(|_| io::Errno::OVERFLOW)?, - eventlist.as_mut_ptr().cast(), - eventlist - .len() - .try_into() - .map_err(|_| io::Errno::OVERFLOW)?, - timeout.map_or(null(), as_ptr), - )) -} - -#[inline] -pub(crate) fn poll(fds: &mut [PollFd<'_>], timeout: c::c_int) -> io::Result<usize> { - let nfds = fds - .len() - .try_into() - .map_err(|_convert_err| io::Errno::INVAL)?; - - ret_c_int(unsafe { c::poll(fds.as_mut_ptr().cast(), nfds, timeout) }) - .map(|nready| nready as usize) -} - -#[cfg(solarish)] -pub(crate) fn port_create() -> io::Result<OwnedFd> { - unsafe { ret_owned_fd(c::port_create()) } -} - -#[cfg(solarish)] -pub(crate) unsafe fn port_associate( - port: BorrowedFd<'_>, - source: c::c_int, - object: c::uintptr_t, - events: c::c_int, - user: *mut c::c_void, -) -> io::Result<()> { - ret(c::port_associate( - borrowed_fd(port), - source, - object, - events, - user, - )) -} - -#[cfg(solarish)] -pub(crate) unsafe fn port_dissociate( - port: BorrowedFd<'_>, - source: c::c_int, - object: c::uintptr_t, -) -> io::Result<()> { - ret(c::port_dissociate(borrowed_fd(port), source, object)) -} - -#[cfg(solarish)] -pub(crate) fn port_get( - port: BorrowedFd<'_>, - timeout: Option<&mut c::timespec>, -) -> io::Result<Event> { - let mut event = MaybeUninit::<c::port_event>::uninit(); - let timeout = timeout.map_or(null_mut(), as_mut_ptr); - - unsafe { - ret(c::port_get(borrowed_fd(port), event.as_mut_ptr(), timeout))?; - } - - // If we're done, initialize the event and return it. - Ok(Event(unsafe { event.assume_init() })) -} - -#[cfg(all(feature = "alloc", solarish))] -pub(crate) fn port_getn( - port: BorrowedFd<'_>, - timeout: Option<&mut c::timespec>, - events: &mut Vec<Event>, - mut nget: u32, -) -> io::Result<()> { - let timeout = timeout.map_or(null_mut(), as_mut_ptr); - unsafe { - ret(c::port_getn( - borrowed_fd(port), - events.as_mut_ptr().cast(), - events.len().try_into().unwrap(), - &mut nget, - timeout, - ))?; - } - - // Update the vector length. - unsafe { - events.set_len(nget.try_into().unwrap()); - } - - Ok(()) -} - -#[cfg(solarish)] -pub(crate) fn port_send( - port: BorrowedFd<'_>, - events: c::c_int, - userdata: *mut c::c_void, -) -> io::Result<()> { - unsafe { ret(c::port_send(borrowed_fd(port), events, userdata)) } -} - -#[cfg(not(any(windows, target_os = "redox", target_os = "wasi")))] -pub(crate) fn pause() { - let r = unsafe { libc::pause() }; - let errno = libc_errno::errno().0; - debug_assert_eq!(r, -1); - debug_assert_eq!(errno, libc::EINTR); -} diff --git a/vendor/rustix/src/backend/libc/event/types.rs b/vendor/rustix/src/backend/libc/event/types.rs deleted file mode 100644 index a04d7e6..0000000 --- a/vendor/rustix/src/backend/libc/event/types.rs +++ /dev/null @@ -1,37 +0,0 @@ -#[cfg(any(linux_kernel, target_os = "freebsd", target_os = "illumos"))] -use crate::backend::c; -#[cfg(any( - linux_kernel, - target_os = "freebsd", - target_os = "illumos", - target_os = "espidf" -))] -use bitflags::bitflags; - -#[cfg(any( - linux_kernel, - target_os = "freebsd", - target_os = "illumos", - target_os = "espidf" -))] -bitflags! { - /// `EFD_*` flags for use with [`eventfd`]. - /// - /// [`eventfd`]: crate::event::eventfd - #[repr(transparent)] - #[derive(Copy, Clone, Eq, PartialEq, Hash, Debug)] - pub struct EventfdFlags: u32 { - /// `EFD_CLOEXEC` - #[cfg(not(target_os = "espidf"))] - const CLOEXEC = bitcast!(c::EFD_CLOEXEC); - /// `EFD_NONBLOCK` - #[cfg(not(target_os = "espidf"))] - const NONBLOCK = bitcast!(c::EFD_NONBLOCK); - /// `EFD_SEMAPHORE` - #[cfg(not(target_os = "espidf"))] - const SEMAPHORE = bitcast!(c::EFD_SEMAPHORE); - - /// <https://docs.rs/bitflags/*/bitflags/#externally-defined-flags> - const _ = !0; - } -} diff --git a/vendor/rustix/src/backend/libc/event/windows_syscalls.rs b/vendor/rustix/src/backend/libc/event/windows_syscalls.rs deleted file mode 100644 index 8ccad47..0000000 --- a/vendor/rustix/src/backend/libc/event/windows_syscalls.rs +++ /dev/null @@ -1,16 +0,0 @@ -//! Windows system calls in the `event` module. - -use crate::backend::c; -use crate::backend::conv::ret_c_int; -use crate::event::PollFd; -use crate::io; - -pub(crate) fn poll(fds: &mut [PollFd<'_>], timeout: c::c_int) -> io::Result<usize> { - let nfds = fds - .len() - .try_into() - .map_err(|_convert_err| io::Errno::INVAL)?; - - ret_c_int(unsafe { c::poll(fds.as_mut_ptr().cast(), nfds, timeout) }) - .map(|nready| nready as usize) -} diff --git a/vendor/rustix/src/backend/libc/fs/dir.rs b/vendor/rustix/src/backend/libc/fs/dir.rs deleted file mode 100644 index 82a0a90..0000000 --- a/vendor/rustix/src/backend/libc/fs/dir.rs +++ /dev/null @@ -1,423 +0,0 @@ -#[cfg(not(any(solarish, target_os = "haiku", target_os = "nto", target_os = "vita")))] -use super::types::FileType; -use crate::backend::c; -use crate::backend::conv::owned_fd; -use crate::fd::{AsFd, BorrowedFd, OwnedFd}; -use crate::ffi::{CStr, CString}; -use crate::fs::{fcntl_getfl, openat, Mode, OFlags}; -#[cfg(not(target_os = "vita"))] -use crate::fs::{fstat, Stat}; -#[cfg(not(any( - solarish, - target_os = "haiku", - target_os = "netbsd", - target_os = "nto", - target_os = "redox", - target_os = "vita", - target_os = "wasi", -)))] -use crate::fs::{fstatfs, StatFs}; -#[cfg(not(any( - solarish, - target_os = "haiku", - target_os = "redox", - target_os = "vita", - target_os = "wasi" -)))] -use crate::fs::{fstatvfs, StatVfs}; -use crate::io; -#[cfg(not(any(target_os = "fuchsia", target_os = "vita", target_os = "wasi")))] -#[cfg(feature = "process")] -use crate::process::fchdir; -use alloc::borrow::ToOwned; -#[cfg(not(any(linux_like, target_os = "hurd")))] -use c::readdir as libc_readdir; -#[cfg(any(linux_like, target_os = "hurd"))] -use c::readdir64 as libc_readdir; -use core::fmt; -use core::ptr::NonNull; -use libc_errno::{errno, set_errno, Errno}; - -/// `DIR*` -pub struct Dir { - /// The `libc` `DIR` pointer. - libc_dir: NonNull<c::DIR>, - - /// Have we seen any errors in this iteration? - any_errors: bool, -} - -impl Dir { - /// Take ownership of `fd` and construct a `Dir` that reads entries from - /// the given directory file descriptor. - #[inline] - pub fn new<Fd: Into<OwnedFd>>(fd: Fd) -> io::Result<Self> { - Self::_new(fd.into()) - } - - #[inline] - fn _new(fd: OwnedFd) -> io::Result<Self> { - let raw = owned_fd(fd); - unsafe { - let libc_dir = c::fdopendir(raw); - - if let Some(libc_dir) = NonNull::new(libc_dir) { - Ok(Self { - libc_dir, - any_errors: false, - }) - } else { - let err = io::Errno::last_os_error(); - let _ = c::close(raw); - Err(err) - } - } - } - - /// Borrow `fd` and construct a `Dir` that reads entries from the given - /// directory file descriptor. - #[inline] - pub fn read_from<Fd: AsFd>(fd: Fd) -> io::Result<Self> { - Self::_read_from(fd.as_fd()) - } - - #[inline] - #[allow(unused_mut)] - fn _read_from(fd: BorrowedFd<'_>) -> io::Result<Self> { - let mut any_errors = false; - - // Given an arbitrary `OwnedFd`, it's impossible to know whether the - // user holds a `dup`'d copy which could continue to modify the - // file description state, which would cause Undefined Behavior after - // our call to `fdopendir`. To prevent this, we obtain an independent - // `OwnedFd`. - let flags = fcntl_getfl(fd)?; - let fd_for_dir = match openat(fd, cstr!("."), flags | OFlags::CLOEXEC, Mode::empty()) { - Ok(fd) => fd, - #[cfg(not(target_os = "wasi"))] - Err(io::Errno::NOENT) => { - // If "." doesn't exist, it means the directory was removed. - // We treat that as iterating through a directory with no - // entries. - any_errors = true; - crate::io::dup(fd)? - } - Err(err) => return Err(err), - }; - - let raw = owned_fd(fd_for_dir); - unsafe { - let libc_dir = c::fdopendir(raw); - - if let Some(libc_dir) = NonNull::new(libc_dir) { - Ok(Self { - libc_dir, - any_errors, - }) - } else { - let err = io::Errno::last_os_error(); - let _ = c::close(raw); - Err(err) - } - } - } - - /// `rewinddir(self)` - #[inline] - pub fn rewind(&mut self) { - self.any_errors = false; - unsafe { c::rewinddir(self.libc_dir.as_ptr()) } - } - - /// `readdir(self)`, where `None` means the end of the directory. - pub fn read(&mut self) -> Option<io::Result<DirEntry>> { - // If we've seen errors, don't continue to try to read anyting further. - if self.any_errors { - return None; - } - - set_errno(Errno(0)); - let dirent_ptr = unsafe { libc_readdir(self.libc_dir.as_ptr()) }; - if dirent_ptr.is_null() { - let curr_errno = errno().0; - if curr_errno == 0 { - // We successfully reached the end of the stream. - None - } else { - // `errno` is unknown or non-zero, so an error occurred. - self.any_errors = true; - Some(Err(io::Errno(curr_errno))) - } - } else { - // We successfully read an entry. - unsafe { - let dirent = &*dirent_ptr; - - // We have our own copy of OpenBSD's dirent; check that the - // layout minimally matches libc's. - #[cfg(target_os = "openbsd")] - check_dirent_layout(dirent); - - let result = DirEntry { - #[cfg(not(any( - solarish, - target_os = "aix", - target_os = "haiku", - target_os = "nto", - target_os = "vita" - )))] - d_type: dirent.d_type, - - #[cfg(not(any(freebsdlike, netbsdlike, target_os = "vita")))] - d_ino: dirent.d_ino, - - #[cfg(any(freebsdlike, netbsdlike))] - d_fileno: dirent.d_fileno, - - name: CStr::from_ptr(dirent.d_name.as_ptr()).to_owned(), - }; - - Some(Ok(result)) - } - } - } - - /// `fstat(self)` - #[cfg(not(target_os = "vita"))] - #[inline] - pub fn stat(&self) -> io::Result<Stat> { - fstat(unsafe { BorrowedFd::borrow_raw(c::dirfd(self.libc_dir.as_ptr())) }) - } - - /// `fstatfs(self)` - #[cfg(not(any( - solarish, - target_os = "haiku", - target_os = "netbsd", - target_os = "nto", - target_os = "redox", - target_os = "vita", - target_os = "wasi", - )))] - #[inline] - pub fn statfs(&self) -> io::Result<StatFs> { - fstatfs(unsafe { BorrowedFd::borrow_raw(c::dirfd(self.libc_dir.as_ptr())) }) - } - - /// `fstatvfs(self)` - #[cfg(not(any( - solarish, - target_os = "haiku", - target_os = "redox", - target_os = "vita", - target_os = "wasi" - )))] - #[inline] - pub fn statvfs(&self) -> io::Result<StatVfs> { - fstatvfs(unsafe { BorrowedFd::borrow_raw(c::dirfd(self.libc_dir.as_ptr())) }) - } - - /// `fchdir(self)` - #[cfg(feature = "process")] - #[cfg(not(any(target_os = "fuchsia", target_os = "vita", target_os = "wasi")))] - #[cfg_attr(doc_cfg, doc(cfg(feature = "process")))] - #[inline] - pub fn chdir(&self) -> io::Result<()> { - fchdir(unsafe { BorrowedFd::borrow_raw(c::dirfd(self.libc_dir.as_ptr())) }) - } -} - -/// `Dir` implements `Send` but not `Sync`, because we use `readdir` which is -/// not guaranteed to be thread-safe. Users can wrap this in a `Mutex` if they -/// need `Sync`, which is effectively what'd need to do to implement `Sync` -/// ourselves. -unsafe impl Send for Dir {} - -impl Drop for Dir { - #[inline] - fn drop(&mut self) { - unsafe { c::closedir(self.libc_dir.as_ptr()) }; - } -} - -impl Iterator for Dir { - type Item = io::Result<DirEntry>; - - #[inline] - fn next(&mut self) -> Option<Self::Item> { - Self::read(self) - } -} - -impl fmt::Debug for Dir { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - let mut s = f.debug_struct("Dir"); - #[cfg(not(target_os = "vita"))] - s.field("fd", unsafe { &c::dirfd(self.libc_dir.as_ptr()) }); - s.finish() - } -} - -/// `struct dirent` -#[derive(Debug)] -pub struct DirEntry { - #[cfg(not(any( - solarish, - target_os = "aix", - target_os = "haiku", - target_os = "nto", - target_os = "vita" - )))] - d_type: u8, - - #[cfg(not(any(freebsdlike, netbsdlike, target_os = "vita")))] - d_ino: c::ino_t, - - #[cfg(any(freebsdlike, netbsdlike))] - d_fileno: c::ino_t, - - name: CString, -} - -impl DirEntry { - /// Returns the file name of this directory entry. - #[inline] - pub fn file_name(&self) -> &CStr { - &self.name - } - - /// Returns the type of this directory entry. - #[cfg(not(any( - solarish, - target_os = "aix", - target_os = "haiku", - target_os = "nto", - target_os = "vita" - )))] - #[inline] - pub fn file_type(&self) -> FileType { - FileType::from_dirent_d_type(self.d_type) - } - - /// Return the inode number of this directory entry. - #[cfg(not(any(freebsdlike, netbsdlike, target_os = "vita")))] - #[inline] - pub fn ino(&self) -> u64 { - self.d_ino as u64 - } - - /// Return the inode number of this directory entry. - #[cfg(any(freebsdlike, netbsdlike))] - #[inline] - pub fn ino(&self) -> u64 { - #[allow(clippy::useless_conversion)] - self.d_fileno.into() - } -} - -/// libc's OpenBSD `dirent` has a private field so we can't construct it -/// directly, so we declare it ourselves to make all fields accessible. -#[cfg(target_os = "openbsd")] -#[repr(C)] -#[derive(Debug)] -struct libc_dirent { - d_fileno: c::ino_t, - d_off: c::off_t, - d_reclen: u16, - d_type: u8, - d_namlen: u8, - __d_padding: [u8; 4], - d_name: [c::c_char; 256], -} - -/// We have our own copy of OpenBSD's dirent; check that the layout -/// minimally matches libc's. -#[cfg(target_os = "openbsd")] -fn check_dirent_layout(dirent: &c::dirent) { - use crate::utils::as_ptr; - - // Check that the basic layouts match. - #[cfg(test)] - { - assert_eq_size!(libc_dirent, c::dirent); - assert_eq_size!(libc_dirent, c::dirent); - } - - // Check that the field offsets match. - assert_eq!( - { - let z = libc_dirent { - d_fileno: 0_u64, - d_off: 0_i64, - d_reclen: 0_u16, - d_type: 0_u8, - d_namlen: 0_u8, - __d_padding: [0_u8; 4], - d_name: [0 as c::c_char; 256], - }; - let base = as_ptr(&z) as usize; - ( - (as_ptr(&z.d_fileno) as usize) - base, - (as_ptr(&z.d_off) as usize) - base, - (as_ptr(&z.d_reclen) as usize) - base, - (as_ptr(&z.d_type) as usize) - base, - (as_ptr(&z.d_namlen) as usize) - base, - (as_ptr(&z.d_name) as usize) - base, - ) - }, - { - let z = dirent; - let base = as_ptr(z) as usize; - ( - (as_ptr(&z.d_fileno) as usize) - base, - (as_ptr(&z.d_off) as usize) - base, - (as_ptr(&z.d_reclen) as usize) - base, - (as_ptr(&z.d_type) as usize) - base, - (as_ptr(&z.d_namlen) as usize) - base, - (as_ptr(&z.d_name) as usize) - base, - ) - } - ); -} - -#[test] -fn dir_iterator_handles_io_errors() { - // create a dir, keep the FD, then delete the dir - let tmp = tempfile::tempdir().unwrap(); - let fd = crate::fs::openat( - crate::fs::CWD, - tmp.path(), - crate::fs::OFlags::RDONLY | crate::fs::OFlags::CLOEXEC, - crate::fs::Mode::empty(), - ) - .unwrap(); - - let file_fd = crate::fs::openat( - &fd, - tmp.path().join("test.txt"), - crate::fs::OFlags::WRONLY | crate::fs::OFlags::CREATE, - crate::fs::Mode::RWXU, - ) - .unwrap(); - - let mut dir = Dir::read_from(&fd).unwrap(); - - // Reach inside the `Dir` and replace its directory with a file, which - // will cause the subsequent `readdir` to fail. - unsafe { - let raw_fd = c::dirfd(dir.libc_dir.as_ptr()); - let mut owned_fd: crate::fd::OwnedFd = crate::fd::FromRawFd::from_raw_fd(raw_fd); - crate::io::dup2(&file_fd, &mut owned_fd).unwrap(); - core::mem::forget(owned_fd); - } - - // FreeBSD and macOS seem to read some directory entries before we call - // `.next()`. - #[cfg(any(apple, freebsdlike))] - { - dir.rewind(); - } - - assert!(matches!(dir.next(), Some(Err(_)))); - assert!(dir.next().is_none()); -} diff --git a/vendor/rustix/src/backend/libc/fs/inotify.rs b/vendor/rustix/src/backend/libc/fs/inotify.rs deleted file mode 100644 index 2044bd9..0000000 --- a/vendor/rustix/src/backend/libc/fs/inotify.rs +++ /dev/null @@ -1,131 +0,0 @@ -//! inotify support for working with inotifies - -use crate::backend::c; -use crate::backend::conv::{borrowed_fd, c_str, ret, ret_c_int, ret_owned_fd}; -use crate::fd::{BorrowedFd, OwnedFd}; -use crate::io; -use bitflags::bitflags; - -bitflags! { - /// `IN_*` for use with [`inotify_init`]. - /// - /// [`inotify_init`]: crate::fs::inotify::inotify_init - #[repr(transparent)] - #[derive(Copy, Clone, Eq, PartialEq, Hash, Debug)] - pub struct CreateFlags: u32 { - /// `IN_CLOEXEC` - const CLOEXEC = bitcast!(c::IN_CLOEXEC); - /// `IN_NONBLOCK` - const NONBLOCK = bitcast!(c::IN_NONBLOCK); - - /// <https://docs.rs/bitflags/*/bitflags/#externally-defined-flags> - const _ = !0; - } -} - -bitflags! { - /// `IN*` for use with [`inotify_add_watch`]. - /// - /// [`inotify_add_watch`]: crate::fs::inotify::inotify_add_watch - #[repr(transparent)] - #[derive(Default, Copy, Clone, Eq, PartialEq, Hash, Debug)] - pub struct WatchFlags: u32 { - /// `IN_ACCESS` - const ACCESS = c::IN_ACCESS; - /// `IN_ATTRIB` - const ATTRIB = c::IN_ATTRIB; - /// `IN_CLOSE_NOWRITE` - const CLOSE_NOWRITE = c::IN_CLOSE_NOWRITE; - /// `IN_CLOSE_WRITE` - const CLOSE_WRITE = c::IN_CLOSE_WRITE; - /// `IN_CREATE` - const CREATE = c::IN_CREATE; - /// `IN_DELETE` - const DELETE = c::IN_DELETE; - /// `IN_DELETE_SELF` - const DELETE_SELF = c::IN_DELETE_SELF; - /// `IN_MODIFY` - const MODIFY = c::IN_MODIFY; - /// `IN_MOVE_SELF` - const MOVE_SELF = c::IN_MOVE_SELF; - /// `IN_MOVED_FROM` - const MOVED_FROM = c::IN_MOVED_FROM; - /// `IN_MOVED_TO` - const MOVED_TO = c::IN_MOVED_TO; - /// `IN_OPEN` - const OPEN = c::IN_OPEN; - - /// `IN_CLOSE` - const CLOSE = c::IN_CLOSE; - /// `IN_MOVE` - const MOVE = c::IN_MOVE; - /// `IN_ALL_EVENTS` - const ALL_EVENTS = c::IN_ALL_EVENTS; - - /// `IN_DONT_FOLLOW` - const DONT_FOLLOW = c::IN_DONT_FOLLOW; - /// `IN_EXCL_UNLINK` - const EXCL_UNLINK = 1; - /// `IN_MASK_ADD` - const MASK_ADD = 1; - /// `IN_MASK_CREATE` - const MASK_CREATE = 1; - /// `IN_ONESHOT` - const ONESHOT = c::IN_ONESHOT; - /// `IN_ONLYDIR` - const ONLYDIR = c::IN_ONLYDIR; - - /// <https://docs.rs/bitflags/*/bitflags/#externally-defined-flags> - const _ = !0; - } -} - -/// `inotify_init1(flags)`—Creates a new inotify object. -/// -/// Use the [`CreateFlags::CLOEXEC`] flag to prevent the resulting file -/// descriptor from being implicitly passed across `exec` boundaries. -#[doc(alias = "inotify_init1")] -pub fn inotify_init(flags: CreateFlags) -> io::Result<OwnedFd> { - // SAFETY: `inotify_init1` has no safety preconditions. - unsafe { ret_owned_fd(c::inotify_init1(bitflags_bits!(flags))) } -} - -/// `inotify_add_watch(self, path, flags)`—Adds a watch to inotify. -/// -/// This registers or updates a watch for the filesystem path `path` and -/// returns a watch descriptor corresponding to this watch. -/// -/// Note: Due to the existence of hardlinks, providing two different paths to -/// this method may result in it returning the same watch descriptor. An -/// application should keep track of this externally to avoid logic errors. -pub fn inotify_add_watch<P: crate::path::Arg>( - inot: BorrowedFd<'_>, - path: P, - flags: WatchFlags, -) -> io::Result<i32> { - path.into_with_c_str(|path| { - // SAFETY: The fd and path we are passing is guaranteed valid by the - // type system. - unsafe { - ret_c_int(c::inotify_add_watch( - borrowed_fd(inot), - c_str(path), - flags.bits(), - )) - } - }) -} - -/// `inotify_rm_watch(self, wd)`—Removes a watch from this inotify. -/// -/// The watch descriptor provided should have previously been returned by -/// [`inotify_add_watch`] and not previously have been removed. -#[doc(alias = "inotify_rm_watch")] -pub fn inotify_remove_watch(inot: BorrowedFd<'_>, wd: i32) -> io::Result<()> { - // Android's `inotify_rm_watch` takes `u32` despite that - // `inotify_add_watch` expects a `i32`. - #[cfg(target_os = "android")] - let wd = wd as u32; - // SAFETY: The fd is valid and closing an arbitrary wd is valid. - unsafe { ret(c::inotify_rm_watch(borrowed_fd(inot), wd)) } -} diff --git a/vendor/rustix/src/backend/libc/fs/makedev.rs b/vendor/rustix/src/backend/libc/fs/makedev.rs deleted file mode 100644 index aa12102..0000000 --- a/vendor/rustix/src/backend/libc/fs/makedev.rs +++ /dev/null @@ -1,138 +0,0 @@ -#[cfg(not(all(target_os = "android", target_pointer_width = "32")))] -use crate::backend::c; -use crate::fs::Dev; - -#[cfg(not(any( - apple, - solarish, - target_os = "aix", - target_os = "android", - target_os = "emscripten", -)))] -#[inline] -pub(crate) fn makedev(maj: u32, min: u32) -> Dev { - c::makedev(maj, min) -} - -#[cfg(solarish)] -pub(crate) fn makedev(maj: u32, min: u32) -> Dev { - // SAFETY: Solarish's `makedev` is marked unsafe but it isn't doing - // anything unsafe. - unsafe { c::makedev(maj, min) } -} - -#[cfg(all(target_os = "android", not(target_pointer_width = "32")))] -#[inline] -pub(crate) fn makedev(maj: u32, min: u32) -> Dev { - c::makedev(maj, min) -} - -#[cfg(all(target_os = "android", target_pointer_width = "32"))] -#[inline] -pub(crate) fn makedev(maj: u32, min: u32) -> Dev { - // 32-bit Android's `dev_t` is 32-bit, but its `st_dev` is 64-bit, so we do - // it ourselves. - ((u64::from(maj) & 0xffff_f000_u64) << 32) - | ((u64::from(maj) & 0x0000_0fff_u64) << 8) - | ((u64::from(min) & 0xffff_ff00_u64) << 12) - | (u64::from(min) & 0x0000_00ff_u64) -} - -#[cfg(target_os = "emscripten")] -#[inline] -pub(crate) fn makedev(maj: u32, min: u32) -> Dev { - // Emscripten's `makedev` has a 32-bit return value. - Dev::from(c::makedev(maj, min)) -} - -#[cfg(apple)] -#[inline] -pub(crate) fn makedev(maj: u32, min: u32) -> Dev { - // Apple's `makedev` oddly has signed argument types and is `unsafe`. - unsafe { c::makedev(maj as i32, min as i32) } -} - -#[cfg(target_os = "aix")] -#[inline] -pub(crate) fn makedev(maj: u32, min: u32) -> Dev { - // AIX's `makedev` oddly is `unsafe`. - unsafe { c::makedev(maj, min) } -} - -#[cfg(not(any( - apple, - freebsdlike, - target_os = "android", - target_os = "emscripten", - target_os = "netbsd" -)))] -#[inline] -pub(crate) fn major(dev: Dev) -> u32 { - unsafe { c::major(dev) } -} - -#[cfg(any( - apple, - freebsdlike, - target_os = "netbsd", - all(target_os = "android", not(target_pointer_width = "32")), -))] -#[inline] -pub(crate) fn major(dev: Dev) -> u32 { - // On some platforms `major` oddly has signed return types. - (unsafe { c::major(dev) }) as u32 -} - -#[cfg(all(target_os = "android", target_pointer_width = "32"))] -#[inline] -pub(crate) fn major(dev: Dev) -> u32 { - // 32-bit Android's `dev_t` is 32-bit, but its `st_dev` is 64-bit, so we do - // it ourselves. - (((dev >> 31 >> 1) & 0xffff_f000) | ((dev >> 8) & 0x0000_0fff)) as u32 -} - -#[cfg(target_os = "emscripten")] -#[inline] -pub(crate) fn major(dev: Dev) -> u32 { - // Emscripten's `major` has a 32-bit argument value. - unsafe { c::major(dev as u32) } -} - -#[cfg(not(any( - apple, - freebsdlike, - target_os = "android", - target_os = "emscripten", - target_os = "netbsd" -)))] -#[inline] -pub(crate) fn minor(dev: Dev) -> u32 { - unsafe { c::minor(dev) } -} - -#[cfg(any( - apple, - freebsdlike, - target_os = "netbsd", - all(target_os = "android", not(target_pointer_width = "32")) -))] -#[inline] -pub(crate) fn minor(dev: Dev) -> u32 { - // On some platforms, `minor` oddly has signed return types. - (unsafe { c::minor(dev) }) as u32 -} - -#[cfg(all(target_os = "android", target_pointer_width = "32"))] -#[inline] -pub(crate) fn minor(dev: Dev) -> u32 { - // 32-bit Android's `dev_t` is 32-bit, but its `st_dev` is 64-bit, so we do - // it ourselves. - (((dev >> 12) & 0xffff_ff00) | (dev & 0x0000_00ff)) as u32 -} - -#[cfg(target_os = "emscripten")] -#[inline] -pub(crate) fn minor(dev: Dev) -> u32 { - // Emscripten's `minor` has a 32-bit argument value. - unsafe { c::minor(dev as u32) } -} diff --git a/vendor/rustix/src/backend/libc/fs/mod.rs b/vendor/rustix/src/backend/libc/fs/mod.rs deleted file mode 100644 index c17e863..0000000 --- a/vendor/rustix/src/backend/libc/fs/mod.rs +++ /dev/null @@ -1,23 +0,0 @@ -#[cfg(all(feature = "alloc", not(any(target_os = "espidf", target_os = "redox"))))] -pub(crate) mod dir; -#[cfg(linux_kernel)] -pub mod inotify; -#[cfg(not(any( - target_os = "espidf", - target_os = "haiku", - target_os = "redox", - target_os = "vita", - target_os = "wasi" -)))] -pub(crate) mod makedev; -#[cfg(not(windows))] -pub(crate) mod syscalls; -pub(crate) mod types; - -// TODO: Fix linux-raw-sys to define ioctl codes for sparc. -#[cfg(all(linux_kernel, any(target_arch = "sparc", target_arch = "sparc64")))] -pub(crate) const EXT4_IOC_RESIZE_FS: crate::ioctl::RawOpcode = 0x8008_6610; - -#[cfg(all(linux_kernel, not(any(target_arch = "sparc", target_arch = "sparc64"))))] -pub(crate) const EXT4_IOC_RESIZE_FS: crate::ioctl::RawOpcode = - linux_raw_sys::ioctl::EXT4_IOC_RESIZE_FS as crate::ioctl::RawOpcode; diff --git a/vendor/rustix/src/backend/libc/fs/syscalls.rs b/vendor/rustix/src/backend/libc/fs/syscalls.rs deleted file mode 100644 index 70e86cf..0000000 --- a/vendor/rustix/src/backend/libc/fs/syscalls.rs +++ /dev/null @@ -1,2514 +0,0 @@ -//! libc syscalls supporting `rustix::fs`. - -use crate::backend::c; -#[cfg(any( - not(target_os = "redox"), - feature = "alloc", - all(linux_kernel, feature = "procfs") -))] -use crate::backend::conv::ret_usize; -use crate::backend::conv::{borrowed_fd, c_str, ret, ret_c_int, ret_off_t, ret_owned_fd}; -use crate::fd::{BorrowedFd, OwnedFd}; -use crate::ffi::CStr; -#[cfg(all(apple, feature = "alloc"))] -use crate::ffi::CString; -#[cfg(not(any(target_os = "espidf", target_os = "vita")))] -use crate::fs::Access; -#[cfg(not(any( - apple, - netbsdlike, - solarish, - target_os = "dragonfly", - target_os = "espidf", - target_os = "haiku", - target_os = "redox", - target_os = "vita", -)))] -use crate::fs::Advice; -#[cfg(not(any(target_os = "espidf", target_os = "redox")))] -use crate::fs::AtFlags; -#[cfg(not(any( - netbsdlike, - solarish, - target_os = "aix", - target_os = "dragonfly", - target_os = "espidf", - target_os = "nto", - target_os = "redox", - target_os = "vita", -)))] -use crate::fs::FallocateFlags; -#[cfg(not(any(target_os = "espidf", target_os = "vita", target_os = "wasi")))] -use crate::fs::FlockOperation; -#[cfg(any(linux_kernel, target_os = "freebsd"))] -use crate::fs::MemfdFlags; -#[cfg(any(linux_kernel, target_os = "freebsd", target_os = "fuchsia"))] -use crate::fs::SealFlags; -#[cfg(not(any( - solarish, - target_os = "espidf", - target_os = "haiku", - target_os = "netbsd", - target_os = "nto", - target_os = "redox", - target_os = "vita", - target_os = "wasi", -)))] -use crate::fs::StatFs; -#[cfg(not(any(target_os = "espidf", target_os = "vita")))] -use crate::fs::Timestamps; -#[cfg(not(any( - apple, - target_os = "espidf", - target_os = "redox", - target_os = "vita", - target_os = "wasi" -)))] -use crate::fs::{Dev, FileType}; -use crate::fs::{Mode, OFlags, SeekFrom, Stat}; -#[cfg(not(any(target_os = "haiku", target_os = "redox", target_os = "wasi")))] -use crate::fs::{StatVfs, StatVfsMountFlags}; -use crate::io; -#[cfg(all(target_env = "gnu", fix_y2038))] -use crate::timespec::LibcTimespec; -#[cfg(not(target_os = "wasi"))] -use crate::ugid::{Gid, Uid}; -#[cfg(all(apple, feature = "alloc"))] -use alloc::vec; -use core::mem::MaybeUninit; -#[cfg(apple)] -use { - crate::backend::conv::nonnegative_ret, - crate::fs::{copyfile_state_t, CloneFlags, CopyfileFlags}, -}; -#[cfg(any(apple, linux_kernel))] -use {crate::fs::XattrFlags, core::mem::size_of, core::ptr::null_mut}; -#[cfg(linux_kernel)] -use { - crate::fs::{RenameFlags, ResolveFlags, Statx, StatxFlags, CWD}, - core::ptr::null, -}; - -#[cfg(all(target_env = "gnu", fix_y2038))] -weak!(fn __utimensat64(c::c_int, *const c::c_char, *const LibcTimespec, c::c_int) -> c::c_int); -#[cfg(all(target_env = "gnu", fix_y2038))] -weak!(fn __futimens64(c::c_int, *const LibcTimespec) -> c::c_int); - -/// Use a direct syscall (via libc) for `open`. -/// -/// This is only currently necessary as a workaround for old glibc; see below. -#[cfg(all(unix, target_env = "gnu"))] -fn open_via_syscall(path: &CStr, oflags: OFlags, mode: Mode) -> io::Result<OwnedFd> { - // Linux on aarch64, loongarch64 and riscv64 has no `open` syscall so use - // `openat`. - #[cfg(any( - target_arch = "aarch64", - target_arch = "riscv32", - target_arch = "riscv64", - target_arch = "csky", - target_arch = "loongarch64" - ))] - { - openat_via_syscall(CWD, path, oflags, mode) - } - - // Use the `open` syscall. - #[cfg(not(any( - target_arch = "aarch64", - target_arch = "riscv32", - target_arch = "riscv64", - target_arch = "csky", - target_arch = "loongarch64" - )))] - unsafe { - syscall! { - fn open( - pathname: *const c::c_char, - oflags: c::c_int, - mode: c::mode_t - ) via SYS_open -> c::c_int - } - - ret_owned_fd(open( - c_str(path), - bitflags_bits!(oflags), - bitflags_bits!(mode), - )) - } -} - -pub(crate) fn open(path: &CStr, oflags: OFlags, mode: Mode) -> io::Result<OwnedFd> { - // Work around <https://sourceware.org/bugzilla/show_bug.cgi?id=17523>. - // glibc versions before 2.25 don't handle `O_TMPFILE` correctly. - #[cfg(all(unix, target_env = "gnu", not(target_os = "hurd")))] - if oflags.contains(OFlags::TMPFILE) && crate::backend::if_glibc_is_less_than_2_25() { - return open_via_syscall(path, oflags, mode); - } - - // On these platforms, `mode_t` is `u16` and can't be passed directly to a - // variadic function. - #[cfg(any( - apple, - freebsdlike, - all(target_os = "android", target_pointer_width = "32") - ))] - let mode: c::c_uint = mode.bits().into(); - - // Otherwise, cast to `mode_t` as that's what `open` is documented to take. - #[cfg(not(any( - apple, - freebsdlike, - all(target_os = "android", target_pointer_width = "32") - )))] - let mode: c::mode_t = mode.bits() as _; - - unsafe { ret_owned_fd(c::open(c_str(path), bitflags_bits!(oflags), mode)) } -} - -/// Use a direct syscall (via libc) for `openat`. -/// -/// This is only currently necessary as a workaround for old glibc; see below. -#[cfg(all(unix, target_env = "gnu", not(target_os = "hurd")))] -fn openat_via_syscall( - dirfd: BorrowedFd<'_>, - path: &CStr, - oflags: OFlags, - mode: Mode, -) -> io::Result<OwnedFd> { - syscall! { - fn openat( - base_dirfd: c::c_int, - pathname: *const c::c_char, - oflags: c::c_int, - mode: c::mode_t - ) via SYS_openat -> c::c_int - } - - unsafe { - ret_owned_fd(openat( - borrowed_fd(dirfd), - c_str(path), - bitflags_bits!(oflags), - bitflags_bits!(mode), - )) - } -} - -#[cfg(not(target_os = "redox"))] -pub(crate) fn openat( - dirfd: BorrowedFd<'_>, - path: &CStr, - oflags: OFlags, - mode: Mode, -) -> io::Result<OwnedFd> { - // Work around <https://sourceware.org/bugzilla/show_bug.cgi?id=17523>. - // glibc versions before 2.25 don't handle `O_TMPFILE` correctly. - #[cfg(all(unix, target_env = "gnu", not(target_os = "hurd")))] - if oflags.contains(OFlags::TMPFILE) && crate::backend::if_glibc_is_less_than_2_25() { - return openat_via_syscall(dirfd, path, oflags, mode); - } - - // On these platforms, `mode_t` is `u16` and can't be passed directly to a - // variadic function. - #[cfg(any( - apple, - freebsdlike, - all(target_os = "android", target_pointer_width = "32") - ))] - let mode: c::c_uint = mode.bits().into(); - - // Otherwise, cast to `mode_t` as that's what `open` is documented to take. - #[cfg(not(any( - apple, - freebsdlike, - all(target_os = "android", target_pointer_width = "32") - )))] - let mode: c::mode_t = mode.bits() as _; - - unsafe { - ret_owned_fd(c::openat( - borrowed_fd(dirfd), - c_str(path), - bitflags_bits!(oflags), - mode, - )) - } -} - -#[cfg(not(any( - solarish, - target_os = "espidf", - target_os = "haiku", - target_os = "netbsd", - target_os = "nto", - target_os = "redox", - target_os = "vita", - target_os = "wasi", -)))] -#[inline] -pub(crate) fn statfs(filename: &CStr) -> io::Result<StatFs> { - unsafe { - let mut result = MaybeUninit::<StatFs>::uninit(); - ret(c::statfs(c_str(filename), result.as_mut_ptr()))?; - Ok(result.assume_init()) - } -} - -#[cfg(not(any(target_os = "haiku", target_os = "redox", target_os = "wasi")))] -#[inline] -pub(crate) fn statvfs(filename: &CStr) -> io::Result<StatVfs> { - unsafe { - let mut result = MaybeUninit::<c::statvfs>::uninit(); - ret(c::statvfs(c_str(filename), result.as_mut_ptr()))?; - Ok(libc_statvfs_to_statvfs(result.assume_init())) - } -} - -#[cfg(feature = "alloc")] -#[inline] -pub(crate) fn readlink(path: &CStr, buf: &mut [u8]) -> io::Result<usize> { - unsafe { - ret_usize( - c::readlink(c_str(path), buf.as_mut_ptr().cast::<c::c_char>(), buf.len()) as isize, - ) - } -} - -#[cfg(not(target_os = "redox"))] -#[inline] -pub(crate) fn readlinkat( - dirfd: BorrowedFd<'_>, - path: &CStr, - buf: &mut [MaybeUninit<u8>], -) -> io::Result<usize> { - unsafe { - ret_usize(c::readlinkat( - borrowed_fd(dirfd), - c_str(path), - buf.as_mut_ptr().cast::<c::c_char>(), - buf.len(), - ) as isize) - } -} - -pub(crate) fn mkdir(path: &CStr, mode: Mode) -> io::Result<()> { - unsafe { ret(c::mkdir(c_str(path), mode.bits() as c::mode_t)) } -} - -#[cfg(not(target_os = "redox"))] -pub(crate) fn mkdirat(dirfd: BorrowedFd<'_>, path: &CStr, mode: Mode) -> io::Result<()> { - unsafe { - ret(c::mkdirat( - borrowed_fd(dirfd), - c_str(path), - mode.bits() as c::mode_t, - )) - } -} - -#[cfg(linux_kernel)] -pub(crate) fn getdents_uninit( - fd: BorrowedFd<'_>, - buf: &mut [MaybeUninit<u8>], -) -> io::Result<usize> { - syscall! { - fn getdents64( - fd: c::c_int, - dirp: *mut c::c_void, - count: usize - ) via SYS_getdents64 -> c::ssize_t - } - unsafe { - ret_usize(getdents64( - borrowed_fd(fd), - buf.as_mut_ptr().cast::<c::c_void>(), - buf.len(), - )) - } -} - -pub(crate) fn link(old_path: &CStr, new_path: &CStr) -> io::Result<()> { - unsafe { ret(c::link(c_str(old_path), c_str(new_path))) } -} - -#[cfg(not(any(target_os = "espidf", target_os = "redox")))] -pub(crate) fn linkat( - old_dirfd: BorrowedFd<'_>, - old_path: &CStr, - new_dirfd: BorrowedFd<'_>, - new_path: &CStr, - flags: AtFlags, -) -> io::Result<()> { - // macOS <= 10.9 lacks `linkat`. - #[cfg(target_os = "macos")] - unsafe { - weak! { - fn linkat( - c::c_int, - *const c::c_char, - c::c_int, - *const c::c_char, - c::c_int - ) -> c::c_int - } - // If we have `linkat`, use it. - if let Some(libc_linkat) = linkat.get() { - return ret(libc_linkat( - borrowed_fd(old_dirfd), - c_str(old_path), - borrowed_fd(new_dirfd), - c_str(new_path), - bitflags_bits!(flags), - )); - } - // Otherwise, see if we can emulate the `AT_FDCWD` case. - if borrowed_fd(old_dirfd) != c::AT_FDCWD || borrowed_fd(new_dirfd) != c::AT_FDCWD { - return Err(io::Errno::NOSYS); - } - if flags.intersects(!AtFlags::SYMLINK_FOLLOW) { - return Err(io::Errno::INVAL); - } - if !flags.is_empty() { - return Err(io::Errno::OPNOTSUPP); - } - ret(c::link(c_str(old_path), c_str(new_path))) - } - - #[cfg(not(target_os = "macos"))] - unsafe { - ret(c::linkat( - borrowed_fd(old_dirfd), - c_str(old_path), - borrowed_fd(new_dirfd), - c_str(new_path), - bitflags_bits!(flags), - )) - } -} - -pub(crate) fn rmdir(path: &CStr) -> io::Result<()> { - unsafe { ret(c::rmdir(c_str(path))) } -} - -pub(crate) fn unlink(path: &CStr) -> io::Result<()> { - unsafe { ret(c::unlink(c_str(path))) } -} - -#[cfg(not(any(target_os = "espidf", target_os = "redox")))] -pub(crate) fn unlinkat(dirfd: BorrowedFd<'_>, path: &CStr, flags: AtFlags) -> io::Result<()> { - // macOS <= 10.9 lacks `unlinkat`. - #[cfg(target_os = "macos")] - unsafe { - weak! { - fn unlinkat( - c::c_int, - *const c::c_char, - c::c_int - ) -> c::c_int - } - // If we have `unlinkat`, use it. - if let Some(libc_unlinkat) = unlinkat.get() { - return ret(libc_unlinkat( - borrowed_fd(dirfd), - c_str(path), - bitflags_bits!(flags), - )); - } - // Otherwise, see if we can emulate the `AT_FDCWD` case. - if borrowed_fd(dirfd) != c::AT_FDCWD { - return Err(io::Errno::NOSYS); - } - if flags.intersects(!AtFlags::REMOVEDIR) { - return Err(io::Errno::INVAL); - } - if flags.contains(AtFlags::REMOVEDIR) { - ret(c::rmdir(c_str(path))) - } else { - ret(c::unlink(c_str(path))) - } - } - - #[cfg(not(target_os = "macos"))] - unsafe { - ret(c::unlinkat( - borrowed_fd(dirfd), - c_str(path), - bitflags_bits!(flags), - )) - } -} - -pub(crate) fn rename(old_path: &CStr, new_path: &CStr) -> io::Result<()> { - unsafe { ret(c::rename(c_str(old_path), c_str(new_path))) } -} - -#[cfg(not(target_os = "redox"))] -pub(crate) fn renameat( - old_dirfd: BorrowedFd<'_>, - old_path: &CStr, - new_dirfd: BorrowedFd<'_>, - new_path: &CStr, -) -> io::Result<()> { - // macOS <= 10.9 lacks `renameat`. - #[cfg(target_os = "macos")] - unsafe { - weak! { - fn renameat( - c::c_int, - *const c::c_char, - c::c_int, - *const c::c_char - ) -> c::c_int - } - // If we have `renameat`, use it. - if let Some(libc_renameat) = renameat.get() { - return ret(libc_renameat( - borrowed_fd(old_dirfd), - c_str(old_path), - borrowed_fd(new_dirfd), - c_str(new_path), - )); - } - // Otherwise, see if we can emulate the `AT_FDCWD` case. - if borrowed_fd(old_dirfd) != c::AT_FDCWD || borrowed_fd(new_dirfd) != c::AT_FDCWD { - return Err(io::Errno::NOSYS); - } - ret(c::rename(c_str(old_path), c_str(new_path))) - } - - #[cfg(not(target_os = "macos"))] - unsafe { - ret(c::renameat( - borrowed_fd(old_dirfd), - c_str(old_path), - borrowed_fd(new_dirfd), - c_str(new_path), - )) - } -} - -#[cfg(all(target_os = "linux", target_env = "gnu"))] -pub(crate) fn renameat2( - old_dirfd: BorrowedFd<'_>, - old_path: &CStr, - new_dirfd: BorrowedFd<'_>, - new_path: &CStr, - flags: RenameFlags, -) -> io::Result<()> { - // `renameat2` wasn't supported in glibc until 2.28. - weak_or_syscall! { - fn renameat2( - olddirfd: c::c_int, - oldpath: *const c::c_char, - newdirfd: c::c_int, - newpath: *const c::c_char, - flags: c::c_uint - ) via SYS_renameat2 -> c::c_int - } - - unsafe { - ret(renameat2( - borrowed_fd(old_dirfd), - c_str(old_path), - borrowed_fd(new_dirfd), - c_str(new_path), - flags.bits(), - )) - } -} - -#[cfg(any( - target_os = "android", - all(target_os = "linux", not(target_env = "gnu")), -))] -#[inline] -pub(crate) fn renameat2( - old_dirfd: BorrowedFd<'_>, - old_path: &CStr, - new_dirfd: BorrowedFd<'_>, - new_path: &CStr, - flags: RenameFlags, -) -> io::Result<()> { - // At present, `libc` only has `renameat2` defined for glibc. If we have - // no flags, we can use plain `renameat`, but otherwise we use `syscall!`. - // to call `renameat2` ourselves. - if flags.is_empty() { - renameat(old_dirfd, old_path, new_dirfd, new_path) - } else { - syscall! { - fn renameat2( - olddirfd: c::c_int, - oldpath: *const c::c_char, - newdirfd: c::c_int, - newpath: *const c::c_char, - flags: c::c_uint - ) via SYS_renameat2 -> c::c_int - } - - unsafe { - ret(renameat2( - borrowed_fd(old_dirfd), - c_str(old_path), - borrowed_fd(new_dirfd), - c_str(new_path), - flags.bits(), - )) - } - } -} - -pub(crate) fn symlink(old_path: &CStr, new_path: &CStr) -> io::Result<()> { - unsafe { ret(c::symlink(c_str(old_path), c_str(new_path))) } -} - -#[cfg(not(target_os = "redox"))] -pub(crate) fn symlinkat( - old_path: &CStr, - new_dirfd: BorrowedFd<'_>, - new_path: &CStr, -) -> io::Result<()> { - unsafe { - ret(c::symlinkat( - c_str(old_path), - borrowed_fd(new_dirfd), - c_str(new_path), - )) - } -} - -pub(crate) fn stat(path: &CStr) -> io::Result<Stat> { - // See the comments in `fstat` about using `crate::fs::statx` here. - #[cfg(all( - linux_kernel, - any( - target_pointer_width = "32", - target_arch = "mips64", - target_arch = "mips64r6" - ) - ))] - { - match crate::fs::statx( - crate::fs::CWD, - path, - AtFlags::empty(), - StatxFlags::BASIC_STATS, - ) { - Ok(x) => statx_to_stat(x), - Err(io::Errno::NOSYS) => statat_old(crate::fs::CWD, path, AtFlags::empty()), - Err(err) => Err(err), - } - } - - // Main version: libc is y2038 safe. Or, the platform is not y2038 safe and - // there's nothing practical we can do. - #[cfg(not(all( - linux_kernel, - any( - target_pointer_width = "32", - target_arch = "mips64", - target_arch = "mips64r6" - ) - )))] - unsafe { - let mut stat = MaybeUninit::<Stat>::uninit(); - ret(c::stat(c_str(path), stat.as_mut_ptr()))?; - Ok(stat.assume_init()) - } -} - -pub(crate) fn lstat(path: &CStr) -> io::Result<Stat> { - // See the comments in `fstat` about using `crate::fs::statx` here. - #[cfg(all( - linux_kernel, - any( - target_pointer_width = "32", - target_arch = "mips64", - target_arch = "mips64r6" - ) - ))] - { - match crate::fs::statx( - crate::fs::CWD, - path, - AtFlags::SYMLINK_NOFOLLOW, - StatxFlags::BASIC_STATS, - ) { - Ok(x) => statx_to_stat(x), - Err(io::Errno::NOSYS) => statat_old(crate::fs::CWD, path, AtFlags::SYMLINK_NOFOLLOW), - Err(err) => Err(err), - } - } - - // Main version: libc is y2038 safe. Or, the platform is not y2038 safe and - // there's nothing practical we can do. - #[cfg(not(all( - linux_kernel, - any( - target_pointer_width = "32", - target_arch = "mips64", - target_arch = "mips64r6" - ) - )))] - unsafe { - let mut stat = MaybeUninit::<Stat>::uninit(); - ret(c::lstat(c_str(path), stat.as_mut_ptr()))?; - Ok(stat.assume_init()) - } -} - -#[cfg(not(any(target_os = "espidf", target_os = "redox")))] -pub(crate) fn statat(dirfd: BorrowedFd<'_>, path: &CStr, flags: AtFlags) -> io::Result<Stat> { - // See the comments in `fstat` about using `crate::fs::statx` here. - #[cfg(all( - linux_kernel, - any( - target_pointer_width = "32", - target_arch = "mips64", - target_arch = "mips64r6" - ) - ))] - { - match crate::fs::statx(dirfd, path, flags, StatxFlags::BASIC_STATS) { - Ok(x) => statx_to_stat(x), - Err(io::Errno::NOSYS) => statat_old(dirfd, path, flags), - Err(err) => Err(err), - } - } - - // Main version: libc is y2038 safe. Or, the platform is not y2038 safe and - // there's nothing practical we can do. - #[cfg(not(all( - linux_kernel, - any( - target_pointer_width = "32", - target_arch = "mips64", - target_arch = "mips64r6" - ) - )))] - unsafe { - let mut stat = MaybeUninit::<Stat>::uninit(); - ret(c::fstatat( - borrowed_fd(dirfd), - c_str(path), - stat.as_mut_ptr(), - bitflags_bits!(flags), - ))?; - Ok(stat.assume_init()) - } -} - -#[cfg(all( - linux_kernel, - any( - target_pointer_width = "32", - target_arch = "mips64", - target_arch = "mips64r6" - ) -))] -fn statat_old(dirfd: BorrowedFd<'_>, path: &CStr, flags: AtFlags) -> io::Result<Stat> { - unsafe { - let mut result = MaybeUninit::<c::stat64>::uninit(); - ret(c::fstatat( - borrowed_fd(dirfd), - c_str(path), - result.as_mut_ptr(), - bitflags_bits!(flags), - ))?; - stat64_to_stat(result.assume_init()) - } -} - -#[cfg(not(any(target_os = "espidf", target_os = "emscripten", target_os = "vita")))] -pub(crate) fn access(path: &CStr, access: Access) -> io::Result<()> { - unsafe { ret(c::access(c_str(path), access.bits())) } -} - -#[cfg(not(any( - target_os = "emscripten", - target_os = "espidf", - target_os = "redox", - target_os = "vita" -)))] -pub(crate) fn accessat( - dirfd: BorrowedFd<'_>, - path: &CStr, - access: Access, - flags: AtFlags, -) -> io::Result<()> { - // macOS <= 10.9 lacks `faccessat`. - #[cfg(target_os = "macos")] - unsafe { - weak! { - fn faccessat( - c::c_int, - *const c::c_char, - c::c_int, - c::c_int - ) -> c::c_int - } - // If we have `faccessat`, use it. - if let Some(libc_faccessat) = faccessat.get() { - return ret(libc_faccessat( - borrowed_fd(dirfd), - c_str(path), - bitflags_bits!(access), - bitflags_bits!(flags), - )); - } - // Otherwise, see if we can emulate the `AT_FDCWD` case. - if borrowed_fd(dirfd) != c::AT_FDCWD { - return Err(io::Errno::NOSYS); - } - if flags.intersects(!(AtFlags::EACCESS | AtFlags::SYMLINK_NOFOLLOW)) { - return Err(io::Errno::INVAL); - } - if !flags.is_empty() { - return Err(io::Errno::OPNOTSUPP); - } - ret(c::access(c_str(path), bitflags_bits!(access))) - } - - #[cfg(not(target_os = "macos"))] - unsafe { - ret(c::faccessat( - borrowed_fd(dirfd), - c_str(path), - bitflags_bits!(access), - bitflags_bits!(flags), - )) - } -} - -#[cfg(target_os = "emscripten")] -pub(crate) fn access(_path: &CStr, _access: Access) -> io::Result<()> { - Ok(()) -} - -#[cfg(target_os = "emscripten")] -pub(crate) fn accessat( - _dirfd: BorrowedFd<'_>, - _path: &CStr, - _access: Access, - _flags: AtFlags, -) -> io::Result<()> { - Ok(()) -} - -#[cfg(not(any(target_os = "espidf", target_os = "redox", target_os = "vita")))] -pub(crate) fn utimensat( - dirfd: BorrowedFd<'_>, - path: &CStr, - times: &Timestamps, - flags: AtFlags, -) -> io::Result<()> { - // Old 32-bit version: libc has `utimensat` but it is not y2038 safe by - // default. But there may be a `__utimensat16` we can use. - #[cfg(fix_y2038)] - { - #[cfg(target_env = "gnu")] - if let Some(libc_utimensat) = __utimensat64.get() { - let libc_times: [LibcTimespec; 2] = [ - times.last_access.clone().into(), - times.last_modification.clone().into(), - ]; - - unsafe { - return ret(libc_utimensat( - borrowed_fd(dirfd), - c_str(path), - libc_times.as_ptr(), - bitflags_bits!(flags), - )); - } - } - - utimensat_old(dirfd, path, times, flags) - } - - // Main version: libc is y2038 safe and has `utimensat`. Or, the platform - // is not y2038 safe and there's nothing practical we can do. - #[cfg(not(any(apple, fix_y2038)))] - unsafe { - use crate::utils::as_ptr; - - ret(c::utimensat( - borrowed_fd(dirfd), - c_str(path), - as_ptr(times).cast(), - bitflags_bits!(flags), - )) - } - - // Apple version: `utimensat` was introduced in macOS 10.13. - #[cfg(apple)] - unsafe { - use crate::utils::as_ptr; - - // ABI details - weak! { - fn utimensat( - c::c_int, - *const c::c_char, - *const c::timespec, - c::c_int - ) -> c::c_int - } - extern "C" { - fn setattrlist( - path: *const c::c_char, - attr_list: *const Attrlist, - attr_buf: *const c::c_void, - attr_buf_size: c::size_t, - options: c::c_ulong, - ) -> c::c_int; - } - const FSOPT_NOFOLLOW: c::c_ulong = 0x0000_0001; - - // If we have `utimensat`, use it. - if let Some(have_utimensat) = utimensat.get() { - return ret(have_utimensat( - borrowed_fd(dirfd), - c_str(path), - as_ptr(times).cast(), - bitflags_bits!(flags), - )); - } - - // `setattrlistat` was introduced in 10.13 along with `utimensat`, so - // if we don't have `utimensat`, we don't have `setattrlistat` either. - // Emulate it using `fork`, and `fchdir` and [`setattrlist`]. - // - // [`setattrlist`]: https://developer.apple.com/library/archive/documentation/System/Conceptual/ManPages_iPhoneOS/man2/setattrlist.2.html - match c::fork() { - -1 => Err(io::Errno::IO), - 0 => { - if c::fchdir(borrowed_fd(dirfd)) != 0 { - let code = match libc_errno::errno().0 { - c::EACCES => 2, - c::ENOTDIR => 3, - _ => 1, - }; - c::_exit(code); - } - - let mut flags_arg = 0; - if flags.contains(AtFlags::SYMLINK_NOFOLLOW) { - flags_arg |= FSOPT_NOFOLLOW; - } - - let (attrbuf_size, times, attrs) = times_to_attrlist(times); - - if setattrlist( - c_str(path), - &attrs, - as_ptr(×).cast(), - attrbuf_size, - flags_arg, - ) != 0 - { - // Translate expected `errno` codes into ad-hoc integer - // values suitable for exit statuses. - let code = match libc_errno::errno().0 { - c::EACCES => 2, - c::ENOTDIR => 3, - c::EPERM => 4, - c::EROFS => 5, - c::ELOOP => 6, - c::ENOENT => 7, - c::ENAMETOOLONG => 8, - c::EINVAL => 9, - c::ESRCH => 10, - c::ENOTSUP => 11, - _ => 1, - }; - c::_exit(code); - } - - c::_exit(0); - } - child_pid => { - let mut wstatus = 0; - let _ = ret_c_int(c::waitpid(child_pid, &mut wstatus, 0))?; - if c::WIFEXITED(wstatus) { - // Translate our ad-hoc exit statuses back to `errno` - // codes. - match c::WEXITSTATUS(wstatus) { - 0 => Ok(()), - 2 => Err(io::Errno::ACCESS), - 3 => Err(io::Errno::NOTDIR), - 4 => Err(io::Errno::PERM), - 5 => Err(io::Errno::ROFS), - 6 => Err(io::Errno::LOOP), - 7 => Err(io::Errno::NOENT), - 8 => Err(io::Errno::NAMETOOLONG), - 9 => Err(io::Errno::INVAL), - 10 => Err(io::Errno::SRCH), - 11 => Err(io::Errno::NOTSUP), - _ => Err(io::Errno::IO), - } - } else { - Err(io::Errno::IO) - } - } - } - } -} - -#[cfg(fix_y2038)] -fn utimensat_old( - dirfd: BorrowedFd<'_>, - path: &CStr, - times: &Timestamps, - flags: AtFlags, -) -> io::Result<()> { - let old_times = [ - c::timespec { - tv_sec: times - .last_access - .tv_sec - .try_into() - .map_err(|_| io::Errno::OVERFLOW)?, - tv_nsec: times - .last_access - .tv_nsec - .try_into() - .map_err(|_| io::Errno::OVERFLOW)?, - }, - c::timespec { - tv_sec: times - .last_modification - .tv_sec - .try_into() - .map_err(|_| io::Errno::OVERFLOW)?, - tv_nsec: times - .last_modification - .tv_nsec - .try_into() - .map_err(|_| io::Errno::OVERFLOW)?, - }, - ]; - unsafe { - ret(c::utimensat( - borrowed_fd(dirfd), - c_str(path), - old_times.as_ptr(), - bitflags_bits!(flags), - )) - } -} - -#[cfg(not(target_os = "wasi"))] -pub(crate) fn chmod(path: &CStr, mode: Mode) -> io::Result<()> { - unsafe { ret(c::chmod(c_str(path), mode.bits() as c::mode_t)) } -} - -#[cfg(not(any( - linux_kernel, - target_os = "espidf", - target_os = "redox", - target_os = "wasi" -)))] -pub(crate) fn chmodat( - dirfd: BorrowedFd<'_>, - path: &CStr, - mode: Mode, - flags: AtFlags, -) -> io::Result<()> { - unsafe { - ret(c::fchmodat( - borrowed_fd(dirfd), - c_str(path), - mode.bits() as c::mode_t, - bitflags_bits!(flags), - )) - } -} - -#[cfg(linux_kernel)] -pub(crate) fn chmodat( - dirfd: BorrowedFd<'_>, - path: &CStr, - mode: Mode, - flags: AtFlags, -) -> io::Result<()> { - // Linux's `fchmodat` does not have a flags argument. - // - // Use `c::syscall` rather than `c::fchmodat` because some libc - // implementations, such as musl, add extra logic to `fchmod` to emulate - // support for `AT_SYMLINK_NOFOLLOW`, which uses `/proc` outside our - // control. - syscall! { - fn fchmodat( - base_dirfd: c::c_int, - pathname: *const c::c_char, - mode: c::mode_t - ) via SYS_fchmodat -> c::c_int - } - if flags == AtFlags::SYMLINK_NOFOLLOW { - return Err(io::Errno::OPNOTSUPP); - } - if !flags.is_empty() { - return Err(io::Errno::INVAL); - } - unsafe { - ret(fchmodat( - borrowed_fd(dirfd), - c_str(path), - mode.bits() as c::mode_t, - )) - } -} - -#[cfg(apple)] -pub(crate) fn fclonefileat( - srcfd: BorrowedFd<'_>, - dst_dirfd: BorrowedFd<'_>, - dst: &CStr, - flags: CloneFlags, -) -> io::Result<()> { - syscall! { - fn fclonefileat( - srcfd: BorrowedFd<'_>, - dst_dirfd: BorrowedFd<'_>, - dst: *const c::c_char, - flags: c::c_int - ) via SYS_fclonefileat -> c::c_int - } - - unsafe { - ret(fclonefileat( - srcfd, - dst_dirfd, - c_str(dst), - bitflags_bits!(flags), - )) - } -} - -#[cfg(not(any(target_os = "espidf", target_os = "redox", target_os = "wasi")))] -pub(crate) fn chownat( - dirfd: BorrowedFd<'_>, - path: &CStr, - owner: Option<Uid>, - group: Option<Gid>, - flags: AtFlags, -) -> io::Result<()> { - unsafe { - let (ow, gr) = crate::ugid::translate_fchown_args(owner, group); - ret(c::fchownat( - borrowed_fd(dirfd), - c_str(path), - ow, - gr, - bitflags_bits!(flags), - )) - } -} - -#[cfg(not(any( - apple, - target_os = "espidf", - target_os = "redox", - target_os = "vita", - target_os = "wasi" -)))] -pub(crate) fn mknodat( - dirfd: BorrowedFd<'_>, - path: &CStr, - file_type: FileType, - mode: Mode, - dev: Dev, -) -> io::Result<()> { - unsafe { - ret(c::mknodat( - borrowed_fd(dirfd), - c_str(path), - (mode.bits() | file_type.as_raw_mode()) as c::mode_t, - dev.try_into().map_err(|_e| io::Errno::PERM)?, - )) - } -} - -#[cfg(linux_kernel)] -pub(crate) fn copy_file_range( - fd_in: BorrowedFd<'_>, - off_in: Option<&mut u64>, - fd_out: BorrowedFd<'_>, - off_out: Option<&mut u64>, - len: usize, -) -> io::Result<usize> { - syscall! { - fn copy_file_range( - fd_in: c::c_int, - off_in: *mut c::loff_t, - fd_out: c::c_int, - off_out: *mut c::loff_t, - len: usize, - flags: c::c_uint - ) via SYS_copy_file_range -> c::ssize_t - } - - let mut off_in_val: c::loff_t = 0; - let mut off_out_val: c::loff_t = 0; - // Silently cast; we'll get `EINVAL` if the value is negative. - let off_in_ptr = if let Some(off_in) = &off_in { - off_in_val = **off_in as i64; - &mut off_in_val - } else { - null_mut() - }; - let off_out_ptr = if let Some(off_out) = &off_out { - off_out_val = **off_out as i64; - &mut off_out_val - } else { - null_mut() - }; - let copied = unsafe { - ret_usize(copy_file_range( - borrowed_fd(fd_in), - off_in_ptr, - borrowed_fd(fd_out), - off_out_ptr, - len, - 0, // no flags are defined yet - ))? - }; - if let Some(off_in) = off_in { - *off_in = off_in_val as u64; - } - if let Some(off_out) = off_out { - *off_out = off_out_val as u64; - } - Ok(copied) -} - -#[cfg(not(any( - apple, - netbsdlike, - solarish, - target_os = "dragonfly", - target_os = "espidf", - target_os = "haiku", - target_os = "redox", - target_os = "vita", -)))] -pub(crate) fn fadvise(fd: BorrowedFd<'_>, offset: u64, len: u64, advice: Advice) -> io::Result<()> { - let offset = offset as i64; - let len = len as i64; - - // FreeBSD returns `EINVAL` on invalid offsets; emulate the POSIX behavior. - #[cfg(target_os = "freebsd")] - let offset = if (offset as i64) < 0 { - i64::MAX - } else { - offset - }; - - // FreeBSD returns `EINVAL` on overflow; emulate the POSIX behavior. - #[cfg(target_os = "freebsd")] - let len = if len > 0 && offset.checked_add(len).is_none() { - i64::MAX - offset - } else { - len - }; - - let err = unsafe { c::posix_fadvise(borrowed_fd(fd), offset, len, advice as c::c_int) }; - - // `posix_fadvise` returns its error status rather than using `errno`. - if err == 0 { - Ok(()) - } else { - Err(io::Errno(err)) - } -} - -pub(crate) fn fcntl_getfl(fd: BorrowedFd<'_>) -> io::Result<OFlags> { - let flags = unsafe { ret_c_int(c::fcntl(borrowed_fd(fd), c::F_GETFL))? }; - Ok(OFlags::from_bits_retain(bitcast!(flags))) -} - -pub(crate) fn fcntl_setfl(fd: BorrowedFd<'_>, flags: OFlags) -> io::Result<()> { - unsafe { ret(c::fcntl(borrowed_fd(fd), c::F_SETFL, flags.bits())) } -} - -#[cfg(any(linux_kernel, target_os = "freebsd", target_os = "fuchsia"))] -pub(crate) fn fcntl_get_seals(fd: BorrowedFd<'_>) -> io::Result<SealFlags> { - let flags = unsafe { ret_c_int(c::fcntl(borrowed_fd(fd), c::F_GET_SEALS))? }; - Ok(SealFlags::from_bits_retain(bitcast!(flags))) -} - -#[cfg(any(linux_kernel, target_os = "freebsd", target_os = "fuchsia"))] -pub(crate) fn fcntl_add_seals(fd: BorrowedFd<'_>, seals: SealFlags) -> io::Result<()> { - unsafe { ret(c::fcntl(borrowed_fd(fd), c::F_ADD_SEALS, seals.bits())) } -} - -#[cfg(not(any( - target_os = "emscripten", - target_os = "espidf", - target_os = "fuchsia", - target_os = "redox", - target_os = "vita", - target_os = "wasi" -)))] -#[inline] -pub(crate) fn fcntl_lock(fd: BorrowedFd<'_>, operation: FlockOperation) -> io::Result<()> { - use c::{flock, F_RDLCK, F_SETLK, F_SETLKW, F_UNLCK, F_WRLCK, SEEK_SET}; - - let (cmd, l_type) = match operation { - FlockOperation::LockShared => (F_SETLKW, F_RDLCK), - FlockOperation::LockExclusive => (F_SETLKW, F_WRLCK), - FlockOperation::Unlock => (F_SETLKW, F_UNLCK), - FlockOperation::NonBlockingLockShared => (F_SETLK, F_RDLCK), - FlockOperation::NonBlockingLockExclusive => (F_SETLK, F_WRLCK), - FlockOperation::NonBlockingUnlock => (F_SETLK, F_UNLCK), - }; - - unsafe { - let mut lock: flock = core::mem::zeroed(); - lock.l_type = l_type as _; - - // When `l_len` is zero, this locks all the bytes from - // `l_whence`/`l_start` to the end of the file, even as the - // file grows dynamically. - lock.l_whence = SEEK_SET as _; - lock.l_start = 0; - lock.l_len = 0; - - ret(c::fcntl(borrowed_fd(fd), cmd, &lock)) - } -} - -pub(crate) fn seek(fd: BorrowedFd<'_>, pos: SeekFrom) -> io::Result<u64> { - let (whence, offset) = match pos { - SeekFrom::Start(pos) => { - let pos: u64 = pos; - // Silently cast; we'll get `EINVAL` if the value is negative. - (c::SEEK_SET, pos as i64) - } - SeekFrom::End(offset) => (c::SEEK_END, offset), - SeekFrom::Current(offset) => (c::SEEK_CUR, offset), - #[cfg(any(apple, freebsdlike, linux_kernel, solarish))] - SeekFrom::Data(offset) => (c::SEEK_DATA, offset), - #[cfg(any(apple, freebsdlike, linux_kernel, solarish))] - SeekFrom::Hole(offset) => (c::SEEK_HOLE, offset), - }; - - // ESP-IDF and Vita don't support 64-bit offsets. - #[cfg(any(target_os = "espidf", target_os = "vita"))] - let offset: i32 = offset.try_into().map_err(|_| io::Errno::OVERFLOW)?; - - let offset = unsafe { ret_off_t(c::lseek(borrowed_fd(fd), offset, whence))? }; - Ok(offset as u64) -} - -pub(crate) fn tell(fd: BorrowedFd<'_>) -> io::Result<u64> { - let offset = unsafe { ret_off_t(c::lseek(borrowed_fd(fd), 0, c::SEEK_CUR))? }; - Ok(offset as u64) -} - -#[cfg(not(any(linux_kernel, target_os = "wasi")))] -pub(crate) fn fchmod(fd: BorrowedFd<'_>, mode: Mode) -> io::Result<()> { - unsafe { ret(c::fchmod(borrowed_fd(fd), bitflags_bits!(mode))) } -} - -#[cfg(linux_kernel)] -pub(crate) fn fchmod(fd: BorrowedFd<'_>, mode: Mode) -> io::Result<()> { - // Use `c::syscall` rather than `c::fchmod` because some libc - // implementations, such as musl, add extra logic to `fchmod` to emulate - // support for `O_PATH`, which uses `/proc` outside our control and - // interferes with our own use of `O_PATH`. - syscall! { - fn fchmod( - fd: c::c_int, - mode: c::mode_t - ) via SYS_fchmod -> c::c_int - } - unsafe { ret(fchmod(borrowed_fd(fd), mode.bits() as c::mode_t)) } -} - -#[cfg(not(target_os = "wasi"))] -pub(crate) fn chown(path: &CStr, owner: Option<Uid>, group: Option<Gid>) -> io::Result<()> { - unsafe { - let (ow, gr) = crate::ugid::translate_fchown_args(owner, group); - ret(c::chown(c_str(path), ow, gr)) - } -} - -#[cfg(linux_kernel)] -pub(crate) fn fchown(fd: BorrowedFd<'_>, owner: Option<Uid>, group: Option<Gid>) -> io::Result<()> { - // Use `c::syscall` rather than `c::fchown` because some libc - // implementations, such as musl, add extra logic to `fchown` to emulate - // support for `O_PATH`, which uses `/proc` outside our control and - // interferes with our own use of `O_PATH`. - syscall! { - fn fchown( - fd: c::c_int, - owner: c::uid_t, - group: c::gid_t - ) via SYS_fchown -> c::c_int - } - unsafe { - let (ow, gr) = crate::ugid::translate_fchown_args(owner, group); - ret(fchown(borrowed_fd(fd), ow, gr)) - } -} - -#[cfg(not(any(linux_kernel, target_os = "wasi")))] -pub(crate) fn fchown(fd: BorrowedFd<'_>, owner: Option<Uid>, group: Option<Gid>) -> io::Result<()> { - unsafe { - let (ow, gr) = crate::ugid::translate_fchown_args(owner, group); - ret(c::fchown(borrowed_fd(fd), ow, gr)) - } -} - -#[cfg(not(any( - target_os = "espidf", - target_os = "solaris", - target_os = "vita", - target_os = "wasi" -)))] -pub(crate) fn flock(fd: BorrowedFd<'_>, operation: FlockOperation) -> io::Result<()> { - unsafe { ret(c::flock(borrowed_fd(fd), operation as c::c_int)) } -} - -#[cfg(linux_kernel)] -pub(crate) fn syncfs(fd: BorrowedFd<'_>) -> io::Result<()> { - // Some versions of Android libc lack a `syncfs` function. - #[cfg(target_os = "android")] - syscall! { - fn syncfs(fd: c::c_int) via SYS_syncfs -> c::c_int - } - - // `syncfs` was added to glibc in 2.20. - #[cfg(not(target_os = "android"))] - weak_or_syscall! { - fn syncfs(fd: c::c_int) via SYS_syncfs -> c::c_int - } - - unsafe { ret(syncfs(borrowed_fd(fd))) } -} - -#[cfg(not(any( - target_os = "espidf", - target_os = "redox", - target_os = "vita", - target_os = "wasi" -)))] -pub(crate) fn sync() { - unsafe { c::sync() } -} - -pub(crate) fn fstat(fd: BorrowedFd<'_>) -> io::Result<Stat> { - // 32-bit and mips64 Linux: `struct stat64` is not y2038 compatible; use - // `statx`. - // - // And, some old platforms don't support `statx`, and some fail with a - // confusing error code, so we call `crate::fs::statx` to handle that. If - // `statx` isn't available, fall back to the buggy system call. - #[cfg(all( - linux_kernel, - any( - target_pointer_width = "32", - target_arch = "mips64", - target_arch = "mips64r6" - ) - ))] - { - match crate::fs::statx(fd, cstr!(""), AtFlags::EMPTY_PATH, StatxFlags::BASIC_STATS) { - Ok(x) => statx_to_stat(x), - Err(io::Errno::NOSYS) => fstat_old(fd), - Err(err) => Err(err), - } - } - - // Main version: libc is y2038 safe. Or, the platform is not y2038 safe and - // there's nothing practical we can do. - #[cfg(not(all( - linux_kernel, - any( - target_pointer_width = "32", - target_arch = "mips64", - target_arch = "mips64r6" - ) - )))] - unsafe { - let mut stat = MaybeUninit::<Stat>::uninit(); - ret(c::fstat(borrowed_fd(fd), stat.as_mut_ptr()))?; - Ok(stat.assume_init()) - } -} - -#[cfg(all( - linux_kernel, - any( - target_pointer_width = "32", - target_arch = "mips64", - target_arch = "mips64r6" - ) -))] -fn fstat_old(fd: BorrowedFd<'_>) -> io::Result<Stat> { - unsafe { - let mut result = MaybeUninit::<c::stat64>::uninit(); - ret(c::fstat(borrowed_fd(fd), result.as_mut_ptr()))?; - stat64_to_stat(result.assume_init()) - } -} - -#[cfg(not(any( - solarish, - target_os = "espidf", - target_os = "haiku", - target_os = "netbsd", - target_os = "nto", - target_os = "redox", - target_os = "vita", - target_os = "wasi", -)))] -pub(crate) fn fstatfs(fd: BorrowedFd<'_>) -> io::Result<StatFs> { - let mut statfs = MaybeUninit::<StatFs>::uninit(); - unsafe { - ret(c::fstatfs(borrowed_fd(fd), statfs.as_mut_ptr()))?; - Ok(statfs.assume_init()) - } -} - -#[cfg(not(any(target_os = "haiku", target_os = "redox", target_os = "wasi")))] -pub(crate) fn fstatvfs(fd: BorrowedFd<'_>) -> io::Result<StatVfs> { - let mut statvfs = MaybeUninit::<c::statvfs>::uninit(); - unsafe { - ret(c::fstatvfs(borrowed_fd(fd), statvfs.as_mut_ptr()))?; - Ok(libc_statvfs_to_statvfs(statvfs.assume_init())) - } -} - -#[cfg(not(any(target_os = "haiku", target_os = "redox", target_os = "wasi")))] -fn libc_statvfs_to_statvfs(from: c::statvfs) -> StatVfs { - StatVfs { - f_bsize: from.f_bsize as u64, - f_frsize: from.f_frsize as u64, - f_blocks: from.f_blocks as u64, - f_bfree: from.f_bfree as u64, - f_bavail: from.f_bavail as u64, - f_files: from.f_files as u64, - f_ffree: from.f_ffree as u64, - f_favail: from.f_ffree as u64, - #[cfg(not(target_os = "aix"))] - f_fsid: from.f_fsid as u64, - #[cfg(target_os = "aix")] - f_fsid: ((from.f_fsid.val[0] as u64) << 32) | from.f_fsid.val[1], - f_flag: StatVfsMountFlags::from_bits_retain(from.f_flag as u64), - f_namemax: from.f_namemax as u64, - } -} - -#[cfg(not(any(target_os = "espidf", target_os = "vita")))] -pub(crate) fn futimens(fd: BorrowedFd<'_>, times: &Timestamps) -> io::Result<()> { - // Old 32-bit version: libc has `futimens` but it is not y2038 safe by - // default. But there may be a `__futimens64` we can use. - #[cfg(fix_y2038)] - { - #[cfg(target_env = "gnu")] - if let Some(libc_futimens) = __futimens64.get() { - let libc_times: [LibcTimespec; 2] = [ - times.last_access.clone().into(), - times.last_modification.clone().into(), - ]; - - unsafe { - return ret(libc_futimens(borrowed_fd(fd), libc_times.as_ptr())); - } - } - - futimens_old(fd, times) - } - - // Main version: libc is y2038 safe and has `futimens`. Or, the platform - // is not y2038 safe and there's nothing practical we can do. - #[cfg(not(any(apple, fix_y2038)))] - unsafe { - use crate::utils::as_ptr; - - ret(c::futimens(borrowed_fd(fd), as_ptr(times).cast())) - } - - // Apple version: `futimens` was introduced in macOS 10.13. - #[cfg(apple)] - unsafe { - use crate::utils::as_ptr; - - // ABI details. - weak! { - fn futimens(c::c_int, *const c::timespec) -> c::c_int - } - extern "C" { - fn fsetattrlist( - fd: c::c_int, - attr_list: *const Attrlist, - attr_buf: *const c::c_void, - attr_buf_size: c::size_t, - options: c::c_ulong, - ) -> c::c_int; - } - - // If we have `futimens`, use it. - if let Some(have_futimens) = futimens.get() { - return ret(have_futimens(borrowed_fd(fd), as_ptr(times).cast())); - } - - // Otherwise use `fsetattrlist`. - let (attrbuf_size, times, attrs) = times_to_attrlist(times); - - ret(fsetattrlist( - borrowed_fd(fd), - &attrs, - as_ptr(×).cast(), - attrbuf_size, - 0, - )) - } -} - -#[cfg(fix_y2038)] -fn futimens_old(fd: BorrowedFd<'_>, times: &Timestamps) -> io::Result<()> { - let old_times = [ - c::timespec { - tv_sec: times - .last_access - .tv_sec - .try_into() - .map_err(|_| io::Errno::OVERFLOW)?, - tv_nsec: times - .last_access - .tv_nsec - .try_into() - .map_err(|_| io::Errno::OVERFLOW)?, - }, - c::timespec { - tv_sec: times - .last_modification - .tv_sec - .try_into() - .map_err(|_| io::Errno::OVERFLOW)?, - tv_nsec: times - .last_modification - .tv_nsec - .try_into() - .map_err(|_| io::Errno::OVERFLOW)?, - }, - ]; - - unsafe { ret(c::futimens(borrowed_fd(fd), old_times.as_ptr())) } -} - -#[cfg(not(any( - apple, - netbsdlike, - solarish, - target_os = "aix", - target_os = "dragonfly", - target_os = "espidf", - target_os = "nto", - target_os = "redox", - target_os = "vita", -)))] -pub(crate) fn fallocate( - fd: BorrowedFd<'_>, - mode: FallocateFlags, - offset: u64, - len: u64, -) -> io::Result<()> { - // Silently cast; we'll get `EINVAL` if the value is negative. - let offset = offset as i64; - let len = len as i64; - - #[cfg(any(linux_kernel, target_os = "fuchsia"))] - unsafe { - ret(c::fallocate( - borrowed_fd(fd), - bitflags_bits!(mode), - offset, - len, - )) - } - - #[cfg(not(any(linux_kernel, target_os = "fuchsia")))] - { - assert!(mode.is_empty()); - let err = unsafe { c::posix_fallocate(borrowed_fd(fd), offset, len) }; - - // `posix_fallocate` returns its error status rather than using - // `errno`. - if err == 0 { - Ok(()) - } else { - Err(io::Errno(err)) - } - } -} - -#[cfg(apple)] -pub(crate) fn fallocate( - fd: BorrowedFd<'_>, - mode: FallocateFlags, - offset: u64, - len: u64, -) -> io::Result<()> { - let offset: i64 = offset.try_into().map_err(|_e| io::Errno::INVAL)?; - let len = len as i64; - - assert!(mode.is_empty()); - - let new_len = offset.checked_add(len).ok_or(io::Errno::FBIG)?; - let mut store = c::fstore_t { - fst_flags: c::F_ALLOCATECONTIG, - fst_posmode: c::F_PEOFPOSMODE, - fst_offset: 0, - fst_length: new_len, - fst_bytesalloc: 0, - }; - unsafe { - if c::fcntl(borrowed_fd(fd), c::F_PREALLOCATE, &store) == -1 { - // Unable to allocate contiguous disk space; attempt to allocate - // non-contiguously. - store.fst_flags = c::F_ALLOCATEALL; - let _ = ret_c_int(c::fcntl(borrowed_fd(fd), c::F_PREALLOCATE, &store))?; - } - ret(c::ftruncate(borrowed_fd(fd), new_len)) - } -} - -pub(crate) fn fsync(fd: BorrowedFd<'_>) -> io::Result<()> { - unsafe { ret(c::fsync(borrowed_fd(fd))) } -} - -#[cfg(not(any( - apple, - target_os = "dragonfly", - target_os = "espidf", - target_os = "haiku", - target_os = "redox", - target_os = "vita", -)))] -pub(crate) fn fdatasync(fd: BorrowedFd<'_>) -> io::Result<()> { - unsafe { ret(c::fdatasync(borrowed_fd(fd))) } -} - -pub(crate) fn ftruncate(fd: BorrowedFd<'_>, length: u64) -> io::Result<()> { - let length = length.try_into().map_err(|_overflow_err| io::Errno::FBIG)?; - unsafe { ret(c::ftruncate(borrowed_fd(fd), length)) } -} - -#[cfg(any(linux_kernel, target_os = "freebsd"))] -pub(crate) fn memfd_create(name: &CStr, flags: MemfdFlags) -> io::Result<OwnedFd> { - #[cfg(target_os = "freebsd")] - weakcall! { - fn memfd_create( - name: *const c::c_char, - flags: c::c_uint - ) -> c::c_int - } - - #[cfg(linux_kernel)] - weak_or_syscall! { - fn memfd_create( - name: *const c::c_char, - flags: c::c_uint - ) via SYS_memfd_create -> c::c_int - } - - unsafe { ret_owned_fd(memfd_create(c_str(name), bitflags_bits!(flags))) } -} - -#[cfg(linux_kernel)] -pub(crate) fn openat2( - dirfd: BorrowedFd<'_>, - path: &CStr, - oflags: OFlags, - mode: Mode, - resolve: ResolveFlags, -) -> io::Result<OwnedFd> { - use linux_raw_sys::general::open_how; - - syscall! { - fn openat2( - base_dirfd: c::c_int, - pathname: *const c::c_char, - how: *mut open_how, - size: usize - ) via SYS_OPENAT2 -> c::c_int - } - - let oflags = oflags.bits(); - let mut open_how = open_how { - flags: u64::from(oflags), - mode: u64::from(mode.bits()), - resolve: resolve.bits(), - }; - - unsafe { - ret_owned_fd(openat2( - borrowed_fd(dirfd), - c_str(path), - &mut open_how, - size_of::<open_how>(), - )) - } -} -#[cfg(all(linux_kernel, target_pointer_width = "32"))] -const SYS_OPENAT2: i32 = 437; -#[cfg(all(linux_kernel, target_pointer_width = "64"))] -const SYS_OPENAT2: i64 = 437; - -#[cfg(target_os = "linux")] -pub(crate) fn sendfile( - out_fd: BorrowedFd<'_>, - in_fd: BorrowedFd<'_>, - offset: Option<&mut u64>, - count: usize, -) -> io::Result<usize> { - unsafe { - ret_usize(c::sendfile64( - borrowed_fd(out_fd), - borrowed_fd(in_fd), - offset.map_or(null_mut(), crate::utils::as_mut_ptr).cast(), - count, - )) - } -} - -/// Convert from a Linux `statx` value to rustix's `Stat`. -#[cfg(all(linux_kernel, target_pointer_width = "32"))] -fn statx_to_stat(x: crate::fs::Statx) -> io::Result<Stat> { - Ok(Stat { - st_dev: crate::fs::makedev(x.stx_dev_major, x.stx_dev_minor).into(), - st_mode: x.stx_mode.into(), - st_nlink: x.stx_nlink.into(), - st_uid: x.stx_uid.into(), - st_gid: x.stx_gid.into(), - st_rdev: crate::fs::makedev(x.stx_rdev_major, x.stx_rdev_minor).into(), - st_size: x.stx_size.try_into().map_err(|_| io::Errno::OVERFLOW)?, - st_blksize: x.stx_blksize.into(), - st_blocks: x.stx_blocks.into(), - st_atime: x - .stx_atime - .tv_sec - .try_into() - .map_err(|_| io::Errno::OVERFLOW)?, - st_atime_nsec: x.stx_atime.tv_nsec as _, - st_mtime: x - .stx_mtime - .tv_sec - .try_into() - .map_err(|_| io::Errno::OVERFLOW)?, - st_mtime_nsec: x.stx_mtime.tv_nsec as _, - st_ctime: x - .stx_ctime - .tv_sec - .try_into() - .map_err(|_| io::Errno::OVERFLOW)?, - st_ctime_nsec: x.stx_ctime.tv_nsec as _, - st_ino: x.stx_ino.into(), - }) -} - -/// Convert from a Linux `statx` value to rustix's `Stat`. -/// -/// mips64' `struct stat64` in libc has private fields, and `stx_blocks` -#[cfg(all(linux_kernel, any(target_arch = "mips64", target_arch = "mips64r6")))] -fn statx_to_stat(x: crate::fs::Statx) -> io::Result<Stat> { - let mut result: Stat = unsafe { core::mem::zeroed() }; - - result.st_dev = crate::fs::makedev(x.stx_dev_major, x.stx_dev_minor); - result.st_mode = x.stx_mode.into(); - result.st_nlink = x.stx_nlink.into(); - result.st_uid = x.stx_uid.into(); - result.st_gid = x.stx_gid.into(); - result.st_rdev = crate::fs::makedev(x.stx_rdev_major, x.stx_rdev_minor); - result.st_size = x.stx_size.try_into().map_err(|_| io::Errno::OVERFLOW)?; - result.st_blksize = x.stx_blksize.into(); - result.st_blocks = x.stx_blocks.try_into().map_err(|_e| io::Errno::OVERFLOW)?; - result.st_atime = x - .stx_atime - .tv_sec - .try_into() - .map_err(|_| io::Errno::OVERFLOW)?; - result.st_atime_nsec = x.stx_atime.tv_nsec as _; - result.st_mtime = x - .stx_mtime - .tv_sec - .try_into() - .map_err(|_| io::Errno::OVERFLOW)?; - result.st_mtime_nsec = x.stx_mtime.tv_nsec as _; - result.st_ctime = x - .stx_ctime - .tv_sec - .try_into() - .map_err(|_| io::Errno::OVERFLOW)?; - result.st_ctime_nsec = x.stx_ctime.tv_nsec as _; - result.st_ino = x.stx_ino.into(); - - Ok(result) -} - -/// Convert from a Linux `stat64` value to rustix's `Stat`. -#[cfg(all(linux_kernel, target_pointer_width = "32"))] -fn stat64_to_stat(s64: c::stat64) -> io::Result<Stat> { - Ok(Stat { - st_dev: s64.st_dev.try_into().map_err(|_| io::Errno::OVERFLOW)?, - st_mode: s64.st_mode.try_into().map_err(|_| io::Errno::OVERFLOW)?, - st_nlink: s64.st_nlink.try_into().map_err(|_| io::Errno::OVERFLOW)?, - st_uid: s64.st_uid.try_into().map_err(|_| io::Errno::OVERFLOW)?, - st_gid: s64.st_gid.try_into().map_err(|_| io::Errno::OVERFLOW)?, - st_rdev: s64.st_rdev.try_into().map_err(|_| io::Errno::OVERFLOW)?, - st_size: s64.st_size.try_into().map_err(|_| io::Errno::OVERFLOW)?, - st_blksize: s64.st_blksize.try_into().map_err(|_| io::Errno::OVERFLOW)?, - st_blocks: s64.st_blocks.try_into().map_err(|_| io::Errno::OVERFLOW)?, - st_atime: s64.st_atime.try_into().map_err(|_| io::Errno::OVERFLOW)?, - st_atime_nsec: s64 - .st_atime_nsec - .try_into() - .map_err(|_| io::Errno::OVERFLOW)?, - st_mtime: s64.st_mtime.try_into().map_err(|_| io::Errno::OVERFLOW)?, - st_mtime_nsec: s64 - .st_mtime_nsec - .try_into() - .map_err(|_| io::Errno::OVERFLOW)?, - st_ctime: s64.st_ctime.try_into().map_err(|_| io::Errno::OVERFLOW)?, - st_ctime_nsec: s64 - .st_ctime_nsec - .try_into() - .map_err(|_| io::Errno::OVERFLOW)?, - st_ino: s64.st_ino.try_into().map_err(|_| io::Errno::OVERFLOW)?, - }) -} - -/// Convert from a Linux `stat64` value to rustix's `Stat`. -/// -/// mips64' `struct stat64` in libc has private fields, and `st_blocks` has -/// type `i64`. -#[cfg(all(linux_kernel, any(target_arch = "mips64", target_arch = "mips64r6")))] -fn stat64_to_stat(s64: c::stat64) -> io::Result<Stat> { - let mut result: Stat = unsafe { core::mem::zeroed() }; - - result.st_dev = s64.st_dev.try_into().map_err(|_| io::Errno::OVERFLOW)?; - result.st_mode = s64.st_mode.try_into().map_err(|_| io::Errno::OVERFLOW)?; - result.st_nlink = s64.st_nlink.try_into().map_err(|_| io::Errno::OVERFLOW)?; - result.st_uid = s64.st_uid.try_into().map_err(|_| io::Errno::OVERFLOW)?; - result.st_gid = s64.st_gid.try_into().map_err(|_| io::Errno::OVERFLOW)?; - result.st_rdev = s64.st_rdev.try_into().map_err(|_| io::Errno::OVERFLOW)?; - result.st_size = s64.st_size.try_into().map_err(|_| io::Errno::OVERFLOW)?; - result.st_blksize = s64.st_blksize.try_into().map_err(|_| io::Errno::OVERFLOW)?; - result.st_blocks = s64.st_blocks.try_into().map_err(|_| io::Errno::OVERFLOW)?; - result.st_atime = s64.st_atime.try_into().map_err(|_| io::Errno::OVERFLOW)?; - result.st_atime_nsec = s64 - .st_atime_nsec - .try_into() - .map_err(|_| io::Errno::OVERFLOW)?; - result.st_mtime = s64.st_mtime.try_into().map_err(|_| io::Errno::OVERFLOW)?; - result.st_mtime_nsec = s64 - .st_mtime_nsec - .try_into() - .map_err(|_| io::Errno::OVERFLOW)?; - result.st_ctime = s64.st_ctime.try_into().map_err(|_| io::Errno::OVERFLOW)?; - result.st_ctime_nsec = s64 - .st_ctime_nsec - .try_into() - .map_err(|_| io::Errno::OVERFLOW)?; - result.st_ino = s64.st_ino.try_into().map_err(|_| io::Errno::OVERFLOW)?; - - Ok(result) -} - -#[cfg(linux_kernel)] -#[allow(non_upper_case_globals)] -mod sys { - use super::{c, BorrowedFd, Statx}; - - weak_or_syscall! { - pub(super) fn statx( - dirfd_: BorrowedFd<'_>, - path: *const c::c_char, - flags: c::c_int, - mask: c::c_uint, - buf: *mut Statx - ) via SYS_statx -> c::c_int - } -} - -#[cfg(linux_kernel)] -#[allow(non_upper_case_globals)] -pub(crate) fn statx( - dirfd: BorrowedFd<'_>, - path: &CStr, - flags: AtFlags, - mask: StatxFlags, -) -> io::Result<Statx> { - // If a future Linux kernel adds more fields to `struct statx` and users - // passing flags unknown to rustix in `StatxFlags`, we could end up - // writing outside of the buffer. To prevent this possibility, we mask off - // any flags that we don't know about. - // - // This includes `STATX__RESERVED`, which has a value that we know, but - // which could take on arbitrary new meaning in the future. Linux currently - // rejects this flag with `EINVAL`, so we do the same. - // - // This doesn't rely on `STATX_ALL` because [it's deprecated] and already - // doesn't represent all the known flags. - // - // [it's deprecated]: https://patchwork.kernel.org/project/linux-fsdevel/patch/20200505095915.11275-7-mszeredi@redhat.com/ - #[cfg(not(any(target_os = "android", target_env = "musl")))] - const STATX__RESERVED: u32 = c::STATX__RESERVED as u32; - #[cfg(any(target_os = "android", target_env = "musl"))] - const STATX__RESERVED: u32 = linux_raw_sys::general::STATX__RESERVED; - if (mask.bits() & STATX__RESERVED) == STATX__RESERVED { - return Err(io::Errno::INVAL); - } - let mask = mask & StatxFlags::all(); - - let mut statx_buf = MaybeUninit::<Statx>::uninit(); - unsafe { - ret(sys::statx( - dirfd, - c_str(path), - bitflags_bits!(flags), - mask.bits(), - statx_buf.as_mut_ptr(), - ))?; - Ok(statx_buf.assume_init()) - } -} - -#[cfg(linux_kernel)] -#[inline] -pub(crate) fn is_statx_available() -> bool { - unsafe { - // Call `statx` with null pointers so that if it fails for any reason - // other than `EFAULT`, we know it's not supported. - matches!( - ret(sys::statx(CWD, null(), 0, 0, null_mut())), - Err(io::Errno::FAULT) - ) - } -} - -#[cfg(apple)] -pub(crate) unsafe fn fcopyfile( - from: BorrowedFd<'_>, - to: BorrowedFd<'_>, - state: copyfile_state_t, - flags: CopyfileFlags, -) -> io::Result<()> { - extern "C" { - fn fcopyfile( - from: c::c_int, - to: c::c_int, - state: copyfile_state_t, - flags: c::c_uint, - ) -> c::c_int; - } - - nonnegative_ret(fcopyfile( - borrowed_fd(from), - borrowed_fd(to), - state, - bitflags_bits!(flags), - )) -} - -#[cfg(apple)] -pub(crate) fn copyfile_state_alloc() -> io::Result<copyfile_state_t> { - extern "C" { - fn copyfile_state_alloc() -> copyfile_state_t; - } - - let result = unsafe { copyfile_state_alloc() }; - if result.0.is_null() { - Err(io::Errno::last_os_error()) - } else { - Ok(result) - } -} - -#[cfg(apple)] -pub(crate) unsafe fn copyfile_state_free(state: copyfile_state_t) -> io::Result<()> { - extern "C" { - fn copyfile_state_free(state: copyfile_state_t) -> c::c_int; - } - - nonnegative_ret(copyfile_state_free(state)) -} - -#[cfg(apple)] -const COPYFILE_STATE_COPIED: u32 = 8; - -#[cfg(apple)] -pub(crate) unsafe fn copyfile_state_get_copied(state: copyfile_state_t) -> io::Result<u64> { - let mut copied = MaybeUninit::<u64>::uninit(); - copyfile_state_get(state, COPYFILE_STATE_COPIED, copied.as_mut_ptr().cast())?; - Ok(copied.assume_init()) -} - -#[cfg(apple)] -pub(crate) unsafe fn copyfile_state_get( - state: copyfile_state_t, - flag: u32, - dst: *mut c::c_void, -) -> io::Result<()> { - extern "C" { - fn copyfile_state_get(state: copyfile_state_t, flag: u32, dst: *mut c::c_void) -> c::c_int; - } - - nonnegative_ret(copyfile_state_get(state, flag, dst)) -} - -#[cfg(all(apple, feature = "alloc"))] -pub(crate) fn getpath(fd: BorrowedFd<'_>) -> io::Result<CString> { - // The use of `PATH_MAX` is generally not encouraged, but it - // is inevitable in this case because macOS defines `fcntl` with - // `F_GETPATH` in terms of `MAXPATHLEN`, and there are no - // alternatives. If a better method is invented, it should be used - // instead. - let mut buf = vec![0; c::PATH_MAX as usize]; - - // From the [macOS `fcntl` manual page]: - // `F_GETPATH` - Get the path of the file descriptor `Fildes`. The argument - // must be a buffer of size `MAXPATHLEN` or greater. - // - // [macOS `fcntl` manual page]: https://developer.apple.com/library/archive/documentation/System/Conceptual/ManPages_iPhoneOS/man2/fcntl.2.html - unsafe { - ret(c::fcntl(borrowed_fd(fd), c::F_GETPATH, buf.as_mut_ptr()))?; - } - - let l = buf.iter().position(|&c| c == 0).unwrap(); - buf.truncate(l); - buf.shrink_to_fit(); - - Ok(CString::new(buf).unwrap()) -} - -#[cfg(apple)] -pub(crate) fn fcntl_rdadvise(fd: BorrowedFd<'_>, offset: u64, len: u64) -> io::Result<()> { - // From the [macOS `fcntl` manual page]: - // `F_RDADVISE` - Issue an advisory read async with no copy to user. - // - // The `F_RDADVISE` command operates on the following structure which holds - // information passed from the user to the system: - // - // ```c - // struct radvisory { - // off_t ra_offset; /* offset into the file */ - // int ra_count; /* size of the read */ - // }; - // ``` - // - // [macOS `fcntl` manual page]: https://developer.apple.com/library/archive/documentation/System/Conceptual/ManPages_iPhoneOS/man2/fcntl.2.html - let ra_offset = match offset.try_into() { - Ok(len) => len, - // If this conversion fails, the user is providing an offset outside - // any possible file extent, so just ignore it. - Err(_) => return Ok(()), - }; - let ra_count = match len.try_into() { - Ok(len) => len, - // If this conversion fails, the user is providing a dubiously large - // hint which is unlikely to improve performance. - Err(_) => return Ok(()), - }; - unsafe { - let radvisory = c::radvisory { - ra_offset, - ra_count, - }; - ret(c::fcntl(borrowed_fd(fd), c::F_RDADVISE, &radvisory)) - } -} - -#[cfg(apple)] -pub(crate) fn fcntl_fullfsync(fd: BorrowedFd<'_>) -> io::Result<()> { - unsafe { ret(c::fcntl(borrowed_fd(fd), c::F_FULLFSYNC)) } -} - -#[cfg(apple)] -pub(crate) fn fcntl_nocache(fd: BorrowedFd<'_>, value: bool) -> io::Result<()> { - unsafe { ret(c::fcntl(borrowed_fd(fd), c::F_NOCACHE, value as c::c_int)) } -} - -#[cfg(apple)] -pub(crate) fn fcntl_global_nocache(fd: BorrowedFd<'_>, value: bool) -> io::Result<()> { - unsafe { - ret(c::fcntl( - borrowed_fd(fd), - c::F_GLOBAL_NOCACHE, - value as c::c_int, - )) - } -} - -/// Convert `times` from a `futimens`/`utimensat` argument into `setattrlist` -/// arguments. -#[cfg(apple)] -fn times_to_attrlist(times: &Timestamps) -> (c::size_t, [c::timespec; 2], Attrlist) { - // ABI details. - const ATTR_CMN_MODTIME: u32 = 0x0000_0400; - const ATTR_CMN_ACCTIME: u32 = 0x0000_1000; - const ATTR_BIT_MAP_COUNT: u16 = 5; - - let mut times = times.clone(); - - // If we have any `UTIME_NOW` elements, replace them with the current time. - if times.last_access.tv_nsec == c::UTIME_NOW || times.last_modification.tv_nsec == c::UTIME_NOW - { - let now = { - let mut tv = c::timeval { - tv_sec: 0, - tv_usec: 0, - }; - unsafe { - let r = c::gettimeofday(&mut tv, null_mut()); - assert_eq!(r, 0); - } - c::timespec { - tv_sec: tv.tv_sec, - tv_nsec: (tv.tv_usec * 1000) as _, - } - }; - if times.last_access.tv_nsec == c::UTIME_NOW { - times.last_access = now; - } - if times.last_modification.tv_nsec == c::UTIME_NOW { - times.last_modification = now; - } - } - - // Pack the return values following the rules for [`getattrlist`]. - // - // [`getattrlist`]: https://developer.apple.com/library/archive/documentation/System/Conceptual/ManPages_iPhoneOS/man2/getattrlist.2.html - let mut times_size = 0; - let mut attrs = Attrlist { - bitmapcount: ATTR_BIT_MAP_COUNT, - reserved: 0, - commonattr: 0, - volattr: 0, - dirattr: 0, - fileattr: 0, - forkattr: 0, - }; - let mut return_times = [c::timespec { - tv_sec: 0, - tv_nsec: 0, - }; 2]; - let mut times_index = 0; - if times.last_modification.tv_nsec != c::UTIME_OMIT { - attrs.commonattr |= ATTR_CMN_MODTIME; - return_times[times_index] = times.last_modification; - times_index += 1; - times_size += size_of::<c::timespec>(); - } - if times.last_access.tv_nsec != c::UTIME_OMIT { - attrs.commonattr |= ATTR_CMN_ACCTIME; - return_times[times_index] = times.last_access; - times_size += size_of::<c::timespec>(); - } - - (times_size, return_times, attrs) -} - -/// Support type for `Attrlist`. -#[cfg(apple)] -type Attrgroup = u32; - -/// Attribute list for use with `setattrlist`. -#[cfg(apple)] -#[repr(C)] -struct Attrlist { - bitmapcount: u16, - reserved: u16, - commonattr: Attrgroup, - volattr: Attrgroup, - dirattr: Attrgroup, - fileattr: Attrgroup, - forkattr: Attrgroup, -} - -#[cfg(any(apple, linux_kernel))] -pub(crate) fn getxattr(path: &CStr, name: &CStr, value: &mut [u8]) -> io::Result<usize> { - let value_ptr = value.as_mut_ptr(); - - #[cfg(not(apple))] - unsafe { - ret_usize(c::getxattr( - path.as_ptr(), - name.as_ptr(), - value_ptr.cast::<c::c_void>(), - value.len(), - )) - } - - #[cfg(apple)] - unsafe { - ret_usize(c::getxattr( - path.as_ptr(), - name.as_ptr(), - value_ptr.cast::<c::c_void>(), - value.len(), - 0, - 0, - )) - } -} - -#[cfg(any(apple, linux_kernel))] -pub(crate) fn lgetxattr(path: &CStr, name: &CStr, value: &mut [u8]) -> io::Result<usize> { - let value_ptr = value.as_mut_ptr(); - - #[cfg(not(apple))] - unsafe { - ret_usize(c::lgetxattr( - path.as_ptr(), - name.as_ptr(), - value_ptr.cast::<c::c_void>(), - value.len(), - )) - } - - #[cfg(apple)] - unsafe { - ret_usize(c::getxattr( - path.as_ptr(), - name.as_ptr(), - value_ptr.cast::<c::c_void>(), - value.len(), - 0, - c::XATTR_NOFOLLOW, - )) - } -} - -#[cfg(any(apple, linux_kernel))] -pub(crate) fn fgetxattr(fd: BorrowedFd<'_>, name: &CStr, value: &mut [u8]) -> io::Result<usize> { - let value_ptr = value.as_mut_ptr(); - - #[cfg(not(apple))] - unsafe { - ret_usize(c::fgetxattr( - borrowed_fd(fd), - name.as_ptr(), - value_ptr.cast::<c::c_void>(), - value.len(), - )) - } - - #[cfg(apple)] - unsafe { - ret_usize(c::fgetxattr( - borrowed_fd(fd), - name.as_ptr(), - value_ptr.cast::<c::c_void>(), - value.len(), - 0, - 0, - )) - } -} - -#[cfg(any(apple, linux_kernel))] -pub(crate) fn setxattr( - path: &CStr, - name: &CStr, - value: &[u8], - flags: XattrFlags, -) -> io::Result<()> { - #[cfg(not(apple))] - unsafe { - ret(c::setxattr( - path.as_ptr(), - name.as_ptr(), - value.as_ptr().cast::<c::c_void>(), - value.len(), - flags.bits() as i32, - )) - } - - #[cfg(apple)] - unsafe { - ret(c::setxattr( - path.as_ptr(), - name.as_ptr(), - value.as_ptr().cast::<c::c_void>(), - value.len(), - 0, - flags.bits() as i32, - )) - } -} - -#[cfg(any(apple, linux_kernel))] -pub(crate) fn lsetxattr( - path: &CStr, - name: &CStr, - value: &[u8], - flags: XattrFlags, -) -> io::Result<()> { - #[cfg(not(apple))] - unsafe { - ret(c::lsetxattr( - path.as_ptr(), - name.as_ptr(), - value.as_ptr().cast::<c::c_void>(), - value.len(), - flags.bits() as i32, - )) - } - - #[cfg(apple)] - unsafe { - ret(c::setxattr( - path.as_ptr(), - name.as_ptr(), - value.as_ptr().cast::<c::c_void>(), - value.len(), - 0, - flags.bits() as i32 | c::XATTR_NOFOLLOW, - )) - } -} - -#[cfg(any(apple, linux_kernel))] -pub(crate) fn fsetxattr( - fd: BorrowedFd<'_>, - name: &CStr, - value: &[u8], - flags: XattrFlags, -) -> io::Result<()> { - #[cfg(not(apple))] - unsafe { - ret(c::fsetxattr( - borrowed_fd(fd), - name.as_ptr(), - value.as_ptr().cast::<c::c_void>(), - value.len(), - flags.bits() as i32, - )) - } - - #[cfg(apple)] - unsafe { - ret(c::fsetxattr( - borrowed_fd(fd), - name.as_ptr(), - value.as_ptr().cast::<c::c_void>(), - value.len(), - 0, - flags.bits() as i32, - )) - } -} - -#[cfg(any(apple, linux_kernel))] -pub(crate) fn listxattr(path: &CStr, list: &mut [c::c_char]) -> io::Result<usize> { - #[cfg(not(apple))] - unsafe { - ret_usize(c::listxattr(path.as_ptr(), list.as_mut_ptr(), list.len())) - } - - #[cfg(apple)] - unsafe { - ret_usize(c::listxattr( - path.as_ptr(), - list.as_mut_ptr(), - list.len(), - 0, - )) - } -} - -#[cfg(any(apple, linux_kernel))] -pub(crate) fn llistxattr(path: &CStr, list: &mut [c::c_char]) -> io::Result<usize> { - #[cfg(not(apple))] - unsafe { - ret_usize(c::llistxattr(path.as_ptr(), list.as_mut_ptr(), list.len())) - } - - #[cfg(apple)] - unsafe { - ret_usize(c::listxattr( - path.as_ptr(), - list.as_mut_ptr(), - list.len(), - c::XATTR_NOFOLLOW, - )) - } -} - -#[cfg(any(apple, linux_kernel))] -pub(crate) fn flistxattr(fd: BorrowedFd<'_>, list: &mut [c::c_char]) -> io::Result<usize> { - let fd = borrowed_fd(fd); - - #[cfg(not(apple))] - unsafe { - ret_usize(c::flistxattr(fd, list.as_mut_ptr(), list.len())) - } - - #[cfg(apple)] - unsafe { - ret_usize(c::flistxattr(fd, list.as_mut_ptr(), list.len(), 0)) - } -} - -#[cfg(any(apple, linux_kernel))] -pub(crate) fn removexattr(path: &CStr, name: &CStr) -> io::Result<()> { - #[cfg(not(apple))] - unsafe { - ret(c::removexattr(path.as_ptr(), name.as_ptr())) - } - - #[cfg(apple)] - unsafe { - ret(c::removexattr(path.as_ptr(), name.as_ptr(), 0)) - } -} - -#[cfg(any(apple, linux_kernel))] -pub(crate) fn lremovexattr(path: &CStr, name: &CStr) -> io::Result<()> { - #[cfg(not(apple))] - unsafe { - ret(c::lremovexattr(path.as_ptr(), name.as_ptr())) - } - - #[cfg(apple)] - unsafe { - ret(c::removexattr( - path.as_ptr(), - name.as_ptr(), - c::XATTR_NOFOLLOW, - )) - } -} - -#[cfg(any(apple, linux_kernel))] -pub(crate) fn fremovexattr(fd: BorrowedFd<'_>, name: &CStr) -> io::Result<()> { - let fd = borrowed_fd(fd); - - #[cfg(not(apple))] - unsafe { - ret(c::fremovexattr(fd, name.as_ptr())) - } - - #[cfg(apple)] - unsafe { - ret(c::fremovexattr(fd, name.as_ptr(), 0)) - } -} - -#[test] -fn test_sizes() { - #[cfg(linux_kernel)] - assert_eq_size!(c::loff_t, u64); - - // Assert that `Timestamps` has the expected layout. If we're not fixing - // y2038, libc's type should match ours. If we are, it's smaller. - #[cfg(not(fix_y2038))] - assert_eq_size!([c::timespec; 2], Timestamps); - #[cfg(fix_y2038)] - assert!(core::mem::size_of::<[c::timespec; 2]>() < core::mem::size_of::<Timestamps>()); -} diff --git a/vendor/rustix/src/backend/libc/fs/types.rs b/vendor/rustix/src/backend/libc/fs/types.rs deleted file mode 100644 index 19508c2..0000000 --- a/vendor/rustix/src/backend/libc/fs/types.rs +++ /dev/null @@ -1,1164 +0,0 @@ -use crate::backend::c; -use bitflags::bitflags; - -#[cfg(not(any(target_os = "espidf", target_os = "vita")))] -bitflags! { - /// `*_OK` constants for use with [`accessat`]. - /// - /// [`accessat`]: fn.accessat.html - #[repr(transparent)] - #[derive(Copy, Clone, Eq, PartialEq, Hash, Debug)] - pub struct Access: c::c_int { - /// `R_OK` - const READ_OK = c::R_OK; - - /// `W_OK` - const WRITE_OK = c::W_OK; - - /// `X_OK` - const EXEC_OK = c::X_OK; - - /// `F_OK` - const EXISTS = c::F_OK; - - /// <https://docs.rs/bitflags/*/bitflags/#externally-defined-flags> - const _ = !0; - } -} - -#[cfg(not(any(target_os = "espidf", target_os = "redox")))] -bitflags! { - /// `AT_*` constants for use with [`openat`], [`statat`], and other `*at` - /// functions. - /// - /// [`openat`]: crate::fs::openat - /// [`statat`]: crate::fs::statat - #[repr(transparent)] - #[derive(Copy, Clone, Eq, PartialEq, Hash, Debug)] - pub struct AtFlags: u32 { - /// `AT_SYMLINK_NOFOLLOW` - const SYMLINK_NOFOLLOW = bitcast!(c::AT_SYMLINK_NOFOLLOW); - - /// `AT_EACCESS` - #[cfg(not(any(target_os = "emscripten", target_os = "android")))] - const EACCESS = bitcast!(c::AT_EACCESS); - - /// `AT_REMOVEDIR` - const REMOVEDIR = bitcast!(c::AT_REMOVEDIR); - - /// `AT_SYMLINK_FOLLOW` - const SYMLINK_FOLLOW = bitcast!(c::AT_SYMLINK_FOLLOW); - - /// `AT_NO_AUTOMOUNT` - #[cfg(any(linux_like, target_os = "fuchsia"))] - const NO_AUTOMOUNT = bitcast!(c::AT_NO_AUTOMOUNT); - - /// `AT_EMPTY_PATH` - #[cfg(any( - linux_kernel, - target_os = "freebsd", - target_os = "fuchsia", - ))] - const EMPTY_PATH = bitcast!(c::AT_EMPTY_PATH); - - /// `AT_RESOLVE_BENEATH` - #[cfg(target_os = "freebsd")] - const RESOLVE_BENEATH = bitcast!(c::AT_RESOLVE_BENEATH); - - /// `AT_STATX_SYNC_AS_STAT` - #[cfg(all(target_os = "linux", target_env = "gnu"))] - const STATX_SYNC_AS_STAT = bitcast!(c::AT_STATX_SYNC_AS_STAT); - - /// `AT_STATX_FORCE_SYNC` - #[cfg(all(target_os = "linux", target_env = "gnu"))] - const STATX_FORCE_SYNC = bitcast!(c::AT_STATX_FORCE_SYNC); - - /// `AT_STATX_DONT_SYNC` - #[cfg(all(target_os = "linux", target_env = "gnu"))] - const STATX_DONT_SYNC = bitcast!(c::AT_STATX_DONT_SYNC); - - /// <https://docs.rs/bitflags/*/bitflags/#externally-defined-flags> - const _ = !0; - } -} - -bitflags! { - /// `S_I*` constants for use with [`openat`], [`chmodat`], and [`fchmod`]. - /// - /// [`openat`]: crate::fs::openat - /// [`chmodat`]: crate::fs::chmodat - /// [`fchmod`]: crate::fs::fchmod - #[repr(transparent)] - #[derive(Copy, Clone, Eq, PartialEq, Hash, Debug)] - pub struct Mode: RawMode { - /// `S_IRWXU` - #[cfg(not(any(target_os = "espidf", target_os = "vita")))] - const RWXU = c::S_IRWXU as RawMode; - - /// `S_IRUSR` - #[cfg(not(any(target_os = "espidf", target_os = "vita")))] - const RUSR = c::S_IRUSR as RawMode; - - /// `S_IWUSR` - #[cfg(not(any(target_os = "espidf", target_os = "vita")))] - const WUSR = c::S_IWUSR as RawMode; - - /// `S_IXUSR` - #[cfg(not(any(target_os = "espidf", target_os = "vita")))] - const XUSR = c::S_IXUSR as RawMode; - - /// `S_IRWXG` - #[cfg(not(any(target_os = "espidf", target_os = "vita")))] - const RWXG = c::S_IRWXG as RawMode; - - /// `S_IRGRP` - #[cfg(not(any(target_os = "espidf", target_os = "vita")))] - const RGRP = c::S_IRGRP as RawMode; - - /// `S_IWGRP` - #[cfg(not(any(target_os = "espidf", target_os = "vita")))] - const WGRP = c::S_IWGRP as RawMode; - - /// `S_IXGRP` - #[cfg(not(any(target_os = "espidf", target_os = "vita")))] - const XGRP = c::S_IXGRP as RawMode; - - /// `S_IRWXO` - #[cfg(not(any(target_os = "espidf", target_os = "vita")))] - const RWXO = c::S_IRWXO as RawMode; - - /// `S_IROTH` - #[cfg(not(any(target_os = "espidf", target_os = "vita")))] - const ROTH = c::S_IROTH as RawMode; - - /// `S_IWOTH` - #[cfg(not(any(target_os = "espidf", target_os = "vita")))] - const WOTH = c::S_IWOTH as RawMode; - - /// `S_IXOTH` - #[cfg(not(any(target_os = "espidf", target_os = "vita")))] - const XOTH = c::S_IXOTH as RawMode; - - /// `S_ISUID` - #[cfg(not(any(target_os = "espidf", target_os = "vita")))] - const SUID = c::S_ISUID as RawMode; - - /// `S_ISGID` - #[cfg(not(any(target_os = "espidf", target_os = "vita")))] - const SGID = c::S_ISGID as RawMode; - - /// `S_ISVTX` - #[cfg(not(any(target_os = "espidf", target_os = "vita")))] - const SVTX = c::S_ISVTX as RawMode; - - /// <https://docs.rs/bitflags/*/bitflags/#externally-defined-flags> - const _ = !0; - } -} - -#[cfg(not(target_os = "espidf"))] -impl Mode { - /// Construct a `Mode` from the mode bits of the `st_mode` field of a - /// `Mode`. - #[inline] - pub const fn from_raw_mode(st_mode: RawMode) -> Self { - Self::from_bits_truncate(st_mode) - } - - /// Construct an `st_mode` value from a `Mode`. - #[inline] - pub const fn as_raw_mode(self) -> RawMode { - self.bits() - } -} - -#[cfg(not(target_os = "espidf"))] -impl From<RawMode> for Mode { - /// Support conversions from raw mode values to `Mode`. - /// - /// ``` - /// use rustix::fs::{Mode, RawMode}; - /// assert_eq!(Mode::from(0o700), Mode::RWXU); - /// ``` - #[inline] - fn from(st_mode: RawMode) -> Self { - Self::from_raw_mode(st_mode) - } -} - -#[cfg(not(target_os = "espidf"))] -impl From<Mode> for RawMode { - /// Support conversions from `Mode` to raw mode values. - /// - /// ``` - /// use rustix::fs::{Mode, RawMode}; - /// assert_eq!(RawMode::from(Mode::RWXU), 0o700); - /// ``` - #[inline] - fn from(mode: Mode) -> Self { - mode.as_raw_mode() - } -} - -bitflags! { - /// `O_*` constants for use with [`openat`]. - /// - /// [`openat`]: crate::fs::openat - #[repr(transparent)] - #[derive(Copy, Clone, Eq, PartialEq, Hash, Debug)] - pub struct OFlags: u32 { - /// `O_ACCMODE` - const ACCMODE = bitcast!(c::O_ACCMODE); - - /// Similar to `ACCMODE`, but just includes the read/write flags, and - /// no other flags. - /// - /// On some platforms, `PATH` may be included in `ACCMODE`, when - /// sometimes we really just want the read/write bits. Caution is - /// indicated, as the presence of `PATH` may mean that the read/write - /// bits don't have their usual meaning. - const RWMODE = bitcast!(c::O_RDONLY | c::O_WRONLY | c::O_RDWR); - - /// `O_APPEND` - const APPEND = bitcast!(c::O_APPEND); - - /// `O_CREAT` - #[doc(alias = "CREAT")] - const CREATE = bitcast!(c::O_CREAT); - - /// `O_DIRECTORY` - #[cfg(not(target_os = "espidf"))] - const DIRECTORY = bitcast!(c::O_DIRECTORY); - - /// `O_DSYNC` - #[cfg(not(any(target_os = "dragonfly", target_os = "espidf", target_os = "l4re", target_os = "redox", target_os = "vita")))] - const DSYNC = bitcast!(c::O_DSYNC); - - /// `O_EXCL` - const EXCL = bitcast!(c::O_EXCL); - - /// `O_FSYNC` - #[cfg(any( - bsd, - all(target_os = "linux", not(target_env = "musl")), - ))] - const FSYNC = bitcast!(c::O_FSYNC); - - /// `O_NOFOLLOW` - #[cfg(not(target_os = "espidf"))] - const NOFOLLOW = bitcast!(c::O_NOFOLLOW); - - /// `O_NONBLOCK` - const NONBLOCK = bitcast!(c::O_NONBLOCK); - - /// `O_RDONLY` - const RDONLY = bitcast!(c::O_RDONLY); - - /// `O_WRONLY` - const WRONLY = bitcast!(c::O_WRONLY); - - /// `O_RDWR` - /// - /// This is not equal to `RDONLY | WRONLY`. It's a distinct flag. - const RDWR = bitcast!(c::O_RDWR); - - /// `O_NOCTTY` - #[cfg(not(any(target_os = "espidf", target_os = "l4re", target_os = "redox", target_os = "vita")))] - const NOCTTY = bitcast!(c::O_NOCTTY); - - /// `O_RSYNC` - #[cfg(any( - linux_kernel, - netbsdlike, - target_os = "emscripten", - target_os = "wasi", - ))] - const RSYNC = bitcast!(c::O_RSYNC); - - /// `O_SYNC` - #[cfg(not(any(target_os = "l4re", target_os = "redox")))] - const SYNC = bitcast!(c::O_SYNC); - - /// `O_TRUNC` - const TRUNC = bitcast!(c::O_TRUNC); - - /// `O_PATH` - #[cfg(any( - linux_kernel, - target_os = "emscripten", - target_os = "freebsd", - target_os = "fuchsia", - target_os = "redox", - ))] - const PATH = bitcast!(c::O_PATH); - - /// `O_CLOEXEC` - const CLOEXEC = bitcast!(c::O_CLOEXEC); - - /// `O_TMPFILE` - #[cfg(any( - linux_kernel, - target_os = "emscripten", - target_os = "fuchsia", - ))] - const TMPFILE = bitcast!(c::O_TMPFILE); - - /// `O_NOATIME` - #[cfg(any( - linux_kernel, - target_os = "fuchsia", - ))] - const NOATIME = bitcast!(c::O_NOATIME); - - /// `O_DIRECT` - #[cfg(any( - linux_kernel, - target_os = "emscripten", - target_os = "freebsd", - target_os = "fuchsia", - target_os = "netbsd", - ))] - const DIRECT = bitcast!(c::O_DIRECT); - - /// `O_RESOLVE_BENEATH` - #[cfg(target_os = "freebsd")] - const RESOLVE_BENEATH = bitcast!(c::O_RESOLVE_BENEATH); - - /// `O_EMPTY_PATH` - #[cfg(target_os = "freebsd")] - const EMPTY_PATH = bitcast!(c::O_EMPTY_PATH); - - /// <https://docs.rs/bitflags/*/bitflags/#externally-defined-flags> - const _ = !0; - } -} - -#[cfg(apple)] -bitflags! { - /// `CLONE_*` constants for use with [`fclonefileat`]. - /// - /// [`fclonefileat`]: crate::fs::fclonefileat - #[repr(transparent)] - #[derive(Copy, Clone, Eq, PartialEq, Hash, Debug)] - pub struct CloneFlags: u32 { - /// `CLONE_NOFOLLOW` - const NOFOLLOW = 1; - - /// `CLONE_NOOWNERCOPY` - const NOOWNERCOPY = 2; - - /// <https://docs.rs/bitflags/*/bitflags/#externally-defined-flags> - const _ = !0; - } -} - -#[cfg(apple)] -mod copyfile { - pub(super) const ACL: u32 = 1 << 0; - pub(super) const STAT: u32 = 1 << 1; - pub(super) const XATTR: u32 = 1 << 2; - pub(super) const DATA: u32 = 1 << 3; - pub(super) const SECURITY: u32 = STAT | ACL; - pub(super) const METADATA: u32 = SECURITY | XATTR; - pub(super) const ALL: u32 = METADATA | DATA; -} - -#[cfg(apple)] -bitflags! { - /// `COPYFILE_*` constants for use with [`fcopyfile`]. - /// - /// [`fcopyfile`]: crate::fs::fcopyfile - #[repr(transparent)] - #[derive(Copy, Clone, Eq, PartialEq, Hash, Debug)] - pub struct CopyfileFlags: c::c_uint { - /// `COPYFILE_ACL` - const ACL = copyfile::ACL; - - /// `COPYFILE_STAT` - const STAT = copyfile::STAT; - - /// `COPYFILE_XATTR` - const XATTR = copyfile::XATTR; - - /// `COPYFILE_DATA` - const DATA = copyfile::DATA; - - /// `COPYFILE_SECURITY` - const SECURITY = copyfile::SECURITY; - - /// `COPYFILE_METADATA` - const METADATA = copyfile::METADATA; - - /// `COPYFILE_ALL` - const ALL = copyfile::ALL; - - /// <https://docs.rs/bitflags/*/bitflags/#externally-defined-flags> - const _ = !0; - } -} - -#[cfg(linux_kernel)] -bitflags! { - /// `RESOLVE_*` constants for use with [`openat2`]. - /// - /// [`openat2`]: crate::fs::openat2 - #[repr(transparent)] - #[derive(Default, Copy, Clone, Eq, PartialEq, Hash, Debug)] - pub struct ResolveFlags: u64 { - /// `RESOLVE_NO_XDEV` - const NO_XDEV = 0x01; - - /// `RESOLVE_NO_MAGICLINKS` - const NO_MAGICLINKS = 0x02; - - /// `RESOLVE_NO_SYMLINKS` - const NO_SYMLINKS = 0x04; - - /// `RESOLVE_BENEATH` - const BENEATH = 0x08; - - /// `RESOLVE_IN_ROOT` - const IN_ROOT = 0x10; - - /// `RESOLVE_CACHED` (since Linux 5.12) - const CACHED = 0x20; - - /// <https://docs.rs/bitflags/*/bitflags/#externally-defined-flags> - const _ = !0; - } -} - -#[cfg(linux_kernel)] -bitflags! { - /// `RENAME_*` constants for use with [`renameat_with`]. - /// - /// [`renameat_with`]: crate::fs::renameat_with - #[repr(transparent)] - #[derive(Copy, Clone, Eq, PartialEq, Hash, Debug)] - pub struct RenameFlags: c::c_uint { - /// `RENAME_EXCHANGE` - const EXCHANGE = bitcast!(c::RENAME_EXCHANGE); - - /// `RENAME_NOREPLACE` - const NOREPLACE = bitcast!(c::RENAME_NOREPLACE); - - /// `RENAME_WHITEOUT` - const WHITEOUT = bitcast!(c::RENAME_WHITEOUT); - - /// <https://docs.rs/bitflags/*/bitflags/#externally-defined-flags> - const _ = !0; - } -} - -/// `S_IF*` constants for use with [`mknodat`] and [`Stat`]'s `st_mode` field. -/// -/// [`mknodat`]: crate::fs::mknodat -/// [`Stat`]: crate::fs::Stat -#[derive(Clone, Copy, Debug, PartialEq, Eq)] -pub enum FileType { - /// `S_IFREG` - RegularFile = c::S_IFREG as isize, - - /// `S_IFDIR` - Directory = c::S_IFDIR as isize, - - /// `S_IFLNK` - Symlink = c::S_IFLNK as isize, - - /// `S_IFIFO` - #[cfg(not(target_os = "wasi"))] // TODO: Use WASI's `S_IFIFO`. - #[doc(alias = "IFO")] - Fifo = c::S_IFIFO as isize, - - /// `S_IFSOCK` - #[cfg(not(target_os = "wasi"))] // TODO: Use WASI's `S_IFSOCK`. - Socket = c::S_IFSOCK as isize, - - /// `S_IFCHR` - CharacterDevice = c::S_IFCHR as isize, - - /// `S_IFBLK` - BlockDevice = c::S_IFBLK as isize, - - /// An unknown filesystem object. - Unknown, -} - -impl FileType { - /// Construct a `FileType` from the `S_IFMT` bits of the `st_mode` field of - /// a `Stat`. - #[inline] - pub const fn from_raw_mode(st_mode: RawMode) -> Self { - match (st_mode as c::mode_t) & c::S_IFMT { - c::S_IFREG => Self::RegularFile, - c::S_IFDIR => Self::Directory, - c::S_IFLNK => Self::Symlink, - #[cfg(not(target_os = "wasi"))] // TODO: Use WASI's `S_IFIFO`. - c::S_IFIFO => Self::Fifo, - #[cfg(not(target_os = "wasi"))] // TODO: Use WASI's `S_IFSOCK`. - c::S_IFSOCK => Self::Socket, - c::S_IFCHR => Self::CharacterDevice, - c::S_IFBLK => Self::BlockDevice, - _ => Self::Unknown, - } - } - - /// Construct an `st_mode` value from a `FileType`. - #[inline] - pub const fn as_raw_mode(self) -> RawMode { - match self { - Self::RegularFile => c::S_IFREG as RawMode, - Self::Directory => c::S_IFDIR as RawMode, - Self::Symlink => c::S_IFLNK as RawMode, - #[cfg(not(target_os = "wasi"))] // TODO: Use WASI's `S_IFIFO`. - Self::Fifo => c::S_IFIFO as RawMode, - #[cfg(not(target_os = "wasi"))] // TODO: Use WASI's `S_IFSOCK`. - Self::Socket => c::S_IFSOCK as RawMode, - Self::CharacterDevice => c::S_IFCHR as RawMode, - Self::BlockDevice => c::S_IFBLK as RawMode, - Self::Unknown => c::S_IFMT as RawMode, - } - } - - /// Construct a `FileType` from the `d_type` field of a `c::dirent`. - #[cfg(not(any( - solarish, - target_os = "aix", - target_os = "espidf", - target_os = "haiku", - target_os = "nto", - target_os = "redox", - target_os = "vita" - )))] - #[inline] - pub(crate) const fn from_dirent_d_type(d_type: u8) -> Self { - match d_type { - c::DT_REG => Self::RegularFile, - c::DT_DIR => Self::Directory, - c::DT_LNK => Self::Symlink, - #[cfg(not(target_os = "wasi"))] // TODO: Use WASI's `DT_SOCK`. - c::DT_SOCK => Self::Socket, - #[cfg(not(target_os = "wasi"))] // TODO: Use WASI's `DT_FIFO`. - c::DT_FIFO => Self::Fifo, - c::DT_CHR => Self::CharacterDevice, - c::DT_BLK => Self::BlockDevice, - // c::DT_UNKNOWN | - _ => Self::Unknown, - } - } -} - -/// `POSIX_FADV_*` constants for use with [`fadvise`]. -/// -/// [`fadvise`]: crate::fs::fadvise -#[cfg(not(any( - apple, - netbsdlike, - solarish, - target_os = "dragonfly", - target_os = "espidf", - target_os = "haiku", - target_os = "redox", - target_os = "vita", -)))] -#[derive(Debug, Copy, Clone, Eq, PartialEq)] -#[repr(u32)] -pub enum Advice { - /// `POSIX_FADV_NORMAL` - Normal = c::POSIX_FADV_NORMAL as c::c_uint, - - /// `POSIX_FADV_SEQUENTIAL` - Sequential = c::POSIX_FADV_SEQUENTIAL as c::c_uint, - - /// `POSIX_FADV_RANDOM` - Random = c::POSIX_FADV_RANDOM as c::c_uint, - - /// `POSIX_FADV_NOREUSE` - NoReuse = c::POSIX_FADV_NOREUSE as c::c_uint, - - /// `POSIX_FADV_WILLNEED` - WillNeed = c::POSIX_FADV_WILLNEED as c::c_uint, - - /// `POSIX_FADV_DONTNEED` - DontNeed = c::POSIX_FADV_DONTNEED as c::c_uint, -} - -#[cfg(any(linux_kernel, target_os = "freebsd"))] -bitflags! { - /// `MFD_*` constants for use with [`memfd_create`]. - /// - /// [`memfd_create`]: crate::fs::memfd_create - #[repr(transparent)] - #[derive(Copy, Clone, Eq, PartialEq, Hash, Debug)] - pub struct MemfdFlags: c::c_uint { - /// `MFD_CLOEXEC` - const CLOEXEC = c::MFD_CLOEXEC; - - /// `MFD_ALLOW_SEALING` - const ALLOW_SEALING = c::MFD_ALLOW_SEALING; - - /// `MFD_HUGETLB` (since Linux 4.14) - const HUGETLB = c::MFD_HUGETLB; - - /// `MFD_HUGE_64KB` - const HUGE_64KB = c::MFD_HUGE_64KB; - /// `MFD_HUGE_512JB` - const HUGE_512KB = c::MFD_HUGE_512KB; - /// `MFD_HUGE_1MB` - const HUGE_1MB = c::MFD_HUGE_1MB; - /// `MFD_HUGE_2MB` - const HUGE_2MB = c::MFD_HUGE_2MB; - /// `MFD_HUGE_8MB` - const HUGE_8MB = c::MFD_HUGE_8MB; - /// `MFD_HUGE_16MB` - const HUGE_16MB = c::MFD_HUGE_16MB; - /// `MFD_HUGE_32MB` - const HUGE_32MB = c::MFD_HUGE_32MB; - /// `MFD_HUGE_256MB` - const HUGE_256MB = c::MFD_HUGE_256MB; - /// `MFD_HUGE_512MB` - const HUGE_512MB = c::MFD_HUGE_512MB; - /// `MFD_HUGE_1GB` - const HUGE_1GB = c::MFD_HUGE_1GB; - /// `MFD_HUGE_2GB` - const HUGE_2GB = c::MFD_HUGE_2GB; - /// `MFD_HUGE_16GB` - const HUGE_16GB = c::MFD_HUGE_16GB; - - /// <https://docs.rs/bitflags/*/bitflags/#externally-defined-flags> - const _ = !0; - } -} - -#[cfg(any(linux_kernel, target_os = "freebsd", target_os = "fuchsia"))] -bitflags! { - /// `F_SEAL_*` constants for use with [`fcntl_add_seals`] and - /// [`fcntl_get_seals`]. - /// - /// [`fcntl_add_seals`]: crate::fs::fcntl_add_seals - /// [`fcntl_get_seals`]: crate::fs::fcntl_get_seals - #[repr(transparent)] - #[derive(Copy, Clone, Eq, PartialEq, Hash, Debug)] - pub struct SealFlags: u32 { - /// `F_SEAL_SEAL` - const SEAL = bitcast!(c::F_SEAL_SEAL); - /// `F_SEAL_SHRINK` - const SHRINK = bitcast!(c::F_SEAL_SHRINK); - /// `F_SEAL_GROW` - const GROW = bitcast!(c::F_SEAL_GROW); - /// `F_SEAL_WRITE` - const WRITE = bitcast!(c::F_SEAL_WRITE); - /// `F_SEAL_FUTURE_WRITE` (since Linux 5.1) - #[cfg(linux_kernel)] - const FUTURE_WRITE = bitcast!(c::F_SEAL_FUTURE_WRITE); - - /// <https://docs.rs/bitflags/*/bitflags/#externally-defined-flags> - const _ = !0; - } -} - -#[cfg(all(target_os = "linux", target_env = "gnu"))] -bitflags! { - /// `STATX_*` constants for use with [`statx`]. - /// - /// [`statx`]: crate::fs::statx - #[repr(transparent)] - #[derive(Copy, Clone, Eq, PartialEq, Hash, Debug)] - pub struct StatxFlags: u32 { - /// `STATX_TYPE` - const TYPE = c::STATX_TYPE; - - /// `STATX_MODE` - const MODE = c::STATX_MODE; - - /// `STATX_NLINK` - const NLINK = c::STATX_NLINK; - - /// `STATX_UID` - const UID = c::STATX_UID; - - /// `STATX_GID` - const GID = c::STATX_GID; - - /// `STATX_ATIME` - const ATIME = c::STATX_ATIME; - - /// `STATX_MTIME` - const MTIME = c::STATX_MTIME; - - /// `STATX_CTIME` - const CTIME = c::STATX_CTIME; - - /// `STATX_INO` - const INO = c::STATX_INO; - - /// `STATX_SIZE` - const SIZE = c::STATX_SIZE; - - /// `STATX_BLOCKS` - const BLOCKS = c::STATX_BLOCKS; - - /// `STATX_BASIC_STATS` - const BASIC_STATS = c::STATX_BASIC_STATS; - - /// `STATX_BTIME` - const BTIME = c::STATX_BTIME; - - /// `STATX_MNT_ID` (since Linux 5.8) - const MNT_ID = c::STATX_MNT_ID; - - /// `STATX_DIOALIGN` (since Linux 6.1) - const DIOALIGN = c::STATX_DIOALIGN; - - /// `STATX_ALL` - const ALL = c::STATX_ALL; - - /// <https://docs.rs/bitflags/*/bitflags/#externally-defined-flags> - const _ = !0; - } -} - -#[cfg(any( - target_os = "android", - all(target_os = "linux", not(target_env = "gnu")), -))] -bitflags! { - /// `STATX_*` constants for use with [`statx`]. - /// - /// [`statx`]: crate::fs::statx - #[repr(transparent)] - #[derive(Copy, Clone, Eq, PartialEq, Hash, Debug)] - pub struct StatxFlags: u32 { - /// `STATX_TYPE` - const TYPE = 0x0001; - - /// `STATX_MODE` - const MODE = 0x0002; - - /// `STATX_NLINK` - const NLINK = 0x0004; - - /// `STATX_UID` - const UID = 0x0008; - - /// `STATX_GID` - const GID = 0x0010; - - /// `STATX_ATIME` - const ATIME = 0x0020; - - /// `STATX_MTIME` - const MTIME = 0x0040; - - /// `STATX_CTIME` - const CTIME = 0x0080; - - /// `STATX_INO` - const INO = 0x0100; - - /// `STATX_SIZE` - const SIZE = 0x0200; - - /// `STATX_BLOCKS` - const BLOCKS = 0x0400; - - /// `STATX_BASIC_STATS` - const BASIC_STATS = 0x07ff; - - /// `STATX_BTIME` - const BTIME = 0x800; - - /// `STATX_MNT_ID` (since Linux 5.8) - const MNT_ID = 0x1000; - - /// `STATX_ALL` - const ALL = 0xfff; - - /// <https://docs.rs/bitflags/*/bitflags/#externally-defined-flags> - const _ = !0; - } -} - -#[cfg(not(any( - netbsdlike, - solarish, - target_os = "aix", - target_os = "espidf", - target_os = "nto", - target_os = "redox", - target_os = "vita" -)))] -bitflags! { - /// `FALLOC_FL_*` constants for use with [`fallocate`]. - /// - /// [`fallocate`]: crate::fs::fallocate - #[repr(transparent)] - #[derive(Copy, Clone, Eq, PartialEq, Hash, Debug)] - pub struct FallocateFlags: u32 { - /// `FALLOC_FL_KEEP_SIZE` - #[cfg(not(any( - bsd, - target_os = "aix", - target_os = "haiku", - target_os = "hurd", - target_os = "wasi", - )))] - const KEEP_SIZE = bitcast!(c::FALLOC_FL_KEEP_SIZE); - /// `FALLOC_FL_PUNCH_HOLE` - #[cfg(not(any( - bsd, - target_os = "aix", - target_os = "haiku", - target_os = "hurd", - target_os = "wasi", - )))] - const PUNCH_HOLE = bitcast!(c::FALLOC_FL_PUNCH_HOLE); - /// `FALLOC_FL_NO_HIDE_STALE` - #[cfg(not(any( - bsd, - target_os = "aix", - target_os = "emscripten", - target_os = "fuchsia", - target_os = "haiku", - target_os = "hurd", - target_os = "l4re", - target_os = "linux", - target_os = "wasi", - )))] - const NO_HIDE_STALE = bitcast!(c::FALLOC_FL_NO_HIDE_STALE); - /// `FALLOC_FL_COLLAPSE_RANGE` - #[cfg(not(any( - bsd, - target_os = "aix", - target_os = "haiku", - target_os = "hurd", - target_os = "emscripten", - target_os = "wasi", - )))] - const COLLAPSE_RANGE = bitcast!(c::FALLOC_FL_COLLAPSE_RANGE); - /// `FALLOC_FL_ZERO_RANGE` - #[cfg(not(any( - bsd, - target_os = "aix", - target_os = "haiku", - target_os = "hurd", - target_os = "emscripten", - target_os = "wasi", - )))] - const ZERO_RANGE = bitcast!(c::FALLOC_FL_ZERO_RANGE); - /// `FALLOC_FL_INSERT_RANGE` - #[cfg(not(any( - bsd, - target_os = "aix", - target_os = "haiku", - target_os = "hurd", - target_os = "emscripten", - target_os = "wasi", - )))] - const INSERT_RANGE = bitcast!(c::FALLOC_FL_INSERT_RANGE); - /// `FALLOC_FL_UNSHARE_RANGE` - #[cfg(not(any( - bsd, - target_os = "aix", - target_os = "haiku", - target_os = "hurd", - target_os = "emscripten", - target_os = "wasi", - )))] - const UNSHARE_RANGE = bitcast!(c::FALLOC_FL_UNSHARE_RANGE); - - /// <https://docs.rs/bitflags/*/bitflags/#externally-defined-flags> - const _ = !0; - } -} - -#[cfg(not(any(target_os = "haiku", target_os = "redox", target_os = "wasi")))] -bitflags! { - /// `ST_*` constants for use with [`StatVfs`]. - #[repr(transparent)] - #[derive(Copy, Clone, Eq, PartialEq, Hash, Debug)] - pub struct StatVfsMountFlags: u64 { - /// `ST_MANDLOCK` - #[cfg(any(linux_kernel, target_os = "emscripten", target_os = "fuchsia"))] - const MANDLOCK = c::ST_MANDLOCK as u64; - - /// `ST_NOATIME` - #[cfg(any(linux_kernel, target_os = "emscripten", target_os = "fuchsia"))] - const NOATIME = c::ST_NOATIME as u64; - - /// `ST_NODEV` - #[cfg(any( - linux_kernel, - target_os = "aix", - target_os = "emscripten", - target_os = "fuchsia" - ))] - const NODEV = c::ST_NODEV as u64; - - /// `ST_NODIRATIME` - #[cfg(any(linux_kernel, target_os = "emscripten", target_os = "fuchsia"))] - const NODIRATIME = c::ST_NODIRATIME as u64; - - /// `ST_NOEXEC` - #[cfg(any(linux_kernel, target_os = "emscripten", target_os = "fuchsia"))] - const NOEXEC = c::ST_NOEXEC as u64; - - /// `ST_NOSUID` - #[cfg(not(any(target_os = "espidf", target_os = "vita")))] - const NOSUID = c::ST_NOSUID as u64; - - /// `ST_RDONLY` - #[cfg(not(any(target_os = "espidf", target_os = "vita")))] - const RDONLY = c::ST_RDONLY as u64; - - /// `ST_RELATIME` - #[cfg(any(target_os = "android", all(target_os = "linux", target_env = "gnu")))] - const RELATIME = c::ST_RELATIME as u64; - - /// `ST_SYNCHRONOUS` - #[cfg(any(linux_kernel, target_os = "emscripten", target_os = "fuchsia"))] - const SYNCHRONOUS = c::ST_SYNCHRONOUS as u64; - - /// <https://docs.rs/bitflags/*/bitflags/#externally-defined-flags> - const _ = !0; - } -} - -/// `LOCK_*` constants for use with [`flock`] and [`fcntl_lock`]. -/// -/// [`flock`]: crate::fs::flock -/// [`fcntl_lock`]: crate::fs::fcntl_lock -#[cfg(not(any(target_os = "espidf", target_os = "vita", target_os = "wasi")))] -#[derive(Clone, Copy, Debug, PartialEq, Eq)] -#[repr(u32)] -pub enum FlockOperation { - /// `LOCK_SH` - LockShared = bitcast!(c::LOCK_SH), - /// `LOCK_EX` - LockExclusive = bitcast!(c::LOCK_EX), - /// `LOCK_UN` - Unlock = bitcast!(c::LOCK_UN), - /// `LOCK_SH | LOCK_NB` - NonBlockingLockShared = bitcast!(c::LOCK_SH | c::LOCK_NB), - /// `LOCK_EX | LOCK_NB` - NonBlockingLockExclusive = bitcast!(c::LOCK_EX | c::LOCK_NB), - /// `LOCK_UN | LOCK_NB` - NonBlockingUnlock = bitcast!(c::LOCK_UN | c::LOCK_NB), -} - -/// `struct stat` for use with [`statat`] and [`fstat`]. -/// -/// [`statat`]: crate::fs::statat -/// [`fstat`]: crate::fs::fstat -#[cfg(not(any(linux_like, target_os = "hurd")))] -pub type Stat = c::stat; - -/// `struct stat` for use with [`statat`] and [`fstat`]. -/// -/// [`statat`]: crate::fs::statat -/// [`fstat`]: crate::fs::fstat -#[cfg(any( - all(linux_kernel, target_pointer_width = "64"), - target_os = "hurd", - target_os = "emscripten", - target_os = "l4re", -))] -pub type Stat = c::stat64; - -/// `struct stat` for use with [`statat`] and [`fstat`]. -/// -/// [`statat`]: crate::fs::statat -/// [`fstat`]: crate::fs::fstat -// On 32-bit, Linux's `struct stat64` has a 32-bit `st_mtime` and friends, so -// we use our own struct, populated from `statx` where possible, to avoid the -// y2038 bug. -#[cfg(all(linux_kernel, target_pointer_width = "32"))] -#[repr(C)] -#[derive(Debug, Copy, Clone)] -#[allow(missing_docs)] -pub struct Stat { - pub st_dev: u64, - pub st_mode: u32, - pub st_nlink: u32, - pub st_uid: u32, - pub st_gid: u32, - pub st_rdev: u64, - pub st_size: i64, - pub st_blksize: u32, - pub st_blocks: u64, - pub st_atime: u64, - pub st_atime_nsec: u32, - pub st_mtime: u64, - pub st_mtime_nsec: u32, - pub st_ctime: u64, - pub st_ctime_nsec: u32, - pub st_ino: u64, -} - -/// `struct statfs` for use with [`statfs`] and [`fstatfs`]. -/// -/// [`statfs`]: crate::fs::statfs -/// [`fstatfs`]: crate::fs::fstatfs -#[cfg(not(any( - linux_like, - solarish, - target_os = "espidf", - target_os = "haiku", - target_os = "netbsd", - target_os = "nto", - target_os = "redox", - target_os = "vita", - target_os = "wasi", -)))] -#[allow(clippy::module_name_repetitions)] -pub type StatFs = c::statfs; - -/// `struct statfs` for use with [`statfs`] and [`fstatfs`]. -/// -/// [`statfs`]: crate::fs::statfs -/// [`fstatfs`]: crate::fs::fstatfs -#[cfg(linux_like)] -pub type StatFs = c::statfs64; - -/// `struct statvfs` for use with [`statvfs`] and [`fstatvfs`]. -/// -/// [`statvfs`]: crate::fs::statvfs -/// [`fstatvfs`]: crate::fs::fstatvfs -#[cfg(not(any(target_os = "haiku", target_os = "redox", target_os = "wasi")))] -#[allow(missing_docs)] -pub struct StatVfs { - pub f_bsize: u64, - pub f_frsize: u64, - pub f_blocks: u64, - pub f_bfree: u64, - pub f_bavail: u64, - pub f_files: u64, - pub f_ffree: u64, - pub f_favail: u64, - pub f_fsid: u64, - pub f_flag: StatVfsMountFlags, - pub f_namemax: u64, -} - -/// `struct statx` for use with [`statx`]. -/// -/// [`statx`]: crate::fs::statx -#[cfg(all(target_os = "linux", target_env = "gnu"))] -// Use the glibc `struct statx`. -pub type Statx = c::statx; - -/// `struct statx_timestamp` for use with [`Statx`]. -#[cfg(all(target_os = "linux", target_env = "gnu"))] -// Use the glibc `struct statx_timestamp`. -pub type StatxTimestamp = c::statx; - -/// `struct statx` for use with [`statx`]. -/// -/// [`statx`]: crate::fs::statx -// Non-glibc ABIs don't currently declare a `struct statx`, so we declare it -// ourselves. -#[cfg(any( - target_os = "android", - all(target_os = "linux", not(target_env = "gnu")), -))] -#[repr(C)] -#[allow(missing_docs)] -pub struct Statx { - pub stx_mask: u32, - pub stx_blksize: u32, - pub stx_attributes: u64, - pub stx_nlink: u32, - pub stx_uid: u32, - pub stx_gid: u32, - pub stx_mode: u16, - __statx_pad1: [u16; 1], - pub stx_ino: u64, - pub stx_size: u64, - pub stx_blocks: u64, - pub stx_attributes_mask: u64, - pub stx_atime: StatxTimestamp, - pub stx_btime: StatxTimestamp, - pub stx_ctime: StatxTimestamp, - pub stx_mtime: StatxTimestamp, - pub stx_rdev_major: u32, - pub stx_rdev_minor: u32, - pub stx_dev_major: u32, - pub stx_dev_minor: u32, - pub stx_mnt_id: u64, - __statx_pad2: u64, - __statx_pad3: [u64; 12], -} - -/// `struct statx_timestamp` for use with [`Statx`]. -// Non-glibc ABIs don't currently declare a `struct statx_timestamp`, so we -// declare it ourselves. -#[cfg(any( - target_os = "android", - all(target_os = "linux", not(target_env = "gnu")), -))] -#[repr(C)] -#[allow(missing_docs)] -pub struct StatxTimestamp { - pub tv_sec: i64, - pub tv_nsec: u32, - pub __statx_timestamp_pad1: [i32; 1], -} - -/// `mode_t` -#[cfg(not(all(target_os = "android", target_pointer_width = "32")))] -pub type RawMode = c::mode_t; - -/// `mode_t` -#[cfg(all(target_os = "android", target_pointer_width = "32"))] -pub type RawMode = c::c_uint; - -/// `dev_t` -#[cfg(not(all(target_os = "android", target_pointer_width = "32")))] -pub type Dev = c::dev_t; - -/// `dev_t` -#[cfg(all(target_os = "android", target_pointer_width = "32"))] -pub type Dev = c::c_ulonglong; - -/// `__fsword_t` -#[cfg(all( - target_os = "linux", - not(target_env = "musl"), - not(target_arch = "s390x"), -))] -pub type FsWord = c::__fsword_t; - -/// `__fsword_t` -#[cfg(all( - any(target_os = "android", all(target_os = "linux", target_env = "musl")), - target_pointer_width = "32", -))] -pub type FsWord = u32; - -/// `__fsword_t` -#[cfg(all( - any(target_os = "android", all(target_os = "linux", target_env = "musl")), - not(target_arch = "s390x"), - target_pointer_width = "64", -))] -pub type FsWord = u64; - -/// `__fsword_t` -// s390x uses `u32` for `statfs` entries on glibc, even though `__fsword_t` is -// `u64`. -#[cfg(all(target_os = "linux", target_arch = "s390x", target_env = "gnu"))] -pub type FsWord = u32; - -/// `__fsword_t` -// s390x uses `u64` for `statfs` entries on musl. -#[cfg(all(target_os = "linux", target_arch = "s390x", target_env = "musl"))] -pub type FsWord = u64; - -/// `copyfile_state_t`—State for use with [`fcopyfile`]. -/// -/// [`fcopyfile`]: crate::fs::fcopyfile -#[cfg(apple)] -#[allow(non_camel_case_types)] -#[repr(transparent)] -#[derive(Copy, Clone)] -pub struct copyfile_state_t(pub(crate) *mut c::c_void); diff --git a/vendor/rustix/src/backend/libc/io/errno.rs b/vendor/rustix/src/backend/libc/io/errno.rs deleted file mode 100644 index 805ea67..0000000 --- a/vendor/rustix/src/backend/libc/io/errno.rs +++ /dev/null @@ -1,1052 +0,0 @@ -//! The `rustix` `Errno` type. -//! -//! This type holds an OS error code, which conceptually corresponds to an -//! `errno` value. - -use crate::backend::c; -use libc_errno::errno; - -/// `errno`—An error code. -/// -/// The error type for `rustix` APIs. This is similar to [`std::io::Error`], -/// but only holds an OS error code, and no extra error value. -/// -/// # References -/// - [POSIX] -/// - [Linux] -/// - [Winsock] -/// - [FreeBSD] -/// - [NetBSD] -/// - [OpenBSD] -/// - [DragonFly BSD] -/// - [illumos] -/// - [glibc] -/// -/// [POSIX]: https://pubs.opengroup.org/onlinepubs/9699919799/functions/errno.html -/// [Linux]: https://man7.org/linux/man-pages/man3/errno.3.html -/// [Winsock]: https://learn.microsoft.com/en-us/windows/win32/winsock/windows-sockets-error-codes-2 -/// [FreeBSD]: https://man.freebsd.org/cgi/man.cgi?errno -/// [NetBSD]: https://man.netbsd.org/errno.2 -/// [OpenBSD]: https://man.openbsd.org/errno.2 -/// [DragonFly BSD]: https://man.dragonflybsd.org/?command=errno§ion=2 -/// [illumos]: https://illumos.org/man/3C/errno -/// [glibc]: https://www.gnu.org/software/libc/manual/html_node/Error-Codes.html -/// [`std::io::Error`]: Result -#[repr(transparent)] -#[doc(alias = "errno")] -#[derive(Eq, PartialEq, Hash, Copy, Clone)] -pub struct Errno(pub(crate) c::c_int); - -impl Errno { - /// `EACCES` - #[doc(alias = "ACCES")] - pub const ACCESS: Self = Self(c::EACCES); - /// `EADDRINUSE` - pub const ADDRINUSE: Self = Self(c::EADDRINUSE); - /// `EADDRNOTAVAIL` - pub const ADDRNOTAVAIL: Self = Self(c::EADDRNOTAVAIL); - /// `EADV` - #[cfg(not(any( - bsd, - windows, - target_os = "aix", - target_os = "espidf", - target_os = "haiku", - target_os = "hurd", - target_os = "l4re", - target_os = "vita", - target_os = "wasi", - )))] - pub const ADV: Self = Self(c::EADV); - /// `EAFNOSUPPORT` - #[cfg(not(target_os = "l4re"))] - pub const AFNOSUPPORT: Self = Self(c::EAFNOSUPPORT); - /// `EAGAIN` - pub const AGAIN: Self = Self(c::EAGAIN); - /// `EALREADY` - #[cfg(not(target_os = "l4re"))] - pub const ALREADY: Self = Self(c::EALREADY); - /// `EAUTH` - #[cfg(bsd)] - pub const AUTH: Self = Self(c::EAUTH); - /// `EBADE` - #[cfg(not(any( - bsd, - windows, - target_os = "aix", - target_os = "espidf", - target_os = "haiku", - target_os = "hurd", - target_os = "l4re", - target_os = "vita", - target_os = "wasi", - )))] - pub const BADE: Self = Self(c::EBADE); - /// `EBADF` - pub const BADF: Self = Self(c::EBADF); - /// `EBADFD` - #[cfg(not(any( - bsd, - windows, - target_os = "aix", - target_os = "espidf", - target_os = "haiku", - target_os = "hurd", - target_os = "l4re", - target_os = "vita", - target_os = "wasi", - )))] - pub const BADFD: Self = Self(c::EBADFD); - /// `EBADMSG` - #[cfg(not(any(windows, target_os = "l4re")))] - pub const BADMSG: Self = Self(c::EBADMSG); - /// `EBADR` - #[cfg(not(any( - bsd, - windows, - target_os = "aix", - target_os = "espidf", - target_os = "haiku", - target_os = "hurd", - target_os = "l4re", - target_os = "vita", - target_os = "wasi", - )))] - pub const BADR: Self = Self(c::EBADR); - /// `EBADRPC` - #[cfg(bsd)] - pub const BADRPC: Self = Self(c::EBADRPC); - /// `EBADRQC` - #[cfg(not(any( - bsd, - windows, - target_os = "aix", - target_os = "espidf", - target_os = "haiku", - target_os = "hurd", - target_os = "l4re", - target_os = "vita", - target_os = "wasi", - )))] - pub const BADRQC: Self = Self(c::EBADRQC); - /// `EBADSLT` - #[cfg(not(any( - bsd, - windows, - target_os = "aix", - target_os = "espidf", - target_os = "haiku", - target_os = "hurd", - target_os = "l4re", - target_os = "vita", - target_os = "wasi", - )))] - pub const BADSLT: Self = Self(c::EBADSLT); - /// `EBFONT` - #[cfg(not(any( - bsd, - windows, - target_os = "aix", - target_os = "espidf", - target_os = "haiku", - target_os = "hurd", - target_os = "l4re", - target_os = "vita", - target_os = "wasi", - )))] - pub const BFONT: Self = Self(c::EBFONT); - /// `EBUSY` - #[cfg(not(windows))] - pub const BUSY: Self = Self(c::EBUSY); - /// `ECANCELED` - #[cfg(not(target_os = "l4re"))] - pub const CANCELED: Self = Self(c::ECANCELED); - /// `ECAPMODE` - #[cfg(target_os = "freebsd")] - pub const CAPMODE: Self = Self(c::ECAPMODE); - /// `ECHILD` - #[cfg(not(windows))] - pub const CHILD: Self = Self(c::ECHILD); - /// `ECHRNG` - #[cfg(not(any( - bsd, - windows, - target_os = "espidf", - target_os = "haiku", - target_os = "hurd", - target_os = "l4re", - target_os = "vita", - target_os = "wasi" - )))] - pub const CHRNG: Self = Self(c::ECHRNG); - /// `ECOMM` - #[cfg(not(any( - bsd, - windows, - target_os = "aix", - target_os = "espidf", - target_os = "haiku", - target_os = "hurd", - target_os = "l4re", - target_os = "vita", - target_os = "wasi", - )))] - pub const COMM: Self = Self(c::ECOMM); - /// `ECONNABORTED` - pub const CONNABORTED: Self = Self(c::ECONNABORTED); - /// `ECONNREFUSED` - pub const CONNREFUSED: Self = Self(c::ECONNREFUSED); - /// `ECONNRESET` - pub const CONNRESET: Self = Self(c::ECONNRESET); - /// `EDEADLK` - #[cfg(not(windows))] - pub const DEADLK: Self = Self(c::EDEADLK); - /// `EDEADLOCK` - #[cfg(not(any( - bsd, - windows, - target_os = "aix", - target_os = "android", - target_os = "espidf", - target_os = "haiku", - target_os = "hurd", - target_os = "vita", - target_os = "wasi", - )))] - pub const DEADLOCK: Self = Self(c::EDEADLOCK); - /// `EDESTADDRREQ` - #[cfg(not(target_os = "l4re"))] - pub const DESTADDRREQ: Self = Self(c::EDESTADDRREQ); - /// `EDISCON` - #[cfg(windows)] - pub const DISCON: Self = Self(c::EDISCON); - /// `EDOM` - #[cfg(not(windows))] - pub const DOM: Self = Self(c::EDOM); - /// `EDOOFUS` - #[cfg(freebsdlike)] - pub const DOOFUS: Self = Self(c::EDOOFUS); - /// `EDOTDOT` - #[cfg(not(any( - bsd, - solarish, - windows, - target_os = "aix", - target_os = "espidf", - target_os = "haiku", - target_os = "hurd", - target_os = "l4re", - target_os = "nto", - target_os = "vita", - target_os = "wasi", - )))] - pub const DOTDOT: Self = Self(c::EDOTDOT); - /// `EDQUOT` - pub const DQUOT: Self = Self(c::EDQUOT); - /// `EEXIST` - #[cfg(not(windows))] - pub const EXIST: Self = Self(c::EEXIST); - /// `EFAULT` - pub const FAULT: Self = Self(c::EFAULT); - /// `EFBIG` - #[cfg(not(windows))] - pub const FBIG: Self = Self(c::EFBIG); - /// `EFTYPE` - #[cfg(any(bsd, target_env = "newlib"))] - pub const FTYPE: Self = Self(c::EFTYPE); - /// `EHOSTDOWN` - #[cfg(not(any(target_os = "l4re", target_os = "wasi")))] - pub const HOSTDOWN: Self = Self(c::EHOSTDOWN); - /// `EHOSTUNREACH` - pub const HOSTUNREACH: Self = Self(c::EHOSTUNREACH); - /// `EHWPOISON` - #[cfg(not(any( - bsd, - solarish, - windows, - target_os = "aix", - target_os = "android", - target_os = "espidf", - target_os = "haiku", - target_os = "hurd", - target_os = "l4re", - target_os = "nto", - target_os = "redox", - target_os = "vita", - target_os = "wasi", - )))] - pub const HWPOISON: Self = Self(c::EHWPOISON); - /// `EIDRM` - #[cfg(not(any(windows, target_os = "l4re")))] - pub const IDRM: Self = Self(c::EIDRM); - /// `EILSEQ` - #[cfg(not(any(windows, target_os = "l4re")))] - pub const ILSEQ: Self = Self(c::EILSEQ); - /// `EINPROGRESS` - #[cfg(not(target_os = "l4re"))] - pub const INPROGRESS: Self = Self(c::EINPROGRESS); - /// `EINTR` - /// - /// For a convenient way to retry system calls that exit with `INTR`, use - /// [`retry_on_intr`]. - /// - /// [`retry_on_intr`]: crate::io::retry_on_intr - pub const INTR: Self = Self(c::EINTR); - /// `EINVAL` - pub const INVAL: Self = Self(c::EINVAL); - /// `EINVALIDPROCTABLE` - #[cfg(windows)] - pub const INVALIDPROCTABLE: Self = Self(c::EINVALIDPROCTABLE); - /// `EINVALIDPROVIDER` - #[cfg(windows)] - pub const INVALIDPROVIDER: Self = Self(c::EINVALIDPROVIDER); - /// `EIO` - #[cfg(not(windows))] - pub const IO: Self = Self(c::EIO); - /// `EISCONN` - #[cfg(not(target_os = "l4re"))] - pub const ISCONN: Self = Self(c::EISCONN); - /// `EISDIR` - #[cfg(not(windows))] - pub const ISDIR: Self = Self(c::EISDIR); - /// `EISNAM` - #[cfg(not(any( - bsd, - solarish, - windows, - target_os = "aix", - target_os = "espidf", - target_os = "haiku", - target_os = "hurd", - target_os = "l4re", - target_os = "nto", - target_os = "vita", - target_os = "wasi", - )))] - pub const ISNAM: Self = Self(c::EISNAM); - /// `EKEYEXPIRED` - #[cfg(not(any( - bsd, - solarish, - windows, - target_os = "aix", - target_os = "espidf", - target_os = "haiku", - target_os = "hurd", - target_os = "l4re", - target_os = "nto", - target_os = "vita", - target_os = "wasi", - )))] - pub const KEYEXPIRED: Self = Self(c::EKEYEXPIRED); - /// `EKEYREJECTED` - #[cfg(not(any( - bsd, - solarish, - windows, - target_os = "aix", - target_os = "espidf", - target_os = "haiku", - target_os = "hurd", - target_os = "l4re", - target_os = "nto", - target_os = "vita", - target_os = "wasi", - )))] - pub const KEYREJECTED: Self = Self(c::EKEYREJECTED); - /// `EKEYREVOKED` - #[cfg(not(any( - bsd, - solarish, - windows, - target_os = "aix", - target_os = "espidf", - target_os = "haiku", - target_os = "hurd", - target_os = "l4re", - target_os = "nto", - target_os = "vita", - target_os = "wasi", - )))] - pub const KEYREVOKED: Self = Self(c::EKEYREVOKED); - /// `EL2HLT` - #[cfg(not(any( - bsd, - windows, - target_os = "espidf", - target_os = "haiku", - target_os = "hurd", - target_os = "l4re", - target_os = "vita", - target_os = "wasi" - )))] - pub const L2HLT: Self = Self(c::EL2HLT); - /// `EL2NSYNC` - #[cfg(not(any( - bsd, - windows, - target_os = "espidf", - target_os = "haiku", - target_os = "hurd", - target_os = "l4re", - target_os = "vita", - target_os = "wasi" - )))] - pub const L2NSYNC: Self = Self(c::EL2NSYNC); - /// `EL3HLT` - #[cfg(not(any( - bsd, - windows, - target_os = "espidf", - target_os = "haiku", - target_os = "hurd", - target_os = "l4re", - target_os = "vita", - target_os = "wasi" - )))] - pub const L3HLT: Self = Self(c::EL3HLT); - /// `EL3RST` - #[cfg(not(any( - bsd, - windows, - target_os = "espidf", - target_os = "haiku", - target_os = "hurd", - target_os = "l4re", - target_os = "vita", - target_os = "wasi" - )))] - pub const L3RST: Self = Self(c::EL3RST); - /// `ELIBACC` - #[cfg(not(any( - bsd, - windows, - target_os = "aix", - target_os = "espidf", - target_os = "haiku", - target_os = "hurd", - target_os = "l4re", - target_os = "vita", - target_os = "wasi", - )))] - pub const LIBACC: Self = Self(c::ELIBACC); - /// `ELIBBAD` - #[cfg(not(any( - bsd, - windows, - target_os = "aix", - target_os = "espidf", - target_os = "haiku", - target_os = "hurd", - target_os = "l4re", - target_os = "vita", - target_os = "wasi", - )))] - pub const LIBBAD: Self = Self(c::ELIBBAD); - /// `ELIBEXEC` - #[cfg(not(any( - bsd, - windows, - target_os = "aix", - target_os = "espidf", - target_os = "haiku", - target_os = "l4re", - target_os = "vita", - target_os = "wasi", - )))] - pub const LIBEXEC: Self = Self(c::ELIBEXEC); - /// `ELIBMAX` - #[cfg(not(any( - bsd, - windows, - target_os = "aix", - target_os = "espidf", - target_os = "haiku", - target_os = "hurd", - target_os = "l4re", - target_os = "vita", - target_os = "wasi", - )))] - pub const LIBMAX: Self = Self(c::ELIBMAX); - /// `ELIBSCN` - #[cfg(not(any( - bsd, - windows, - target_os = "aix", - target_os = "espidf", - target_os = "haiku", - target_os = "hurd", - target_os = "l4re", - target_os = "vita", - target_os = "wasi", - )))] - pub const LIBSCN: Self = Self(c::ELIBSCN); - /// `ELNRNG` - #[cfg(not(any( - bsd, - windows, - target_os = "espidf", - target_os = "haiku", - target_os = "hurd", - target_os = "l4re", - target_os = "vita", - target_os = "wasi" - )))] - pub const LNRNG: Self = Self(c::ELNRNG); - /// `ELOOP` - pub const LOOP: Self = Self(c::ELOOP); - /// `EMEDIUMTYPE` - #[cfg(not(any( - bsd, - solarish, - windows, - target_os = "aix", - target_os = "espidf", - target_os = "haiku", - target_os = "hurd", - target_os = "l4re", - target_os = "nto", - target_os = "vita", - target_os = "wasi", - )))] - pub const MEDIUMTYPE: Self = Self(c::EMEDIUMTYPE); - /// `EMFILE` - pub const MFILE: Self = Self(c::EMFILE); - /// `EMLINK` - #[cfg(not(windows))] - pub const MLINK: Self = Self(c::EMLINK); - /// `EMSGSIZE` - #[cfg(not(target_os = "l4re"))] - pub const MSGSIZE: Self = Self(c::EMSGSIZE); - /// `EMULTIHOP` - #[cfg(not(any(windows, target_os = "l4re", target_os = "openbsd")))] - pub const MULTIHOP: Self = Self(c::EMULTIHOP); - /// `ENAMETOOLONG` - pub const NAMETOOLONG: Self = Self(c::ENAMETOOLONG); - /// `ENAVAIL` - #[cfg(not(any( - bsd, - solarish, - windows, - target_os = "aix", - target_os = "espidf", - target_os = "haiku", - target_os = "hurd", - target_os = "l4re", - target_os = "nto", - target_os = "vita", - target_os = "wasi", - )))] - pub const NAVAIL: Self = Self(c::ENAVAIL); - /// `ENEEDAUTH` - #[cfg(bsd)] - pub const NEEDAUTH: Self = Self(c::ENEEDAUTH); - /// `ENETDOWN` - pub const NETDOWN: Self = Self(c::ENETDOWN); - /// `ENETRESET` - #[cfg(not(target_os = "l4re"))] - pub const NETRESET: Self = Self(c::ENETRESET); - /// `ENETUNREACH` - pub const NETUNREACH: Self = Self(c::ENETUNREACH); - /// `ENFILE` - #[cfg(not(windows))] - pub const NFILE: Self = Self(c::ENFILE); - /// `ENOANO` - #[cfg(not(any( - bsd, - windows, - target_os = "aix", - target_os = "espidf", - target_os = "haiku", - target_os = "hurd", - target_os = "l4re", - target_os = "vita", - target_os = "wasi", - )))] - pub const NOANO: Self = Self(c::ENOANO); - /// `ENOATTR` - #[cfg(any(bsd, target_os = "haiku"))] - pub const NOATTR: Self = Self(c::ENOATTR); - /// `ENOBUFS` - #[cfg(not(target_os = "l4re"))] - pub const NOBUFS: Self = Self(c::ENOBUFS); - /// `ENOCSI` - #[cfg(not(any( - bsd, - windows, - target_os = "espidf", - target_os = "haiku", - target_os = "hurd", - target_os = "l4re", - target_os = "vita", - target_os = "wasi" - )))] - pub const NOCSI: Self = Self(c::ENOCSI); - /// `ENODATA` - #[cfg(not(any( - freebsdlike, - windows, - target_os = "haiku", - target_os = "openbsd", - target_os = "wasi", - )))] - pub const NODATA: Self = Self(c::ENODATA); - /// `ENODEV` - #[cfg(not(windows))] - pub const NODEV: Self = Self(c::ENODEV); - /// `ENOENT` - #[cfg(not(windows))] - pub const NOENT: Self = Self(c::ENOENT); - /// `ENOEXEC` - #[cfg(not(windows))] - pub const NOEXEC: Self = Self(c::ENOEXEC); - /// `ENOKEY` - #[cfg(not(any( - solarish, - bsd, - windows, - target_os = "aix", - target_os = "espidf", - target_os = "haiku", - target_os = "hurd", - target_os = "l4re", - target_os = "nto", - target_os = "vita", - target_os = "wasi", - )))] - pub const NOKEY: Self = Self(c::ENOKEY); - /// `ENOLCK` - #[cfg(not(any(windows, target_os = "l4re")))] - pub const NOLCK: Self = Self(c::ENOLCK); - /// `ENOLINK` - #[cfg(not(any(windows, target_os = "l4re", target_os = "openbsd")))] - pub const NOLINK: Self = Self(c::ENOLINK); - /// `ENOMEDIUM` - #[cfg(not(any( - bsd, - solarish, - windows, - target_os = "aix", - target_os = "espidf", - target_os = "haiku", - target_os = "hurd", - target_os = "l4re", - target_os = "nto", - target_os = "vita", - target_os = "wasi", - )))] - pub const NOMEDIUM: Self = Self(c::ENOMEDIUM); - /// `ENOMEM` - #[cfg(not(windows))] - pub const NOMEM: Self = Self(c::ENOMEM); - /// `ENOMORE` - #[cfg(windows)] - pub const NOMORE: Self = Self(c::ENOMORE); - /// `ENOMSG` - #[cfg(not(any(windows, target_os = "l4re")))] - pub const NOMSG: Self = Self(c::ENOMSG); - /// `ENONET` - #[cfg(not(any( - bsd, - windows, - target_os = "aix", - target_os = "espidf", - target_os = "haiku", - target_os = "hurd", - target_os = "l4re", - target_os = "vita", - target_os = "wasi", - )))] - pub const NONET: Self = Self(c::ENONET); - /// `ENOPKG` - #[cfg(not(any( - bsd, - windows, - target_os = "aix", - target_os = "espidf", - target_os = "haiku", - target_os = "hurd", - target_os = "l4re", - target_os = "vita", - target_os = "wasi", - )))] - pub const NOPKG: Self = Self(c::ENOPKG); - /// `ENOPROTOOPT` - #[cfg(not(target_os = "l4re"))] - pub const NOPROTOOPT: Self = Self(c::ENOPROTOOPT); - /// `ENOSPC` - #[cfg(not(windows))] - pub const NOSPC: Self = Self(c::ENOSPC); - /// `ENOSR` - #[cfg(not(any( - freebsdlike, - windows, - target_os = "haiku", - target_os = "l4re", - target_os = "openbsd", - target_os = "wasi", - )))] - pub const NOSR: Self = Self(c::ENOSR); - /// `ENOSTR` - #[cfg(not(any( - freebsdlike, - windows, - target_os = "haiku", - target_os = "l4re", - target_os = "openbsd", - target_os = "wasi", - )))] - pub const NOSTR: Self = Self(c::ENOSTR); - /// `ENOSYS` - #[cfg(not(windows))] - pub const NOSYS: Self = Self(c::ENOSYS); - /// `ENOTBLK` - #[cfg(not(any( - windows, - target_os = "espidf", - target_os = "haiku", - target_os = "vita", - target_os = "wasi" - )))] - pub const NOTBLK: Self = Self(c::ENOTBLK); - /// `ENOTCAPABLE` - #[cfg(any(target_os = "freebsd", target_os = "wasi"))] - pub const NOTCAPABLE: Self = Self(c::ENOTCAPABLE); - /// `ENOTCONN` - pub const NOTCONN: Self = Self(c::ENOTCONN); - /// `ENOTDIR` - #[cfg(not(windows))] - pub const NOTDIR: Self = Self(c::ENOTDIR); - /// `ENOTEMPTY` - pub const NOTEMPTY: Self = Self(c::ENOTEMPTY); - /// `ENOTNAM` - #[cfg(not(any( - bsd, - solarish, - windows, - target_os = "aix", - target_os = "espidf", - target_os = "haiku", - target_os = "hurd", - target_os = "l4re", - target_os = "nto", - target_os = "vita", - target_os = "wasi", - )))] - pub const NOTNAM: Self = Self(c::ENOTNAM); - /// `ENOTRECOVERABLE` - #[cfg(not(any( - freebsdlike, - netbsdlike, - windows, - target_os = "haiku", - target_os = "l4re" - )))] - pub const NOTRECOVERABLE: Self = Self(c::ENOTRECOVERABLE); - /// `ENOTSOCK` - #[cfg(not(target_os = "l4re"))] - pub const NOTSOCK: Self = Self(c::ENOTSOCK); - /// `ENOTSUP` - #[cfg(not(any(windows, target_os = "haiku", target_os = "redox")))] - pub const NOTSUP: Self = Self(c::ENOTSUP); - /// `ENOTTY` - #[cfg(not(windows))] - pub const NOTTY: Self = Self(c::ENOTTY); - /// `ENOTUNIQ` - #[cfg(not(any( - bsd, - windows, - target_os = "aix", - target_os = "espidf", - target_os = "haiku", - target_os = "hurd", - target_os = "l4re", - target_os = "vita", - target_os = "wasi", - )))] - pub const NOTUNIQ: Self = Self(c::ENOTUNIQ); - /// `ENXIO` - #[cfg(not(windows))] - pub const NXIO: Self = Self(c::ENXIO); - /// `EOPNOTSUPP` - pub const OPNOTSUPP: Self = Self(c::EOPNOTSUPP); - /// `EOVERFLOW` - #[cfg(not(any(windows, target_os = "l4re")))] - pub const OVERFLOW: Self = Self(c::EOVERFLOW); - /// `EOWNERDEAD` - #[cfg(not(any( - freebsdlike, - netbsdlike, - windows, - target_os = "haiku", - target_os = "l4re" - )))] - pub const OWNERDEAD: Self = Self(c::EOWNERDEAD); - /// `EPERM` - #[cfg(not(windows))] - pub const PERM: Self = Self(c::EPERM); - /// `EPFNOSUPPORT` - #[cfg(not(any(target_os = "l4re", target_os = "wasi")))] - pub const PFNOSUPPORT: Self = Self(c::EPFNOSUPPORT); - /// `EPIPE` - #[cfg(not(windows))] - pub const PIPE: Self = Self(c::EPIPE); - /// `EPROCLIM` - #[cfg(bsd)] - pub const PROCLIM: Self = Self(c::EPROCLIM); - /// `EPROCUNAVAIL` - #[cfg(bsd)] - pub const PROCUNAVAIL: Self = Self(c::EPROCUNAVAIL); - /// `EPROGMISMATCH` - #[cfg(bsd)] - pub const PROGMISMATCH: Self = Self(c::EPROGMISMATCH); - /// `EPROGUNAVAIL` - #[cfg(bsd)] - pub const PROGUNAVAIL: Self = Self(c::EPROGUNAVAIL); - /// `EPROTO` - #[cfg(not(any(windows, target_os = "l4re")))] - pub const PROTO: Self = Self(c::EPROTO); - /// `EPROTONOSUPPORT` - #[cfg(not(target_os = "l4re"))] - pub const PROTONOSUPPORT: Self = Self(c::EPROTONOSUPPORT); - /// `EPROTOTYPE` - #[cfg(not(target_os = "l4re"))] - pub const PROTOTYPE: Self = Self(c::EPROTOTYPE); - /// `EPROVIDERFAILEDINIT` - #[cfg(windows)] - pub const PROVIDERFAILEDINIT: Self = Self(c::EPROVIDERFAILEDINIT); - /// `ERANGE` - #[cfg(not(windows))] - pub const RANGE: Self = Self(c::ERANGE); - /// `EREFUSED` - #[cfg(windows)] - pub const REFUSED: Self = Self(c::EREFUSED); - /// `EREMCHG` - #[cfg(not(any( - bsd, - windows, - target_os = "aix", - target_os = "espidf", - target_os = "haiku", - target_os = "hurd", - target_os = "l4re", - target_os = "vita", - target_os = "wasi", - )))] - pub const REMCHG: Self = Self(c::EREMCHG); - /// `EREMOTE` - #[cfg(not(any( - target_os = "espidf", - target_os = "haiku", - target_os = "l4re", - target_os = "vita", - target_os = "wasi" - )))] - pub const REMOTE: Self = Self(c::EREMOTE); - /// `EREMOTEIO` - #[cfg(not(any( - bsd, - solarish, - windows, - target_os = "aix", - target_os = "espidf", - target_os = "haiku", - target_os = "hurd", - target_os = "l4re", - target_os = "nto", - target_os = "vita", - target_os = "wasi", - )))] - pub const REMOTEIO: Self = Self(c::EREMOTEIO); - /// `ERESTART` - #[cfg(not(any( - bsd, - windows, - target_os = "espidf", - target_os = "haiku", - target_os = "hurd", - target_os = "l4re", - target_os = "vita", - target_os = "wasi" - )))] - pub const RESTART: Self = Self(c::ERESTART); - /// `ERFKILL` - #[cfg(not(any( - bsd, - solarish, - windows, - target_os = "aix", - target_os = "android", - target_os = "espidf", - target_os = "haiku", - target_os = "hurd", - target_os = "l4re", - target_os = "nto", - target_os = "redox", - target_os = "vita", - target_os = "wasi", - )))] - pub const RFKILL: Self = Self(c::ERFKILL); - /// `EROFS` - #[cfg(not(windows))] - pub const ROFS: Self = Self(c::EROFS); - /// `ERPCMISMATCH` - #[cfg(bsd)] - pub const RPCMISMATCH: Self = Self(c::ERPCMISMATCH); - /// `ESHUTDOWN` - #[cfg(not(any( - target_os = "espidf", - target_os = "l4re", - target_os = "vita", - target_os = "wasi" - )))] - pub const SHUTDOWN: Self = Self(c::ESHUTDOWN); - /// `ESOCKTNOSUPPORT` - #[cfg(not(any( - target_os = "espidf", - target_os = "haiku", - target_os = "l4re", - target_os = "vita", - target_os = "wasi" - )))] - pub const SOCKTNOSUPPORT: Self = Self(c::ESOCKTNOSUPPORT); - /// `ESPIPE` - #[cfg(not(windows))] - pub const SPIPE: Self = Self(c::ESPIPE); - /// `ESRCH` - #[cfg(not(windows))] - pub const SRCH: Self = Self(c::ESRCH); - /// `ESRMNT` - #[cfg(not(any( - bsd, - windows, - target_os = "aix", - target_os = "espidf", - target_os = "haiku", - target_os = "hurd", - target_os = "l4re", - target_os = "vita", - target_os = "wasi", - )))] - pub const SRMNT: Self = Self(c::ESRMNT); - /// `ESTALE` - pub const STALE: Self = Self(c::ESTALE); - /// `ESTRPIPE` - #[cfg(not(any( - bsd, - windows, - target_os = "aix", - target_os = "espidf", - target_os = "haiku", - target_os = "hurd", - target_os = "l4re", - target_os = "vita", - target_os = "wasi", - )))] - pub const STRPIPE: Self = Self(c::ESTRPIPE); - /// `ETIME` - #[cfg(not(any( - freebsdlike, - windows, - target_os = "l4re", - target_os = "openbsd", - target_os = "wasi" - )))] - pub const TIME: Self = Self(c::ETIME); - /// `ETIMEDOUT` - pub const TIMEDOUT: Self = Self(c::ETIMEDOUT); - /// `E2BIG` - #[cfg(not(windows))] - #[doc(alias = "2BIG")] - pub const TOOBIG: Self = Self(c::E2BIG); - /// `ETOOMANYREFS` - #[cfg(not(any(target_os = "haiku", target_os = "l4re", target_os = "wasi")))] - pub const TOOMANYREFS: Self = Self(c::ETOOMANYREFS); - /// `ETXTBSY` - #[cfg(not(windows))] - pub const TXTBSY: Self = Self(c::ETXTBSY); - /// `EUCLEAN` - #[cfg(not(any( - bsd, - solarish, - windows, - target_os = "aix", - target_os = "espidf", - target_os = "haiku", - target_os = "hurd", - target_os = "l4re", - target_os = "nto", - target_os = "vita", - target_os = "wasi", - )))] - pub const UCLEAN: Self = Self(c::EUCLEAN); - /// `EUNATCH` - #[cfg(not(any( - bsd, - windows, - target_os = "espidf", - target_os = "haiku", - target_os = "hurd", - target_os = "l4re", - target_os = "vita", - target_os = "wasi" - )))] - pub const UNATCH: Self = Self(c::EUNATCH); - /// `EUSERS` - #[cfg(not(any( - target_os = "espidf", - target_os = "haiku", - target_os = "l4re", - target_os = "vita", - target_os = "wasi" - )))] - pub const USERS: Self = Self(c::EUSERS); - /// `EWOULDBLOCK` - pub const WOULDBLOCK: Self = Self(c::EWOULDBLOCK); - /// `EXDEV` - #[cfg(not(windows))] - pub const XDEV: Self = Self(c::EXDEV); - /// `EXFULL` - #[cfg(not(any( - bsd, - windows, - target_os = "aix", - target_os = "espidf", - target_os = "haiku", - target_os = "hurd", - target_os = "l4re", - target_os = "vita", - target_os = "wasi", - )))] - pub const XFULL: Self = Self(c::EXFULL); -} - -impl Errno { - /// Extract an `Errno` value from a `std::io::Error`. - /// - /// This isn't a `From` conversion because it's expected to be relatively - /// uncommon. - #[cfg(feature = "std")] - #[inline] - pub fn from_io_error(io_err: &std::io::Error) -> Option<Self> { - io_err - .raw_os_error() - .and_then(|raw| if raw != 0 { Some(Self(raw)) } else { None }) - } - - /// Extract the raw OS error number from this error. - #[inline] - pub const fn raw_os_error(self) -> i32 { - self.0 - } - - /// Construct an `Errno` from a raw OS error number. - #[inline] - pub const fn from_raw_os_error(raw: i32) -> Self { - Self(raw) - } - - pub(crate) fn last_os_error() -> Self { - Self(errno().0) - } -} diff --git a/vendor/rustix/src/backend/libc/io/mod.rs b/vendor/rustix/src/backend/libc/io/mod.rs deleted file mode 100644 index 4873885..0000000 --- a/vendor/rustix/src/backend/libc/io/mod.rs +++ /dev/null @@ -1,6 +0,0 @@ -pub(crate) mod errno; -#[cfg(not(windows))] -pub(crate) mod types; - -#[cfg_attr(windows, path = "windows_syscalls.rs")] -pub(crate) mod syscalls; diff --git a/vendor/rustix/src/backend/libc/io/syscalls.rs b/vendor/rustix/src/backend/libc/io/syscalls.rs deleted file mode 100644 index e28e6be..0000000 --- a/vendor/rustix/src/backend/libc/io/syscalls.rs +++ /dev/null @@ -1,340 +0,0 @@ -//! libc syscalls supporting `rustix::io`. - -use crate::backend::c; -#[cfg(not(target_os = "wasi"))] -use crate::backend::conv::ret_discarded_fd; -use crate::backend::conv::{borrowed_fd, ret, ret_c_int, ret_owned_fd, ret_usize}; -use crate::fd::{AsFd, BorrowedFd, OwnedFd, RawFd}; -#[cfg(not(any( - target_os = "aix", - target_os = "espidf", - target_os = "nto", - target_os = "vita", - target_os = "wasi" -)))] -use crate::io::DupFlags; -#[cfg(linux_kernel)] -use crate::io::ReadWriteFlags; -use crate::io::{self, FdFlags}; -use crate::ioctl::{IoctlOutput, RawOpcode}; -use core::cmp::min; -#[cfg(all(feature = "fs", feature = "net"))] -use libc_errno::errno; -#[cfg(not(target_os = "espidf"))] -use { - crate::backend::MAX_IOV, - crate::io::{IoSlice, IoSliceMut}, -}; - -pub(crate) unsafe fn read(fd: BorrowedFd<'_>, buf: *mut u8, len: usize) -> io::Result<usize> { - ret_usize(c::read(borrowed_fd(fd), buf.cast(), min(len, READ_LIMIT))) -} - -pub(crate) fn write(fd: BorrowedFd<'_>, buf: &[u8]) -> io::Result<usize> { - unsafe { - ret_usize(c::write( - borrowed_fd(fd), - buf.as_ptr().cast(), - min(buf.len(), READ_LIMIT), - )) - } -} - -pub(crate) unsafe fn pread( - fd: BorrowedFd<'_>, - buf: *mut u8, - len: usize, - offset: u64, -) -> io::Result<usize> { - let len = min(len, READ_LIMIT); - - // Silently cast; we'll get `EINVAL` if the value is negative. - let offset = offset as i64; - - // ESP-IDF and Vita don't support 64-bit offsets. - #[cfg(any(target_os = "espidf", target_os = "vita"))] - let offset: i32 = offset.try_into().map_err(|_| io::Errno::OVERFLOW)?; - - ret_usize(c::pread(borrowed_fd(fd), buf.cast(), len, offset)) -} - -pub(crate) fn pwrite(fd: BorrowedFd<'_>, buf: &[u8], offset: u64) -> io::Result<usize> { - let len = min(buf.len(), READ_LIMIT); - - // Silently cast; we'll get `EINVAL` if the value is negative. - let offset = offset as i64; - - // ESP-IDF and Vita don't support 64-bit offsets. - #[cfg(any(target_os = "espidf", target_os = "vita"))] - let offset: i32 = offset.try_into().map_err(|_| io::Errno::OVERFLOW)?; - - unsafe { ret_usize(c::pwrite(borrowed_fd(fd), buf.as_ptr().cast(), len, offset)) } -} - -#[cfg(not(target_os = "espidf"))] -pub(crate) fn readv(fd: BorrowedFd<'_>, bufs: &mut [IoSliceMut<'_>]) -> io::Result<usize> { - unsafe { - ret_usize(c::readv( - borrowed_fd(fd), - bufs.as_ptr().cast::<c::iovec>(), - min(bufs.len(), MAX_IOV) as c::c_int, - )) - } -} - -#[cfg(not(target_os = "espidf"))] -pub(crate) fn writev(fd: BorrowedFd<'_>, bufs: &[IoSlice<'_>]) -> io::Result<usize> { - unsafe { - ret_usize(c::writev( - borrowed_fd(fd), - bufs.as_ptr().cast::<c::iovec>(), - min(bufs.len(), MAX_IOV) as c::c_int, - )) - } -} - -#[cfg(not(any( - target_os = "espidf", - target_os = "haiku", - target_os = "nto", - target_os = "redox", - target_os = "solaris", - target_os = "vita" -)))] -pub(crate) fn preadv( - fd: BorrowedFd<'_>, - bufs: &mut [IoSliceMut<'_>], - offset: u64, -) -> io::Result<usize> { - // Silently cast; we'll get `EINVAL` if the value is negative. - let offset = offset as i64; - unsafe { - ret_usize(c::preadv( - borrowed_fd(fd), - bufs.as_ptr().cast::<c::iovec>(), - min(bufs.len(), MAX_IOV) as c::c_int, - offset, - )) - } -} - -#[cfg(not(any( - target_os = "espidf", - target_os = "haiku", - target_os = "nto", - target_os = "redox", - target_os = "solaris", - target_os = "vita" -)))] -pub(crate) fn pwritev(fd: BorrowedFd<'_>, bufs: &[IoSlice<'_>], offset: u64) -> io::Result<usize> { - // Silently cast; we'll get `EINVAL` if the value is negative. - let offset = offset as i64; - unsafe { - ret_usize(c::pwritev( - borrowed_fd(fd), - bufs.as_ptr().cast::<c::iovec>(), - min(bufs.len(), MAX_IOV) as c::c_int, - offset, - )) - } -} - -#[cfg(linux_kernel)] -pub(crate) fn preadv2( - fd: BorrowedFd<'_>, - bufs: &mut [IoSliceMut<'_>], - offset: u64, - flags: ReadWriteFlags, -) -> io::Result<usize> { - // Silently cast; we'll get `EINVAL` if the value is negative. - let offset = offset as i64; - unsafe { - ret_usize(c::preadv2( - borrowed_fd(fd), - bufs.as_ptr().cast::<c::iovec>(), - min(bufs.len(), MAX_IOV) as c::c_int, - offset, - bitflags_bits!(flags), - )) - } -} - -#[cfg(linux_kernel)] -pub(crate) fn pwritev2( - fd: BorrowedFd<'_>, - bufs: &[IoSlice<'_>], - offset: u64, - flags: ReadWriteFlags, -) -> io::Result<usize> { - // Silently cast; we'll get `EINVAL` if the value is negative. - let offset = offset as i64; - unsafe { - ret_usize(c::pwritev2( - borrowed_fd(fd), - bufs.as_ptr().cast::<c::iovec>(), - min(bufs.len(), MAX_IOV) as c::c_int, - offset, - bitflags_bits!(flags), - )) - } -} - -// These functions are derived from Rust's library/std/src/sys/unix/fd.rs at -// revision 326ef470a8b379a180d6dc4bbef08990698a737a. - -// The maximum read limit on most POSIX-like systems is `SSIZE_MAX`, with the -// manual page quoting that if the count of bytes to read is greater than -// `SSIZE_MAX` the result is “unspecified”. -// -// On macOS, however, apparently the 64-bit libc is either buggy or -// intentionally showing odd behavior by rejecting any read with a size larger -// than or equal to `INT_MAX`. To handle both of these the read size is capped -// on both platforms. -#[cfg(target_os = "macos")] -const READ_LIMIT: usize = c::c_int::MAX as usize - 1; -#[cfg(not(target_os = "macos"))] -const READ_LIMIT: usize = c::ssize_t::MAX as usize; - -pub(crate) unsafe fn close(raw_fd: RawFd) { - let _ = c::close(raw_fd as c::c_int); -} - -#[inline] -pub(crate) unsafe fn ioctl( - fd: BorrowedFd<'_>, - request: RawOpcode, - arg: *mut c::c_void, -) -> io::Result<IoctlOutput> { - ret_c_int(c::ioctl(borrowed_fd(fd), request, arg)) -} - -#[inline] -pub(crate) unsafe fn ioctl_readonly( - fd: BorrowedFd<'_>, - request: RawOpcode, - arg: *mut c::c_void, -) -> io::Result<IoctlOutput> { - ioctl(fd, request, arg) -} - -#[cfg(not(any(target_os = "redox", target_os = "wasi")))] -#[cfg(all(feature = "fs", feature = "net"))] -pub(crate) fn is_read_write(fd: BorrowedFd<'_>) -> io::Result<(bool, bool)> { - use core::mem::MaybeUninit; - - let (mut read, mut write) = crate::fs::fd::_is_file_read_write(fd)?; - let mut not_socket = false; - if read { - // Do a `recv` with `PEEK` and `DONTWAIT` for 1 byte. A 0 indicates - // the read side is shut down; an `EWOULDBLOCK` indicates the read - // side is still open. - match unsafe { - c::recv( - borrowed_fd(fd), - MaybeUninit::<[u8; 1]>::uninit() - .as_mut_ptr() - .cast::<c::c_void>(), - 1, - c::MSG_PEEK | c::MSG_DONTWAIT, - ) - } { - 0 => read = false, - -1 => { - #[allow(unreachable_patterns)] // `EAGAIN` may equal `EWOULDBLOCK` - match errno().0 { - c::EAGAIN | c::EWOULDBLOCK => (), - c::ENOTSOCK => not_socket = true, - err => return Err(io::Errno(err)), - } - } - _ => (), - } - } - if write && !not_socket { - // Do a `send` with `DONTWAIT` for 0 bytes. An `EPIPE` indicates - // the write side is shut down. - if unsafe { c::send(borrowed_fd(fd), [].as_ptr(), 0, c::MSG_DONTWAIT) } == -1 { - #[allow(unreachable_patterns)] // `EAGAIN` may equal `EWOULDBLOCK` - match errno().0 { - c::EAGAIN | c::EWOULDBLOCK | c::ENOTSOCK => (), - c::EPIPE => write = false, - err => return Err(io::Errno(err)), - } - } - } - Ok((read, write)) -} - -#[cfg(target_os = "wasi")] -#[cfg(all(feature = "fs", feature = "net"))] -pub(crate) fn is_read_write(_fd: BorrowedFd<'_>) -> io::Result<(bool, bool)> { - todo!("Implement is_read_write for WASI in terms of fd_fdstat_get"); -} - -pub(crate) fn fcntl_getfd(fd: BorrowedFd<'_>) -> io::Result<FdFlags> { - let flags = unsafe { ret_c_int(c::fcntl(borrowed_fd(fd), c::F_GETFD))? }; - Ok(FdFlags::from_bits_retain(bitcast!(flags))) -} - -pub(crate) fn fcntl_setfd(fd: BorrowedFd<'_>, flags: FdFlags) -> io::Result<()> { - unsafe { ret(c::fcntl(borrowed_fd(fd), c::F_SETFD, flags.bits())) } -} - -#[cfg(not(any(target_os = "espidf", target_os = "wasi")))] -pub(crate) fn fcntl_dupfd_cloexec(fd: BorrowedFd<'_>, min: RawFd) -> io::Result<OwnedFd> { - unsafe { ret_owned_fd(c::fcntl(borrowed_fd(fd), c::F_DUPFD_CLOEXEC, min)) } -} - -#[cfg(target_os = "espidf")] -pub(crate) fn fcntl_dupfd(fd: BorrowedFd<'_>, min: RawFd) -> io::Result<OwnedFd> { - unsafe { ret_owned_fd(c::fcntl(borrowed_fd(fd), c::F_DUPFD, min)) } -} - -#[cfg(not(target_os = "wasi"))] -pub(crate) fn dup(fd: BorrowedFd<'_>) -> io::Result<OwnedFd> { - unsafe { ret_owned_fd(c::dup(borrowed_fd(fd))) } -} - -#[allow(clippy::needless_pass_by_ref_mut)] -#[cfg(not(target_os = "wasi"))] -pub(crate) fn dup2(fd: BorrowedFd<'_>, new: &mut OwnedFd) -> io::Result<()> { - unsafe { ret_discarded_fd(c::dup2(borrowed_fd(fd), borrowed_fd(new.as_fd()))) } -} - -#[allow(clippy::needless_pass_by_ref_mut)] -#[cfg(not(any( - apple, - target_os = "aix", - target_os = "android", - target_os = "dragonfly", - target_os = "espidf", - target_os = "haiku", - target_os = "nto", - target_os = "redox", - target_os = "vita", - target_os = "wasi", -)))] -pub(crate) fn dup3(fd: BorrowedFd<'_>, new: &mut OwnedFd, flags: DupFlags) -> io::Result<()> { - unsafe { - ret_discarded_fd(c::dup3( - borrowed_fd(fd), - borrowed_fd(new.as_fd()), - bitflags_bits!(flags), - )) - } -} - -#[cfg(any( - apple, - target_os = "android", - target_os = "dragonfly", - target_os = "haiku", - target_os = "redox", -))] -pub(crate) fn dup3(fd: BorrowedFd<'_>, new: &mut OwnedFd, _flags: DupFlags) -> io::Result<()> { - // Android 5.0 has `dup3`, but libc doesn't have bindings. Emulate it - // using `dup2`. We don't need to worry about the difference between - // `dup2` and `dup3` when the file descriptors are equal because we - // have an `&mut OwnedFd` which means `fd` doesn't alias it. - dup2(fd, new) -} diff --git a/vendor/rustix/src/backend/libc/io/types.rs b/vendor/rustix/src/backend/libc/io/types.rs deleted file mode 100644 index 510206f..0000000 --- a/vendor/rustix/src/backend/libc/io/types.rs +++ /dev/null @@ -1,65 +0,0 @@ -use crate::backend::c; -use bitflags::bitflags; - -bitflags! { - /// `FD_*` constants for use with [`fcntl_getfd`] and [`fcntl_setfd`]. - /// - /// [`fcntl_getfd`]: crate::io::fcntl_getfd - /// [`fcntl_setfd`]: crate::io::fcntl_setfd - #[repr(transparent)] - #[derive(Copy, Clone, Eq, PartialEq, Hash, Debug)] - pub struct FdFlags: u32 { - /// `FD_CLOEXEC` - const CLOEXEC = bitcast!(c::FD_CLOEXEC); - - /// <https://docs.rs/bitflags/*/bitflags/#externally-defined-flags> - const _ = !0; - } -} - -#[cfg(linux_kernel)] -bitflags! { - /// `RWF_*` constants for use with [`preadv2`] and [`pwritev2`]. - /// - /// [`preadv2`]: crate::io::preadv2 - /// [`pwritev2`]: crate::io::pwritev - #[repr(transparent)] - #[derive(Copy, Clone, Eq, PartialEq, Hash, Debug)] - pub struct ReadWriteFlags: u32 { - /// `RWF_DSYNC` (since Linux 4.7) - const DSYNC = linux_raw_sys::general::RWF_DSYNC; - /// `RWF_HIPRI` (since Linux 4.6) - const HIPRI = linux_raw_sys::general::RWF_HIPRI; - /// `RWF_SYNC` (since Linux 4.7) - const SYNC = linux_raw_sys::general::RWF_SYNC; - /// `RWF_NOWAIT` (since Linux 4.14) - const NOWAIT = linux_raw_sys::general::RWF_NOWAIT; - /// `RWF_APPEND` (since Linux 4.16) - const APPEND = linux_raw_sys::general::RWF_APPEND; - - /// <https://docs.rs/bitflags/*/bitflags/#externally-defined-flags> - const _ = !0; - } -} - -#[cfg(not(target_os = "wasi"))] -bitflags! { - /// `O_*` constants for use with [`dup2`]. - /// - /// [`dup2`]: crate::io::dup2 - #[repr(transparent)] - #[derive(Copy, Clone, Eq, PartialEq, Hash, Debug)] - pub struct DupFlags: u32 { - /// `O_CLOEXEC` - #[cfg(not(any( - apple, - target_os = "aix", - target_os = "android", - target_os = "redox", - )))] // Android 5.0 has dup3, but libc doesn't have bindings - const CLOEXEC = bitcast!(c::O_CLOEXEC); - - /// <https://docs.rs/bitflags/*/bitflags/#externally-defined-flags> - const _ = !0; - } -} diff --git a/vendor/rustix/src/backend/libc/io/windows_syscalls.rs b/vendor/rustix/src/backend/libc/io/windows_syscalls.rs deleted file mode 100644 index 049221d..0000000 --- a/vendor/rustix/src/backend/libc/io/windows_syscalls.rs +++ /dev/null @@ -1,30 +0,0 @@ -//! Windows system calls in the `io` module. - -use crate::backend::c; -use crate::backend::conv::{borrowed_fd, ret_c_int}; -use crate::backend::fd::LibcFd; -use crate::fd::{BorrowedFd, RawFd}; -use crate::io; -use crate::ioctl::{IoctlOutput, RawOpcode}; - -pub(crate) unsafe fn close(raw_fd: RawFd) { - let _ = c::close(raw_fd as LibcFd); -} - -#[inline] -pub(crate) unsafe fn ioctl( - fd: BorrowedFd<'_>, - request: RawOpcode, - arg: *mut c::c_void, -) -> io::Result<IoctlOutput> { - ret_c_int(c::ioctl(borrowed_fd(fd), request, arg.cast())) -} - -#[inline] -pub(crate) unsafe fn ioctl_readonly( - fd: BorrowedFd<'_>, - request: RawOpcode, - arg: *mut c::c_void, -) -> io::Result<IoctlOutput> { - ioctl(fd, request, arg) -} diff --git a/vendor/rustix/src/backend/libc/io_uring/mod.rs b/vendor/rustix/src/backend/libc/io_uring/mod.rs deleted file mode 100644 index ef944f0..0000000 --- a/vendor/rustix/src/backend/libc/io_uring/mod.rs +++ /dev/null @@ -1 +0,0 @@ -pub(crate) mod syscalls; diff --git a/vendor/rustix/src/backend/libc/io_uring/syscalls.rs b/vendor/rustix/src/backend/libc/io_uring/syscalls.rs deleted file mode 100644 index 8e81824..0000000 --- a/vendor/rustix/src/backend/libc/io_uring/syscalls.rs +++ /dev/null @@ -1,70 +0,0 @@ -//! libc syscalls supporting `rustix::io_uring`. - -use crate::backend::c; -use crate::backend::conv::{borrowed_fd, ret_owned_fd, ret_u32}; -use crate::fd::{BorrowedFd, OwnedFd}; -use crate::io; -use crate::io_uring::{io_uring_params, IoringEnterFlags, IoringRegisterOp}; - -#[inline] -pub(crate) fn io_uring_setup(entries: u32, params: &mut io_uring_params) -> io::Result<OwnedFd> { - syscall! { - fn io_uring_setup( - entries: u32, - params: *mut io_uring_params - ) via SYS_io_uring_setup -> c::c_int - } - unsafe { ret_owned_fd(io_uring_setup(entries, params)) } -} - -#[inline] -pub(crate) unsafe fn io_uring_register( - fd: BorrowedFd<'_>, - opcode: IoringRegisterOp, - arg: *const c::c_void, - nr_args: u32, -) -> io::Result<u32> { - syscall! { - fn io_uring_register( - fd: c::c_uint, - opcode: c::c_uint, - arg: *const c::c_void, - nr_args: c::c_uint - ) via SYS_io_uring_register -> c::c_int - } - ret_u32(io_uring_register( - borrowed_fd(fd) as _, - opcode as u32, - arg, - nr_args, - )) -} - -#[inline] -pub(crate) unsafe fn io_uring_enter( - fd: BorrowedFd<'_>, - to_submit: u32, - min_complete: u32, - flags: IoringEnterFlags, - arg: *const c::c_void, - size: usize, -) -> io::Result<u32> { - syscall! { - fn io_uring_enter2( - fd: c::c_uint, - to_submit: c::c_uint, - min_complete: c::c_uint, - flags: c::c_uint, - arg: *const c::c_void, - size: usize - ) via SYS_io_uring_enter -> c::c_int - } - ret_u32(io_uring_enter2( - borrowed_fd(fd) as _, - to_submit, - min_complete, - bitflags_bits!(flags), - arg, - size, - )) -} diff --git a/vendor/rustix/src/backend/libc/mm/mod.rs b/vendor/rustix/src/backend/libc/mm/mod.rs deleted file mode 100644 index 1e0181a..0000000 --- a/vendor/rustix/src/backend/libc/mm/mod.rs +++ /dev/null @@ -1,2 +0,0 @@ -pub(crate) mod syscalls; -pub(crate) mod types; diff --git a/vendor/rustix/src/backend/libc/mm/syscalls.rs b/vendor/rustix/src/backend/libc/mm/syscalls.rs deleted file mode 100644 index 33bc9ca..0000000 --- a/vendor/rustix/src/backend/libc/mm/syscalls.rs +++ /dev/null @@ -1,244 +0,0 @@ -//! libc syscalls supporting `rustix::mm`. - -#[cfg(not(target_os = "redox"))] -use super::types::Advice; -#[cfg(any(linux_kernel, freebsdlike, netbsdlike))] -use super::types::MlockAllFlags; -#[cfg(any(target_os = "emscripten", target_os = "linux"))] -use super::types::MremapFlags; -use super::types::{MapFlags, MprotectFlags, MsyncFlags, ProtFlags}; -#[cfg(linux_kernel)] -use super::types::{MlockFlags, UserfaultfdFlags}; -use crate::backend::c; -#[cfg(linux_kernel)] -use crate::backend::conv::ret_owned_fd; -use crate::backend::conv::{borrowed_fd, no_fd, ret}; -use crate::fd::BorrowedFd; -#[cfg(linux_kernel)] -use crate::fd::OwnedFd; -use crate::io; - -#[cfg(not(target_os = "redox"))] -pub(crate) fn madvise(addr: *mut c::c_void, len: usize, advice: Advice) -> io::Result<()> { - // On Linux platforms, `MADV_DONTNEED` has the same value as - // `POSIX_MADV_DONTNEED` but different behavior. We remap it to a different - // value, and check for it here. - #[cfg(target_os = "linux")] - if let Advice::LinuxDontNeed = advice { - return unsafe { ret(c::madvise(addr, len, c::MADV_DONTNEED)) }; - } - - #[cfg(not(target_os = "android"))] - { - let err = unsafe { c::posix_madvise(addr, len, advice as c::c_int) }; - - // `posix_madvise` returns its error status rather than using `errno`. - if err == 0 { - Ok(()) - } else { - Err(io::Errno(err)) - } - } - - #[cfg(target_os = "android")] - { - if let Advice::DontNeed = advice { - // Do nothing. Linux's `MADV_DONTNEED` isn't the same as - // `POSIX_MADV_DONTNEED`, so just discard `MADV_DONTNEED`. - Ok(()) - } else { - unsafe { ret(c::madvise(addr, len, advice as c::c_int)) } - } - } -} - -pub(crate) unsafe fn msync(addr: *mut c::c_void, len: usize, flags: MsyncFlags) -> io::Result<()> { - let err = c::msync(addr, len, bitflags_bits!(flags)); - - // `msync` returns its error status rather than using `errno`. - if err == 0 { - Ok(()) - } else { - Err(io::Errno(err)) - } -} - -/// # Safety -/// -/// `mmap` is primarily unsafe due to the `addr` parameter, as anything working -/// with memory pointed to by raw pointers is unsafe. -pub(crate) unsafe fn mmap( - ptr: *mut c::c_void, - len: usize, - prot: ProtFlags, - flags: MapFlags, - fd: BorrowedFd<'_>, - offset: u64, -) -> io::Result<*mut c::c_void> { - let res = c::mmap( - ptr, - len, - bitflags_bits!(prot), - bitflags_bits!(flags), - borrowed_fd(fd), - offset as i64, - ); - if res == c::MAP_FAILED { - Err(io::Errno::last_os_error()) - } else { - Ok(res) - } -} - -/// # Safety -/// -/// `mmap` is primarily unsafe due to the `addr` parameter, as anything working -/// with memory pointed to by raw pointers is unsafe. -pub(crate) unsafe fn mmap_anonymous( - ptr: *mut c::c_void, - len: usize, - prot: ProtFlags, - flags: MapFlags, -) -> io::Result<*mut c::c_void> { - let res = c::mmap( - ptr, - len, - bitflags_bits!(prot), - bitflags_bits!(flags | MapFlags::from_bits_retain(bitcast!(c::MAP_ANONYMOUS))), - no_fd(), - 0, - ); - if res == c::MAP_FAILED { - Err(io::Errno::last_os_error()) - } else { - Ok(res) - } -} - -pub(crate) unsafe fn mprotect( - ptr: *mut c::c_void, - len: usize, - flags: MprotectFlags, -) -> io::Result<()> { - ret(c::mprotect(ptr, len, bitflags_bits!(flags))) -} - -pub(crate) unsafe fn munmap(ptr: *mut c::c_void, len: usize) -> io::Result<()> { - ret(c::munmap(ptr, len)) -} - -/// # Safety -/// -/// `mremap` is primarily unsafe due to the `old_address` parameter, as -/// anything working with memory pointed to by raw pointers is unsafe. -#[cfg(any(target_os = "emscripten", target_os = "linux"))] -pub(crate) unsafe fn mremap( - old_address: *mut c::c_void, - old_size: usize, - new_size: usize, - flags: MremapFlags, -) -> io::Result<*mut c::c_void> { - let res = c::mremap(old_address, old_size, new_size, bitflags_bits!(flags)); - if res == c::MAP_FAILED { - Err(io::Errno::last_os_error()) - } else { - Ok(res) - } -} - -/// # Safety -/// -/// `mremap_fixed` is primarily unsafe due to the `old_address` and -/// `new_address` parameters, as anything working with memory pointed to by raw -/// pointers is unsafe. -#[cfg(any(target_os = "emscripten", target_os = "linux"))] -pub(crate) unsafe fn mremap_fixed( - old_address: *mut c::c_void, - old_size: usize, - new_size: usize, - flags: MremapFlags, - new_address: *mut c::c_void, -) -> io::Result<*mut c::c_void> { - let res = c::mremap( - old_address, - old_size, - new_size, - bitflags_bits!(flags | MremapFlags::from_bits_retain(bitcast!(c::MAP_FIXED))), - new_address, - ); - if res == c::MAP_FAILED { - Err(io::Errno::last_os_error()) - } else { - Ok(res) - } -} - -/// # Safety -/// -/// `mlock` operates on raw pointers and may round out to the nearest page -/// boundaries. -#[inline] -pub(crate) unsafe fn mlock(addr: *mut c::c_void, length: usize) -> io::Result<()> { - ret(c::mlock(addr, length)) -} - -/// # Safety -/// -/// `mlock_with` operates on raw pointers and may round out to the nearest page -/// boundaries. -#[cfg(linux_kernel)] -#[inline] -pub(crate) unsafe fn mlock_with( - addr: *mut c::c_void, - length: usize, - flags: MlockFlags, -) -> io::Result<()> { - weak_or_syscall! { - fn mlock2( - addr: *const c::c_void, - len: c::size_t, - flags: c::c_int - ) via SYS_mlock2 -> c::c_int - } - - ret(mlock2(addr, length, bitflags_bits!(flags))) -} - -/// # Safety -/// -/// `munlock` operates on raw pointers and may round out to the nearest page -/// boundaries. -#[inline] -pub(crate) unsafe fn munlock(addr: *mut c::c_void, length: usize) -> io::Result<()> { - ret(c::munlock(addr, length)) -} - -#[cfg(linux_kernel)] -pub(crate) unsafe fn userfaultfd(flags: UserfaultfdFlags) -> io::Result<OwnedFd> { - syscall! { - fn userfaultfd( - flags: c::c_int - ) via SYS_userfaultfd -> c::c_int - } - ret_owned_fd(userfaultfd(bitflags_bits!(flags))) -} - -/// Locks all pages mapped into the address space of the calling process. -/// -/// This includes the pages of the code, data, and stack segment, as well as -/// shared libraries, user space kernel data, shared memory, and memory-mapped -/// files. All mapped pages are guaranteed to be resident in RAM when the call -/// returns successfully; the pages are guaranteed to stay in RAM until later -/// unlocked. -#[inline] -#[cfg(any(linux_kernel, freebsdlike, netbsdlike))] -pub(crate) fn mlockall(flags: MlockAllFlags) -> io::Result<()> { - unsafe { ret(c::mlockall(bitflags_bits!(flags))) } -} - -/// Unlocks all pages mapped into the address space of the calling process. -#[inline] -#[cfg(any(linux_kernel, freebsdlike, netbsdlike))] -pub(crate) fn munlockall() -> io::Result<()> { - unsafe { ret(c::munlockall()) } -} diff --git a/vendor/rustix/src/backend/libc/mm/types.rs b/vendor/rustix/src/backend/libc/mm/types.rs deleted file mode 100644 index a4aa3e2..0000000 --- a/vendor/rustix/src/backend/libc/mm/types.rs +++ /dev/null @@ -1,477 +0,0 @@ -use crate::backend::c; -use bitflags::bitflags; - -bitflags! { - /// `PROT_*` flags for use with [`mmap`]. - /// - /// For `PROT_NONE`, use `ProtFlags::empty()`. - /// - /// [`mmap`]: crate::mm::mmap - #[repr(transparent)] - #[derive(Copy, Clone, Eq, PartialEq, Hash, Debug)] - pub struct ProtFlags: u32 { - /// `PROT_READ` - const READ = bitcast!(c::PROT_READ); - /// `PROT_WRITE` - const WRITE = bitcast!(c::PROT_WRITE); - /// `PROT_EXEC` - const EXEC = bitcast!(c::PROT_EXEC); - - /// <https://docs.rs/bitflags/*/bitflags/#externally-defined-flags> - const _ = !0; - } -} - -bitflags! { - /// `PROT_*` flags for use with [`mprotect`]. - /// - /// For `PROT_NONE`, use `MprotectFlags::empty()`. - /// - /// [`mprotect`]: crate::mm::mprotect - #[repr(transparent)] - #[derive(Copy, Clone, Eq, PartialEq, Hash, Debug)] - pub struct MprotectFlags: u32 { - /// `PROT_READ` - const READ = bitcast!(c::PROT_READ); - /// `PROT_WRITE` - const WRITE = bitcast!(c::PROT_WRITE); - /// `PROT_EXEC` - const EXEC = bitcast!(c::PROT_EXEC); - /// `PROT_GROWSUP` - #[cfg(linux_kernel)] - const GROWSUP = bitcast!(c::PROT_GROWSUP); - /// `PROT_GROWSDOWN` - #[cfg(linux_kernel)] - const GROWSDOWN = bitcast!(c::PROT_GROWSDOWN); - /// `PROT_SEM` - #[cfg(linux_kernel)] - const SEM = linux_raw_sys::general::PROT_SEM; - /// `PROT_BTI` - #[cfg(all(linux_kernel, target_arch = "aarch64"))] - const BTI = linux_raw_sys::general::PROT_BTI; - /// `PROT_MTE` - #[cfg(all(linux_kernel, target_arch = "aarch64"))] - const MTE = linux_raw_sys::general::PROT_MTE; - /// `PROT_SAO` - #[cfg(all(linux_kernel, any(target_arch = "powerpc", target_arch = "powerpc64")))] - const SAO = linux_raw_sys::general::PROT_SAO; - /// `PROT_ADI` - #[cfg(all(linux_kernel, any(target_arch = "sparc", target_arch = "sparc64")))] - const ADI = linux_raw_sys::general::PROT_ADI; - - /// <https://docs.rs/bitflags/*/bitflags/#externally-defined-flags> - const _ = !0; - } -} - -bitflags! { - /// `MAP_*` flags for use with [`mmap`]. - /// - /// For `MAP_ANONYMOUS` (aka `MAP_ANON`), see [`mmap_anonymous`]. - /// - /// [`mmap`]: crate::mm::mmap - /// [`mmap_anonymous`]: crates::mm::mmap_anonymous - #[repr(transparent)] - #[derive(Copy, Clone, Eq, PartialEq, Hash, Debug)] - pub struct MapFlags: u32 { - /// `MAP_SHARED` - const SHARED = bitcast!(c::MAP_SHARED); - /// `MAP_SHARED_VALIDATE` - #[cfg(not(any( - bsd, - solarish, - target_os = "aix", - target_os = "android", - target_os = "emscripten", - target_os = "fuchsia", - target_os = "haiku", - target_os = "nto", - target_os = "redox", - )))] - const SHARED_VALIDATE = bitcast!(c::MAP_SHARED_VALIDATE); - /// `MAP_PRIVATE` - const PRIVATE = bitcast!(c::MAP_PRIVATE); - /// `MAP_DENYWRITE` - #[cfg(not(any( - bsd, - solarish, - target_os = "aix", - target_os = "haiku", - target_os = "nto", - target_os = "redox", - )))] - const DENYWRITE = bitcast!(c::MAP_DENYWRITE); - /// `MAP_FIXED` - const FIXED = bitcast!(c::MAP_FIXED); - /// `MAP_FIXED_NOREPLACE` - #[cfg(not(any( - bsd, - solarish, - target_os = "aix", - target_os = "android", - target_os = "emscripten", - target_os = "fuchsia", - target_os = "haiku", - target_os = "nto", - target_os = "redox", - )))] - const FIXED_NOREPLACE = bitcast!(c::MAP_FIXED_NOREPLACE); - /// `MAP_GROWSDOWN` - #[cfg(not(any( - bsd, - solarish, - target_os = "aix", - target_os = "haiku", - target_os = "nto", - target_os = "redox", - )))] - const GROWSDOWN = bitcast!(c::MAP_GROWSDOWN); - /// `MAP_HUGETLB` - #[cfg(not(any( - bsd, - solarish, - target_os = "aix", - target_os = "haiku", - target_os = "nto", - target_os = "redox", - )))] - const HUGETLB = bitcast!(c::MAP_HUGETLB); - /// `MAP_HUGE_2MB` - #[cfg(not(any( - bsd, - solarish, - target_os = "aix", - target_os = "android", - target_os = "emscripten", - target_os = "fuchsia", - target_os = "haiku", - target_os = "nto", - target_os = "redox", - )))] - const HUGE_2MB = bitcast!(c::MAP_HUGE_2MB); - /// `MAP_HUGE_1GB` - #[cfg(not(any( - bsd, - solarish, - target_os = "aix", - target_os = "android", - target_os = "emscripten", - target_os = "fuchsia", - target_os = "haiku", - target_os = "nto", - target_os = "redox", - )))] - const HUGE_1GB = bitcast!(c::MAP_HUGE_1GB); - /// `MAP_LOCKED` - #[cfg(not(any( - bsd, - solarish, - target_os = "aix", - target_os = "haiku", - target_os = "nto", - target_os = "redox", - )))] - const LOCKED = bitcast!(c::MAP_LOCKED); - /// `MAP_NOCORE` - #[cfg(freebsdlike)] - const NOCORE = bitcast!(c::MAP_NOCORE); - /// `MAP_NORESERVE` - #[cfg(not(any( - freebsdlike, - target_os = "aix", - target_os = "nto", - target_os = "redox", - )))] - const NORESERVE = bitcast!(c::MAP_NORESERVE); - /// `MAP_NOSYNC` - #[cfg(freebsdlike)] - const NOSYNC = bitcast!(c::MAP_NOSYNC); - /// `MAP_POPULATE` - #[cfg(not(any( - bsd, - solarish, - target_os = "aix", - target_os = "haiku", - target_os = "nto", - target_os = "redox", - )))] - const POPULATE = bitcast!(c::MAP_POPULATE); - /// `MAP_STACK` - #[cfg(not(any( - apple, - solarish, - target_os = "aix", - target_os = "dragonfly", - target_os = "haiku", - target_os = "netbsd", - target_os = "redox", - )))] - const STACK = bitcast!(c::MAP_STACK); - /// `MAP_PREFAULT_READ` - #[cfg(target_os = "freebsd")] - const PREFAULT_READ = bitcast!(c::MAP_PREFAULT_READ); - /// `MAP_SYNC` - #[cfg(not(any( - bsd, - solarish, - target_os = "aix", - target_os = "android", - target_os = "emscripten", - target_os = "fuchsia", - target_os = "haiku", - target_os = "nto", - target_os = "redox", - all( - linux_kernel, - any(target_arch = "mips", target_arch = "mips32r6", target_arch = "mips64", target_arch = "mips64r6"), - ) - )))] - const SYNC = bitcast!(c::MAP_SYNC); - /// `MAP_UNINITIALIZED` - #[cfg(any())] - const UNINITIALIZED = bitcast!(c::MAP_UNINITIALIZED); - - /// <https://docs.rs/bitflags/*/bitflags/#externally-defined-flags> - const _ = !0; - } -} - -#[cfg(any(target_os = "emscripten", target_os = "linux"))] -bitflags! { - /// `MREMAP_*` flags for use with [`mremap`]. - /// - /// For `MREMAP_FIXED`, see [`mremap_fixed`]. - /// - /// [`mremap`]: crate::mm::mremap - /// [`mremap_fixed`]: crate::mm::mremap_fixed - #[repr(transparent)] - #[derive(Copy, Clone, Eq, PartialEq, Hash, Debug)] - pub struct MremapFlags: u32 { - /// `MREMAP_MAYMOVE` - const MAYMOVE = bitcast!(c::MREMAP_MAYMOVE); - - /// <https://docs.rs/bitflags/*/bitflags/#externally-defined-flags> - const _ = !0; - } -} - -bitflags! { - /// `MS_*` flags for use with [`msync`]. - /// - /// [`msync`]: crate::mm::msync - #[repr(transparent)] - #[derive(Copy, Clone, Eq, PartialEq, Hash, Debug)] - pub struct MsyncFlags: u32 { - /// `MS_SYNC`—Requests an update and waits for it to complete. - const SYNC = bitcast!(c::MS_SYNC); - /// `MS_ASYNC`—Specifies that an update be scheduled, but the call - /// returns immediately. - const ASYNC = bitcast!(c::MS_ASYNC); - /// `MS_INVALIDATE`—Asks to invalidate other mappings of the same - /// file (so that they can be updated with the fresh values just - /// written). - const INVALIDATE = bitcast!(c::MS_INVALIDATE); - - /// <https://docs.rs/bitflags/*/bitflags/#externally-defined-flags> - const _ = !0; - } -} - -#[cfg(linux_kernel)] -bitflags! { - /// `MLOCK_*` flags for use with [`mlock_with`]. - /// - /// [`mlock_with`]: crate::mm::mlock_with - #[repr(transparent)] - #[derive(Copy, Clone, Eq, PartialEq, Hash, Debug)] - pub struct MlockFlags: u32 { - /// `MLOCK_ONFAULT` - const ONFAULT = bitcast!(c::MLOCK_ONFAULT); - - /// <https://docs.rs/bitflags/*/bitflags/#externally-defined-flags> - const _ = !0; - } -} - -/// `POSIX_MADV_*` constants for use with [`madvise`]. -/// -/// [`madvise`]: crate::mm::madvise -#[cfg(not(target_os = "redox"))] -#[derive(Debug, Copy, Clone, Eq, PartialEq)] -#[repr(u32)] -#[non_exhaustive] -pub enum Advice { - /// `POSIX_MADV_NORMAL` - #[cfg(not(any(target_os = "android", target_os = "haiku")))] - Normal = bitcast!(c::POSIX_MADV_NORMAL), - - /// `POSIX_MADV_NORMAL` - #[cfg(any(target_os = "android", target_os = "haiku"))] - Normal = bitcast!(c::MADV_NORMAL), - - /// `POSIX_MADV_SEQUENTIAL` - #[cfg(not(any(target_os = "android", target_os = "haiku")))] - Sequential = bitcast!(c::POSIX_MADV_SEQUENTIAL), - - /// `POSIX_MADV_SEQUENTIAL` - #[cfg(any(target_os = "android", target_os = "haiku"))] - Sequential = bitcast!(c::MADV_SEQUENTIAL), - - /// `POSIX_MADV_RANDOM` - #[cfg(not(any(target_os = "android", target_os = "haiku")))] - Random = bitcast!(c::POSIX_MADV_RANDOM), - - /// `POSIX_MADV_RANDOM` - #[cfg(any(target_os = "android", target_os = "haiku"))] - Random = bitcast!(c::MADV_RANDOM), - - /// `POSIX_MADV_WILLNEED` - #[cfg(not(any(target_os = "android", target_os = "haiku")))] - WillNeed = bitcast!(c::POSIX_MADV_WILLNEED), - - /// `POSIX_MADV_WILLNEED` - #[cfg(any(target_os = "android", target_os = "haiku"))] - WillNeed = bitcast!(c::MADV_WILLNEED), - - /// `POSIX_MADV_DONTNEED` - #[cfg(not(any(target_os = "android", target_os = "emscripten", target_os = "haiku")))] - DontNeed = bitcast!(c::POSIX_MADV_DONTNEED), - - /// `POSIX_MADV_DONTNEED` - #[cfg(any(target_os = "android", target_os = "haiku"))] - DontNeed = bitcast!(i32::MAX - 1), - - /// `MADV_DONTNEED` - // `MADV_DONTNEED` has the same value as `POSIX_MADV_DONTNEED`. We don't - // have a separate `posix_madvise` from `madvise`, so we expose a special - // value which we special-case. - #[cfg(target_os = "linux")] - LinuxDontNeed = bitcast!(i32::MAX), - - /// `MADV_DONTNEED` - #[cfg(target_os = "android")] - LinuxDontNeed = bitcast!(c::MADV_DONTNEED), - /// `MADV_FREE` - #[cfg(linux_kernel)] - LinuxFree = bitcast!(c::MADV_FREE), - /// `MADV_REMOVE` - #[cfg(linux_kernel)] - LinuxRemove = bitcast!(c::MADV_REMOVE), - /// `MADV_DONTFORK` - #[cfg(linux_kernel)] - LinuxDontFork = bitcast!(c::MADV_DONTFORK), - /// `MADV_DOFORK` - #[cfg(linux_kernel)] - LinuxDoFork = bitcast!(c::MADV_DOFORK), - /// `MADV_HWPOISON` - #[cfg(linux_kernel)] - LinuxHwPoison = bitcast!(c::MADV_HWPOISON), - /// `MADV_SOFT_OFFLINE` - #[cfg(all( - linux_kernel, - not(any( - target_arch = "mips", - target_arch = "mips32r6", - target_arch = "mips64", - target_arch = "mips64r6" - )) - ))] - LinuxSoftOffline = bitcast!(c::MADV_SOFT_OFFLINE), - /// `MADV_MERGEABLE` - #[cfg(linux_kernel)] - LinuxMergeable = bitcast!(c::MADV_MERGEABLE), - /// `MADV_UNMERGEABLE` - #[cfg(linux_kernel)] - LinuxUnmergeable = bitcast!(c::MADV_UNMERGEABLE), - /// `MADV_HUGEPAGE` - #[cfg(linux_kernel)] - LinuxHugepage = bitcast!(c::MADV_HUGEPAGE), - /// `MADV_NOHUGEPAGE` - #[cfg(linux_kernel)] - LinuxNoHugepage = bitcast!(c::MADV_NOHUGEPAGE), - /// `MADV_DONTDUMP` (since Linux 3.4) - #[cfg(linux_kernel)] - LinuxDontDump = bitcast!(c::MADV_DONTDUMP), - /// `MADV_DODUMP` (since Linux 3.4) - #[cfg(linux_kernel)] - LinuxDoDump = bitcast!(c::MADV_DODUMP), - /// `MADV_WIPEONFORK` (since Linux 4.14) - #[cfg(linux_kernel)] - LinuxWipeOnFork = bitcast!(c::MADV_WIPEONFORK), - /// `MADV_KEEPONFORK` (since Linux 4.14) - #[cfg(linux_kernel)] - LinuxKeepOnFork = bitcast!(c::MADV_KEEPONFORK), - /// `MADV_COLD` (since Linux 5.4) - #[cfg(linux_kernel)] - LinuxCold = bitcast!(c::MADV_COLD), - /// `MADV_PAGEOUT` (since Linux 5.4) - #[cfg(linux_kernel)] - LinuxPageOut = bitcast!(c::MADV_PAGEOUT), - /// `MADV_POPULATE_READ` (since Linux 5.14) - #[cfg(linux_kernel)] - LinuxPopulateRead = bitcast!(c::MADV_POPULATE_READ), - /// `MADV_POPULATE_WRITE` (since Linux 5.14) - #[cfg(linux_kernel)] - LinuxPopulateWrite = bitcast!(c::MADV_POPULATE_WRITE), - /// `MADV_DONTNEED_LOCKED` (since Linux 5.18) - #[cfg(linux_kernel)] - LinuxDontneedLocked = bitcast!(c::MADV_DONTNEED_LOCKED), -} - -#[cfg(target_os = "emscripten")] -#[allow(non_upper_case_globals)] -impl Advice { - /// `POSIX_MADV_DONTNEED` - pub const DontNeed: Self = Self::Normal; -} - -#[cfg(linux_kernel)] -bitflags! { - /// `O_*` flags for use with [`userfaultfd`]. - /// - /// [`userfaultfd`]: crate::mm::userfaultfd - #[repr(transparent)] - #[derive(Copy, Clone, Eq, PartialEq, Hash, Debug)] - pub struct UserfaultfdFlags: u32 { - /// `O_CLOEXEC` - const CLOEXEC = bitcast!(c::O_CLOEXEC); - /// `O_NONBLOCK` - const NONBLOCK = bitcast!(c::O_NONBLOCK); - - /// <https://docs.rs/bitflags/*/bitflags/#externally-defined-flags> - const _ = !0; - } -} - -#[cfg(any(linux_kernel, freebsdlike, netbsdlike))] -bitflags! { - /// `MCL_*` flags for use with [`mlockall`]. - /// - /// [`mlockall`]: crate::mm::mlockall - #[repr(transparent)] - #[derive(Copy, Clone, Eq, PartialEq, Hash, Debug)] - pub struct MlockAllFlags: u32 { - /// Used together with `MCL_CURRENT`, `MCL_FUTURE`, or both. Mark all - /// current (with `MCL_CURRENT`) or future (with `MCL_FUTURE`) mappings - /// to lock pages when they are faulted in. When used with - /// `MCL_CURRENT`, all present pages are locked, but `mlockall` will - /// not fault in non-present pages. When used with `MCL_FUTURE`, all - /// future mappings will be marked to lock pages when they are faulted - /// in, but they will not be populated by the lock when the mapping is - /// created. `MCL_ONFAULT` must be used with either `MCL_CURRENT` or - /// `MCL_FUTURE` or both. - #[cfg(linux_kernel)] - const ONFAULT = bitcast!(libc::MCL_ONFAULT); - /// Lock all pages which will become mapped into the address space of - /// the process in the future. These could be, for instance, new pages - /// required by a growing heap and stack as well as new memory-mapped - /// files or shared memory regions. - const FUTURE = bitcast!(libc::MCL_FUTURE); - /// Lock all pages which are currently mapped into the address space of - /// the process. - const CURRENT = bitcast!(libc::MCL_CURRENT); - - /// <https://docs.rs/bitflags/*/bitflags/#externally-defined-flags> - const _ = !0; - } -} diff --git a/vendor/rustix/src/backend/libc/mod.rs b/vendor/rustix/src/backend/libc/mod.rs deleted file mode 100644 index 9ecb09f..0000000 --- a/vendor/rustix/src/backend/libc/mod.rs +++ /dev/null @@ -1,215 +0,0 @@ -//! The libc backend. -//! -//! On most platforms, this uses the `libc` crate to make system calls. On -//! Windows, this uses the Winsock API in `windows-sys`, which can be adapted -//! to have a very `libc`-like interface. - -// Every FFI call requires an unsafe block, and there are a lot of FFI -// calls. For now, set this to allow for the libc backend. -#![allow(clippy::undocumented_unsafe_blocks)] -// Lots of libc types vary between platforms, so we often need a `.into()` on -// one platform where it's redundant on another. -#![allow(clippy::useless_conversion)] - -mod conv; - -#[cfg(windows)] -pub(crate) mod fd { - pub use crate::maybe_polyfill::os::windows::io::{ - AsRawSocket, AsSocket, BorrowedSocket as BorrowedFd, FromRawSocket, IntoRawSocket, - OwnedSocket as OwnedFd, RawSocket as RawFd, - }; - pub(crate) use windows_sys::Win32::Networking::WinSock::SOCKET as LibcFd; - - /// A version of [`AsRawFd`] for use with Winsock API. - /// - /// [`AsRawFd`]: https://doc.rust-lang.org/stable/std/os/fd/trait.AsRawFd.html - pub trait AsRawFd { - /// A version of [`as_raw_fd`] for use with Winsock API. - /// - /// [`as_raw_fd`]: https://doc.rust-lang.org/stable/std/os/fd/trait.FromRawFd.html#tymethod.as_raw_fd - fn as_raw_fd(&self) -> RawFd; - } - impl<T: AsRawSocket> AsRawFd for T { - #[inline] - fn as_raw_fd(&self) -> RawFd { - self.as_raw_socket() - } - } - - /// A version of [`IntoRawFd`] for use with Winsock API. - /// - /// [`IntoRawFd`]: https://doc.rust-lang.org/stable/std/os/fd/trait.IntoRawFd.html - pub trait IntoRawFd { - /// A version of [`into_raw_fd`] for use with Winsock API. - /// - /// [`into_raw_fd`]: https://doc.rust-lang.org/stable/std/os/fd/trait.FromRawFd.html#tymethod.into_raw_fd - fn into_raw_fd(self) -> RawFd; - } - impl<T: IntoRawSocket> IntoRawFd for T { - #[inline] - fn into_raw_fd(self) -> RawFd { - self.into_raw_socket() - } - } - - /// A version of [`FromRawFd`] for use with Winsock API. - /// - /// [`FromRawFd`]: https://doc.rust-lang.org/stable/std/os/fd/trait.FromRawFd.html - pub trait FromRawFd { - /// A version of [`from_raw_fd`] for use with Winsock API. - /// - /// # Safety - /// - /// See the [safety requirements] for [`from_raw_fd`]. - /// - /// [`from_raw_fd`]: https://doc.rust-lang.org/stable/std/os/fd/trait.FromRawFd.html#tymethod.from_raw_fd - /// [safety requirements]: https://doc.rust-lang.org/stable/std/os/fd/trait.FromRawFd.html#safety - unsafe fn from_raw_fd(raw_fd: RawFd) -> Self; - } - impl<T: FromRawSocket> FromRawFd for T { - #[inline] - unsafe fn from_raw_fd(raw_fd: RawFd) -> Self { - Self::from_raw_socket(raw_fd) - } - } - - /// A version of [`AsFd`] for use with Winsock API. - /// - /// [`AsFd`]: https://doc.rust-lang.org/stable/std/os/fd/trait.AsFd.html - pub trait AsFd { - /// An `as_fd` function for Winsock, where a `Fd` is a `Socket`. - fn as_fd(&self) -> BorrowedFd; - } - impl<T: AsSocket> AsFd for T { - #[inline] - fn as_fd(&self) -> BorrowedFd { - self.as_socket() - } - } -} -#[cfg(not(windows))] -pub(crate) mod fd { - pub use crate::maybe_polyfill::os::fd::{ - AsFd, AsRawFd, BorrowedFd, FromRawFd, IntoRawFd, OwnedFd, RawFd, - }; - #[allow(unused_imports)] - pub(crate) use RawFd as LibcFd; -} - -// On Windows we emulate selected libc-compatible interfaces. On non-Windows, -// we just use libc here, since this is the libc backend. -#[cfg_attr(windows, path = "winsock_c.rs")] -pub(crate) mod c; - -#[cfg(feature = "event")] -pub(crate) mod event; -#[cfg(not(windows))] -#[cfg(feature = "fs")] -pub(crate) mod fs; -pub(crate) mod io; -#[cfg(linux_kernel)] -#[cfg(feature = "io_uring")] -pub(crate) mod io_uring; -#[cfg(not(any(windows, target_os = "espidf", target_os = "vita", target_os = "wasi")))] -#[cfg(feature = "mm")] -pub(crate) mod mm; -#[cfg(linux_kernel)] -#[cfg(feature = "mount")] -pub(crate) mod mount; -#[cfg(linux_kernel)] -#[cfg(all(feature = "fs", not(feature = "mount")))] -pub(crate) mod mount; // for deprecated mount functions in "fs" -#[cfg(not(any(target_os = "redox", target_os = "wasi")))] -#[cfg(feature = "net")] -pub(crate) mod net; -#[cfg(not(any(windows, target_os = "espidf")))] -#[cfg(any( - feature = "param", - feature = "runtime", - feature = "time", - target_arch = "x86", -))] -pub(crate) mod param; -#[cfg(not(windows))] -#[cfg(feature = "pipe")] -pub(crate) mod pipe; -#[cfg(not(windows))] -#[cfg(feature = "process")] -pub(crate) mod process; -#[cfg(not(windows))] -#[cfg(not(target_os = "wasi"))] -#[cfg(feature = "pty")] -pub(crate) mod pty; -#[cfg(not(windows))] -#[cfg(feature = "rand")] -pub(crate) mod rand; -#[cfg(not(windows))] -#[cfg(not(target_os = "wasi"))] -#[cfg(feature = "system")] -pub(crate) mod system; -#[cfg(not(any(windows, target_os = "vita")))] -#[cfg(feature = "termios")] -pub(crate) mod termios; -#[cfg(not(windows))] -#[cfg(feature = "thread")] -pub(crate) mod thread; -#[cfg(not(any(windows, target_os = "espidf")))] -#[cfg(feature = "time")] -pub(crate) mod time; - -/// If the host libc is glibc, return `true` if it is less than version 2.25. -/// -/// To restate and clarify, this function returning true does not mean the libc -/// is glibc just that if it is glibc, it is less than version 2.25. -/// -/// For now, this function is only available on Linux, but if it ends up being -/// used beyond that, this could be changed to e.g. `#[cfg(unix)]`. -#[cfg(all(unix, target_env = "gnu"))] -pub(crate) fn if_glibc_is_less_than_2_25() -> bool { - // This is also defined inside `weak_or_syscall!` in - // backend/libc/rand/syscalls.rs, but it's not convenient to re-export the - // weak symbol from that macro, so we duplicate it at a small cost here. - weak! { fn getrandom(*mut c::c_void, c::size_t, c::c_uint) -> c::ssize_t } - - // glibc 2.25 has `getrandom`, which is how we satisfy the API contract of - // this function. But, there are likely other libc versions which have it. - getrandom.get().is_none() -} - -// Private modules used by multiple public modules. -#[cfg(any(feature = "procfs", feature = "process", feature = "runtime"))] -#[cfg(not(any(windows, target_os = "wasi")))] -pub(crate) mod pid; -#[cfg(any(feature = "process", feature = "thread"))] -#[cfg(linux_kernel)] -pub(crate) mod prctl; -#[cfg(not(any( - windows, - target_os = "android", - target_os = "espidf", - target_os = "vita", - target_os = "wasi" -)))] -#[cfg(feature = "shm")] -pub(crate) mod shm; -#[cfg(any(feature = "fs", feature = "thread", feature = "process"))] -#[cfg(not(any(windows, target_os = "wasi")))] -pub(crate) mod ugid; - -#[cfg(bsd)] -const MAX_IOV: usize = c::IOV_MAX as usize; - -#[cfg(any(linux_kernel, target_os = "emscripten", target_os = "nto"))] -const MAX_IOV: usize = c::UIO_MAXIOV as usize; - -#[cfg(not(any( - bsd, - linux_kernel, - windows, - target_os = "emscripten", - target_os = "espidf", - target_os = "nto", - target_os = "horizon", -)))] -const MAX_IOV: usize = 16; // The minimum value required by POSIX. diff --git a/vendor/rustix/src/backend/libc/mount/mod.rs b/vendor/rustix/src/backend/libc/mount/mod.rs deleted file mode 100644 index 1e0181a..0000000 --- a/vendor/rustix/src/backend/libc/mount/mod.rs +++ /dev/null @@ -1,2 +0,0 @@ -pub(crate) mod syscalls; -pub(crate) mod types; diff --git a/vendor/rustix/src/backend/libc/mount/syscalls.rs b/vendor/rustix/src/backend/libc/mount/syscalls.rs deleted file mode 100644 index 7245114..0000000 --- a/vendor/rustix/src/backend/libc/mount/syscalls.rs +++ /dev/null @@ -1,272 +0,0 @@ -use crate::backend::c; -use crate::backend::conv::ret; -#[cfg(feature = "mount")] -use crate::backend::conv::{borrowed_fd, c_str, ret_owned_fd}; -#[cfg(feature = "mount")] -use crate::fd::{BorrowedFd, OwnedFd}; -use crate::ffi::CStr; -use crate::io; -use core::ptr::null; - -#[cfg(linux_kernel)] -pub(crate) fn mount( - source: Option<&CStr>, - target: &CStr, - file_system_type: Option<&CStr>, - flags: super::types::MountFlagsArg, - data: Option<&CStr>, -) -> io::Result<()> { - unsafe { - ret(c::mount( - source.map_or_else(null, CStr::as_ptr), - target.as_ptr(), - file_system_type.map_or_else(null, CStr::as_ptr), - flags.0, - data.map_or_else(null, CStr::as_ptr).cast(), - )) - } -} - -#[cfg(linux_kernel)] -pub(crate) fn unmount(target: &CStr, flags: super::types::UnmountFlags) -> io::Result<()> { - unsafe { ret(c::umount2(target.as_ptr(), bitflags_bits!(flags))) } -} - -#[cfg(linux_kernel)] -#[cfg(feature = "mount")] -pub(crate) fn fsopen(fs_name: &CStr, flags: super::types::FsOpenFlags) -> io::Result<OwnedFd> { - syscall! { - fn fsopen( - fs_name: *const c::c_char, - flags: c::c_uint - ) via SYS_fsopen -> c::c_int - } - unsafe { ret_owned_fd(fsopen(c_str(fs_name), flags.bits())) } -} - -#[cfg(linux_kernel)] -#[cfg(feature = "mount")] -pub(crate) fn fsmount( - fs_fd: BorrowedFd<'_>, - flags: super::types::FsMountFlags, - attr_flags: super::types::MountAttrFlags, -) -> io::Result<OwnedFd> { - syscall! { - fn fsmount( - fs_fd: c::c_int, - flags: c::c_uint, - attr_flags: c::c_uint - ) via SYS_fsmount -> c::c_int - } - unsafe { ret_owned_fd(fsmount(borrowed_fd(fs_fd), flags.bits(), attr_flags.bits())) } -} - -#[cfg(linux_kernel)] -#[cfg(feature = "mount")] -pub(crate) fn move_mount( - from_dfd: BorrowedFd<'_>, - from_pathname: &CStr, - to_dfd: BorrowedFd<'_>, - to_pathname: &CStr, - flags: super::types::MoveMountFlags, -) -> io::Result<()> { - syscall! { - fn move_mount( - from_dfd: c::c_int, - from_pathname: *const c::c_char, - to_dfd: c::c_int, - to_pathname: *const c::c_char, - flags: c::c_uint - ) via SYS_move_mount -> c::c_int - } - unsafe { - ret(move_mount( - borrowed_fd(from_dfd), - c_str(from_pathname), - borrowed_fd(to_dfd), - c_str(to_pathname), - flags.bits(), - )) - } -} - -#[cfg(linux_kernel)] -#[cfg(feature = "mount")] -pub(crate) fn open_tree( - dfd: BorrowedFd<'_>, - filename: &CStr, - flags: super::types::OpenTreeFlags, -) -> io::Result<OwnedFd> { - syscall! { - fn open_tree( - dfd: c::c_int, - filename: *const c::c_char, - flags: c::c_uint - ) via SYS_open_tree -> c::c_int - } - - unsafe { ret_owned_fd(open_tree(borrowed_fd(dfd), c_str(filename), flags.bits())) } -} - -#[cfg(linux_kernel)] -#[cfg(feature = "mount")] -pub(crate) fn fspick( - dfd: BorrowedFd<'_>, - path: &CStr, - flags: super::types::FsPickFlags, -) -> io::Result<OwnedFd> { - syscall! { - fn fspick( - dfd: c::c_int, - path: *const c::c_char, - flags: c::c_uint - ) via SYS_fspick -> c::c_int - } - - unsafe { ret_owned_fd(fspick(borrowed_fd(dfd), c_str(path), flags.bits())) } -} - -#[cfg(feature = "mount")] -#[cfg(linux_kernel)] -syscall! { - fn fsconfig( - fs_fd: c::c_int, - cmd: c::c_uint, - key: *const c::c_char, - val: *const c::c_char, - aux: c::c_int - ) via SYS_fsconfig -> c::c_int -} - -#[cfg(linux_kernel)] -#[cfg(feature = "mount")] -pub(crate) fn fsconfig_set_flag(fs_fd: BorrowedFd<'_>, key: &CStr) -> io::Result<()> { - unsafe { - ret(fsconfig( - borrowed_fd(fs_fd), - super::types::FsConfigCmd::SetFlag as _, - c_str(key), - null(), - 0, - )) - } -} - -#[cfg(linux_kernel)] -#[cfg(feature = "mount")] -pub(crate) fn fsconfig_set_string( - fs_fd: BorrowedFd<'_>, - key: &CStr, - value: &CStr, -) -> io::Result<()> { - unsafe { - ret(fsconfig( - borrowed_fd(fs_fd), - super::types::FsConfigCmd::SetString as _, - c_str(key), - c_str(value), - 0, - )) - } -} - -#[cfg(linux_kernel)] -#[cfg(feature = "mount")] -pub(crate) fn fsconfig_set_binary( - fs_fd: BorrowedFd<'_>, - key: &CStr, - value: &[u8], -) -> io::Result<()> { - unsafe { - ret(fsconfig( - borrowed_fd(fs_fd), - super::types::FsConfigCmd::SetBinary as _, - c_str(key), - value.as_ptr().cast(), - value.len().try_into().map_err(|_| io::Errno::OVERFLOW)?, - )) - } -} - -#[cfg(linux_kernel)] -#[cfg(feature = "mount")] -pub(crate) fn fsconfig_set_fd( - fs_fd: BorrowedFd<'_>, - key: &CStr, - fd: BorrowedFd<'_>, -) -> io::Result<()> { - unsafe { - ret(fsconfig( - borrowed_fd(fs_fd), - super::types::FsConfigCmd::SetFd as _, - c_str(key), - null(), - borrowed_fd(fd), - )) - } -} - -#[cfg(linux_kernel)] -#[cfg(feature = "mount")] -pub(crate) fn fsconfig_set_path( - fs_fd: BorrowedFd<'_>, - key: &CStr, - path: &CStr, - fd: BorrowedFd<'_>, -) -> io::Result<()> { - unsafe { - ret(fsconfig( - borrowed_fd(fs_fd), - super::types::FsConfigCmd::SetPath as _, - c_str(key), - c_str(path), - borrowed_fd(fd), - )) - } -} - -#[cfg(linux_kernel)] -#[cfg(feature = "mount")] -pub(crate) fn fsconfig_set_path_empty( - fs_fd: BorrowedFd<'_>, - key: &CStr, - fd: BorrowedFd<'_>, -) -> io::Result<()> { - unsafe { - ret(fsconfig( - borrowed_fd(fs_fd), - super::types::FsConfigCmd::SetPathEmpty as _, - c_str(key), - c_str(cstr!("")), - borrowed_fd(fd), - )) - } -} - -#[cfg(linux_kernel)] -#[cfg(feature = "mount")] -pub(crate) fn fsconfig_create(fs_fd: BorrowedFd<'_>) -> io::Result<()> { - unsafe { - ret(fsconfig( - borrowed_fd(fs_fd), - super::types::FsConfigCmd::Create as _, - null(), - null(), - 0, - )) - } -} - -#[cfg(linux_kernel)] -#[cfg(feature = "mount")] -pub(crate) fn fsconfig_reconfigure(fs_fd: BorrowedFd<'_>) -> io::Result<()> { - unsafe { - ret(fsconfig( - borrowed_fd(fs_fd), - super::types::FsConfigCmd::Reconfigure as _, - null(), - null(), - 0, - )) - } -} diff --git a/vendor/rustix/src/backend/libc/mount/types.rs b/vendor/rustix/src/backend/libc/mount/types.rs deleted file mode 100644 index 1023686..0000000 --- a/vendor/rustix/src/backend/libc/mount/types.rs +++ /dev/null @@ -1,340 +0,0 @@ -use crate::backend::c; -use bitflags::bitflags; - -#[cfg(linux_kernel)] -bitflags! { - /// `MS_*` constants for use with [`mount`]. - /// - /// [`mount`]: crate::mount::mount - #[repr(transparent)] - #[derive(Copy, Clone, Eq, PartialEq, Hash, Debug)] - pub struct MountFlags: c::c_ulong { - /// `MS_BIND` - const BIND = c::MS_BIND; - - /// `MS_DIRSYNC` - const DIRSYNC = c::MS_DIRSYNC; - - /// `MS_LAZYTIME` - const LAZYTIME = c::MS_LAZYTIME; - - /// `MS_MANDLOCK` - #[doc(alias = "MANDLOCK")] - const PERMIT_MANDATORY_FILE_LOCKING = c::MS_MANDLOCK; - - /// `MS_NOATIME` - const NOATIME = c::MS_NOATIME; - - /// `MS_NODEV` - const NODEV = c::MS_NODEV; - - /// `MS_NODIRATIME` - const NODIRATIME = c::MS_NODIRATIME; - - /// `MS_NOEXEC` - const NOEXEC = c::MS_NOEXEC; - - /// `MS_NOSUID` - const NOSUID = c::MS_NOSUID; - - /// `MS_RDONLY` - const RDONLY = c::MS_RDONLY; - - /// `MS_REC` - const REC = c::MS_REC; - - /// `MS_RELATIME` - const RELATIME = c::MS_RELATIME; - - /// `MS_SILENT` - const SILENT = c::MS_SILENT; - - /// `MS_STRICTATIME` - const STRICTATIME = c::MS_STRICTATIME; - - /// `MS_SYNCHRONOUS` - const SYNCHRONOUS = c::MS_SYNCHRONOUS; - - /// <https://docs.rs/bitflags/*/bitflags/#externally-defined-flags> - const _ = !0; - } -} - -#[cfg(linux_kernel)] -bitflags! { - /// `MNT_*` constants for use with [`unmount`]. - /// - /// [`unmount`]: crate::mount::unmount - #[repr(transparent)] - #[derive(Copy, Clone, Eq, PartialEq, Hash, Debug)] - pub struct UnmountFlags: u32 { - /// `MNT_FORCE` - const FORCE = bitcast!(c::MNT_FORCE); - /// `MNT_DETACH` - const DETACH = bitcast!(c::MNT_DETACH); - /// `MNT_EXPIRE` - const EXPIRE = bitcast!(c::MNT_EXPIRE); - /// `UMOUNT_NOFOLLOW` - const NOFOLLOW = bitcast!(c::UMOUNT_NOFOLLOW); - - /// <https://docs.rs/bitflags/*/bitflags/#externally-defined-flags> - const _ = !0; - } -} - -#[cfg(feature = "mount")] -#[cfg(linux_kernel)] -bitflags! { - /// `FSOPEN_*` constants for use with [`fsopen`]. - /// - /// [`fsopen`]: crate::mount::fsopen - #[repr(transparent)] - #[derive(Copy, Clone, Eq, PartialEq, Hash, Debug)] - pub struct FsOpenFlags: c::c_uint { - /// `FSOPEN_CLOEXEC` - const FSOPEN_CLOEXEC = 0x0000_0001; - - /// <https://docs.rs/bitflags/*/bitflags/#externally-defined-flags> - const _ = !0; - } -} - -#[cfg(feature = "mount")] -#[cfg(linux_kernel)] -bitflags! { - /// `FSMOUNT_*` constants for use with [`fsmount`]. - /// - /// [`fsmount`]: crate::mount::fsmount - #[repr(transparent)] - #[derive(Copy, Clone, Eq, PartialEq, Hash, Debug)] - pub struct FsMountFlags: c::c_uint { - /// `FSMOUNT_CLOEXEC` - const FSMOUNT_CLOEXEC = 0x0000_0001; - - /// <https://docs.rs/bitflags/*/bitflags/#externally-defined-flags> - const _ = !0; - } -} - -/// `FSCONFIG_*` constants for use with the `fsconfig` syscall. -#[cfg(feature = "mount")] -#[cfg(linux_kernel)] -#[derive(Debug, Copy, Clone, Eq, PartialEq)] -#[repr(u32)] -pub(crate) enum FsConfigCmd { - /// `FSCONFIG_SET_FLAG` - SetFlag = 0, - - /// `FSCONFIG_SET_STRING` - SetString = 1, - - /// `FSCONFIG_SET_BINARY` - SetBinary = 2, - - /// `FSCONFIG_SET_PATH` - SetPath = 3, - - /// `FSCONFIG_SET_PATH_EMPTY` - SetPathEmpty = 4, - - /// `FSCONFIG_SET_FD` - SetFd = 5, - - /// `FSCONFIG_CMD_CREATE` - Create = 6, - - /// `FSCONFIG_CMD_RECONFIGURE` - Reconfigure = 7, -} - -#[cfg(feature = "mount")] -#[cfg(linux_kernel)] -bitflags! { - /// `MOUNT_ATTR_*` constants for use with [`fsmount`]. - /// - /// [`fsmount`]: crate::mount::fsmount - #[repr(transparent)] - #[derive(Copy, Clone, Eq, PartialEq, Hash, Debug)] - pub struct MountAttrFlags: c::c_uint { - /// `MOUNT_ATTR_RDONLY` - const MOUNT_ATTR_RDONLY = 0x0000_0001; - - /// `MOUNT_ATTR_NOSUID` - const MOUNT_ATTR_NOSUID = 0x0000_0002; - - /// `MOUNT_ATTR_NODEV` - const MOUNT_ATTR_NODEV = 0x0000_0004; - - /// `MOUNT_ATTR_NOEXEC` - const MOUNT_ATTR_NOEXEC = 0x0000_0008; - - /// `MOUNT_ATTR__ATIME` - const MOUNT_ATTR__ATIME = 0x0000_0070; - - /// `MOUNT_ATTR_RELATIME` - const MOUNT_ATTR_RELATIME = 0x0000_0000; - - /// `MOUNT_ATTR_NOATIME` - const MOUNT_ATTR_NOATIME = 0x0000_0010; - - /// `MOUNT_ATTR_STRICTATIME` - const MOUNT_ATTR_STRICTATIME = 0x0000_0020; - - /// `MOUNT_ATTR_NODIRATIME` - const MOUNT_ATTR_NODIRATIME = 0x0000_0080; - - /// `MOUNT_ATTR_NOUSER` - const MOUNT_ATTR_IDMAP = 0x0010_0000; - - /// `MOUNT_ATTR__ATIME_FLAGS` - const MOUNT_ATTR_NOSYMFOLLOW = 0x0020_0000; - - /// `MOUNT_ATTR__ATIME_FLAGS` - const MOUNT_ATTR_SIZE_VER0 = 32; - - /// <https://docs.rs/bitflags/*/bitflags/#externally-defined-flags> - const _ = !0; - } -} - -#[cfg(feature = "mount")] -#[cfg(linux_kernel)] -bitflags! { - /// `MOVE_MOUNT_*` constants for use with [`move_mount`]. - /// - /// [`move_mount`]: crate::mount::move_mount - #[repr(transparent)] - #[derive(Copy, Clone, Eq, PartialEq, Hash, Debug)] - pub struct MoveMountFlags: c::c_uint { - /// `MOVE_MOUNT_F_EMPTY_PATH` - const MOVE_MOUNT_F_SYMLINKS = 0x0000_0001; - - /// `MOVE_MOUNT_F_AUTOMOUNTS` - const MOVE_MOUNT_F_AUTOMOUNTS = 0x0000_0002; - - /// `MOVE_MOUNT_F_EMPTY_PATH` - const MOVE_MOUNT_F_EMPTY_PATH = 0x0000_0004; - - /// `MOVE_MOUNT_T_SYMLINKS` - const MOVE_MOUNT_T_SYMLINKS = 0x0000_0010; - - /// `MOVE_MOUNT_T_AUTOMOUNTS` - const MOVE_MOUNT_T_AUTOMOUNTS = 0x0000_0020; - - /// `MOVE_MOUNT_T_EMPTY_PATH` - const MOVE_MOUNT_T_EMPTY_PATH = 0x0000_0040; - - /// `MOVE_MOUNT__MASK` - const MOVE_MOUNT_SET_GROUP = 0x0000_0100; - - // TODO: add when Linux 6.5 is released - // /// `MOVE_MOUNT_BENEATH` - // const MOVE_MOUNT_BENEATH = 0x0000_0200; - - /// `MOVE_MOUNT__MASK` - const MOVE_MOUNT__MASK = 0x0000_0377; - - /// <https://docs.rs/bitflags/*/bitflags/#externally-defined-flags> - const _ = !0; - } -} - -#[cfg(feature = "mount")] -#[cfg(linux_kernel)] -bitflags! { - /// `OPENTREE_*` constants for use with [`open_tree`]. - /// - /// [`open_tree`]: crate::mount::open_tree - #[repr(transparent)] - #[derive(Copy, Clone, Eq, PartialEq, Hash, Debug)] - pub struct OpenTreeFlags: c::c_uint { - /// `OPENTREE_CLONE` - const OPEN_TREE_CLONE = 1; - - /// `OPENTREE_CLOEXEC` - const OPEN_TREE_CLOEXEC = c::O_CLOEXEC as c::c_uint; - - /// `AT_EMPTY_PATH` - const AT_EMPTY_PATH = c::AT_EMPTY_PATH as c::c_uint; - - /// `AT_NO_AUTOMOUNT` - const AT_NO_AUTOMOUNT = c::AT_NO_AUTOMOUNT as c::c_uint; - - /// `AT_RECURSIVE` - const AT_RECURSIVE = c::AT_RECURSIVE as c::c_uint; - - /// `AT_SYMLINK_NOFOLLOW` - const AT_SYMLINK_NOFOLLOW = c::AT_SYMLINK_NOFOLLOW as c::c_uint; - - /// <https://docs.rs/bitflags/*/bitflags/#externally-defined-flags> - const _ = !0; - } -} - -#[cfg(feature = "mount")] -#[cfg(linux_kernel)] -bitflags! { - /// `FSPICK_*` constants for use with [`fspick`]. - /// - /// [`fspick`]: crate::mount::fspick - #[repr(transparent)] - #[derive(Copy, Clone, Eq, PartialEq, Hash, Debug)] - pub struct FsPickFlags: c::c_uint { - /// `FSPICK_CLOEXEC` - const FSPICK_CLOEXEC = 0x0000_0001; - - /// `FSPICK_SYMLINK_NOFOLLOW` - const FSPICK_SYMLINK_NOFOLLOW = 0x0000_0002; - - /// `FSPICK_NO_AUTOMOUNT` - const FSPICK_NO_AUTOMOUNT = 0x0000_0004; - - /// `FSPICK_EMPTY_PATH` - const FSPICK_EMPTY_PATH = 0x0000_0008; - - /// <https://docs.rs/bitflags/*/bitflags/#externally-defined-flags> - const _ = !0; - } -} - -#[cfg(linux_kernel)] -bitflags! { - /// `MS_*` constants for use with [`mount_change`]. - /// - /// [`mount_change`]: crate::mount::mount_change - #[repr(transparent)] - #[derive(Copy, Clone, Eq, PartialEq, Hash, Debug)] - pub struct MountPropagationFlags: c::c_ulong { - /// `MS_SILENT` - const SILENT = c::MS_SILENT; - /// `MS_SHARED` - const SHARED = c::MS_SHARED; - /// `MS_PRIVATE` - const PRIVATE = c::MS_PRIVATE; - /// `MS_SLAVE` - const SLAVE = c::MS_SLAVE; - /// `MS_UNBINDABLE` - const UNBINDABLE = c::MS_UNBINDABLE; - /// `MS_REC` - const REC = c::MS_REC; - - /// <https://docs.rs/bitflags/*/bitflags/#externally-defined-flags> - const _ = !0; - } -} - -#[cfg(linux_kernel)] -bitflags! { - #[repr(transparent)] - #[derive(Copy, Clone, Eq, PartialEq, Hash, Debug)] - pub(crate) struct InternalMountFlags: c::c_ulong { - const REMOUNT = c::MS_REMOUNT; - const MOVE = c::MS_MOVE; - - /// <https://docs.rs/bitflags/*/bitflags/#externally-defined-flags> - const _ = !0; - } -} - -#[cfg(linux_kernel)] -pub(crate) struct MountFlagsArg(pub(crate) c::c_ulong); diff --git a/vendor/rustix/src/backend/libc/net/addr.rs b/vendor/rustix/src/backend/libc/net/addr.rs deleted file mode 100644 index 719a549..0000000 --- a/vendor/rustix/src/backend/libc/net/addr.rs +++ /dev/null @@ -1,245 +0,0 @@ -//! Socket address utilities. - -use crate::backend::c; -#[cfg(unix)] -use { - crate::ffi::CStr, - crate::io, - crate::path, - core::cmp::Ordering, - core::fmt, - core::hash::{Hash, Hasher}, - core::slice, -}; - -/// `struct sockaddr_un` -#[cfg(unix)] -#[derive(Clone)] -#[doc(alias = "sockaddr_un")] -pub struct SocketAddrUnix { - pub(crate) unix: c::sockaddr_un, - #[cfg(not(any(bsd, target_os = "haiku")))] - len: c::socklen_t, -} - -#[cfg(unix)] -impl SocketAddrUnix { - /// Construct a new Unix-domain address from a filesystem path. - #[inline] - pub fn new<P: path::Arg>(path: P) -> io::Result<Self> { - path.into_with_c_str(Self::_new) - } - - #[inline] - fn _new(path: &CStr) -> io::Result<Self> { - let mut unix = Self::init(); - let bytes = path.to_bytes_with_nul(); - if bytes.len() > unix.sun_path.len() { - return Err(io::Errno::NAMETOOLONG); - } - for (i, b) in bytes.iter().enumerate() { - unix.sun_path[i] = *b as c::c_char; - } - - #[cfg(any(bsd, target_os = "haiku"))] - { - unix.sun_len = (offsetof_sun_path() + bytes.len()).try_into().unwrap(); - } - - Ok(Self { - unix, - #[cfg(not(any(bsd, target_os = "haiku")))] - len: (offsetof_sun_path() + bytes.len()).try_into().unwrap(), - }) - } - - /// Construct a new abstract Unix-domain address from a byte slice. - #[cfg(linux_kernel)] - #[inline] - pub fn new_abstract_name(name: &[u8]) -> io::Result<Self> { - let mut unix = Self::init(); - if 1 + name.len() > unix.sun_path.len() { - return Err(io::Errno::NAMETOOLONG); - } - unix.sun_path[0] = 0; - for (i, b) in name.iter().enumerate() { - unix.sun_path[1 + i] = *b as c::c_char; - } - let len = offsetof_sun_path() + 1 + name.len(); - let len = len.try_into().unwrap(); - Ok(Self { - unix, - #[cfg(not(any(bsd, target_os = "haiku")))] - len, - }) - } - - fn init() -> c::sockaddr_un { - c::sockaddr_un { - #[cfg(any(bsd, target_os = "aix", target_os = "haiku", target_os = "nto"))] - sun_len: 0, - #[cfg(target_os = "vita")] - ss_len: 0, - sun_family: c::AF_UNIX as _, - #[cfg(any(bsd, target_os = "nto"))] - sun_path: [0; 104], - #[cfg(not(any(bsd, target_os = "aix", target_os = "haiku", target_os = "nto")))] - sun_path: [0; 108], - #[cfg(target_os = "haiku")] - sun_path: [0; 126], - #[cfg(target_os = "aix")] - sun_path: [0; 1023], - } - } - - /// For a filesystem path address, return the path. - #[inline] - pub fn path(&self) -> Option<&CStr> { - let len = self.len(); - if len != 0 && self.unix.sun_path[0] != 0 { - let end = len as usize - offsetof_sun_path(); - let bytes = &self.unix.sun_path[..end]; - // SAFETY: `from_raw_parts` to convert from `&[c_char]` to `&[u8]`. - // And `from_bytes_with_nul_unchecked` since the string is - // NUL-terminated. - unsafe { - Some(CStr::from_bytes_with_nul_unchecked(slice::from_raw_parts( - bytes.as_ptr().cast(), - bytes.len(), - ))) - } - } else { - None - } - } - - /// For an abstract address, return the identifier. - #[cfg(linux_kernel)] - #[inline] - pub fn abstract_name(&self) -> Option<&[u8]> { - let len = self.len(); - if len != 0 && self.unix.sun_path[0] == 0 { - let end = len as usize - offsetof_sun_path(); - let bytes = &self.unix.sun_path[1..end]; - // SAFETY: `from_raw_parts` to convert from `&[c_char]` to `&[u8]`. - unsafe { Some(slice::from_raw_parts(bytes.as_ptr().cast(), bytes.len())) } - } else { - None - } - } - - #[inline] - pub(crate) fn addr_len(&self) -> c::socklen_t { - #[cfg(not(any(bsd, target_os = "haiku")))] - { - self.len - } - #[cfg(any(bsd, target_os = "haiku"))] - { - c::socklen_t::from(self.unix.sun_len) - } - } - - #[inline] - pub(crate) fn len(&self) -> usize { - self.addr_len() as usize - } -} - -#[cfg(unix)] -impl PartialEq for SocketAddrUnix { - #[inline] - fn eq(&self, other: &Self) -> bool { - let self_len = self.len() - offsetof_sun_path(); - let other_len = other.len() - offsetof_sun_path(); - self.unix.sun_path[..self_len].eq(&other.unix.sun_path[..other_len]) - } -} - -#[cfg(unix)] -impl Eq for SocketAddrUnix {} - -#[cfg(unix)] -impl PartialOrd for SocketAddrUnix { - #[inline] - fn partial_cmp(&self, other: &Self) -> Option<Ordering> { - Some(self.cmp(other)) - } -} - -#[cfg(unix)] -impl Ord for SocketAddrUnix { - #[inline] - fn cmp(&self, other: &Self) -> Ordering { - let self_len = self.len() - offsetof_sun_path(); - let other_len = other.len() - offsetof_sun_path(); - self.unix.sun_path[..self_len].cmp(&other.unix.sun_path[..other_len]) - } -} - -#[cfg(unix)] -impl Hash for SocketAddrUnix { - #[inline] - fn hash<H: Hasher>(&self, state: &mut H) { - let self_len = self.len() - offsetof_sun_path(); - self.unix.sun_path[..self_len].hash(state) - } -} - -#[cfg(unix)] -impl fmt::Debug for SocketAddrUnix { - fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result { - if let Some(path) = self.path() { - path.fmt(fmt) - } else { - #[cfg(linux_kernel)] - if let Some(name) = self.abstract_name() { - return name.fmt(fmt); - } - - "(unnamed)".fmt(fmt) - } - } -} - -/// `struct sockaddr_storage` as a raw struct. -pub type SocketAddrStorage = c::sockaddr_storage; - -/// Return the offset of the `sun_path` field of `sockaddr_un`. -#[cfg(not(windows))] -#[inline] -pub(crate) fn offsetof_sun_path() -> usize { - let z = c::sockaddr_un { - #[cfg(any(bsd, target_os = "aix", target_os = "haiku", target_os = "nto"))] - sun_len: 0_u8, - #[cfg(target_os = "vita")] - ss_len: 0, - #[cfg(any( - bsd, - target_os = "aix", - target_os = "espidf", - target_os = "haiku", - target_os = "nto", - target_os = "vita" - ))] - sun_family: 0_u8, - #[cfg(not(any( - bsd, - target_os = "aix", - target_os = "espidf", - target_os = "haiku", - target_os = "nto", - target_os = "vita" - )))] - sun_family: 0_u16, - #[cfg(any(bsd, target_os = "nto"))] - sun_path: [0; 104], - #[cfg(not(any(bsd, target_os = "aix", target_os = "haiku", target_os = "nto")))] - sun_path: [0; 108], - #[cfg(target_os = "haiku")] - sun_path: [0; 126], - #[cfg(target_os = "aix")] - sun_path: [0; 1023], - }; - (crate::utils::as_ptr(&z.sun_path) as usize) - (crate::utils::as_ptr(&z) as usize) -} diff --git a/vendor/rustix/src/backend/libc/net/ext.rs b/vendor/rustix/src/backend/libc/net/ext.rs deleted file mode 100644 index 2e11c05..0000000 --- a/vendor/rustix/src/backend/libc/net/ext.rs +++ /dev/null @@ -1,135 +0,0 @@ -use crate::backend::c; - -/// The windows `sockaddr_in6` type is a union with accessor functions which -/// are not `const fn`. Define our own layout-compatible version so that we -/// can transmute in and out of it. -#[cfg(windows)] -#[repr(C)] -struct sockaddr_in6 { - sin6_family: u16, - sin6_port: u16, - sin6_flowinfo: u32, - sin6_addr: c::in6_addr, - sin6_scope_id: u32, -} - -#[cfg(not(windows))] -#[inline] -pub(crate) const fn in_addr_s_addr(addr: c::in_addr) -> u32 { - addr.s_addr -} - -#[cfg(windows)] -#[inline] -pub(crate) const fn in_addr_s_addr(addr: c::in_addr) -> u32 { - // This should be `*addr.S_un.S_addr()`, except that isn't a `const fn`. - unsafe { core::mem::transmute(addr) } -} - -#[cfg(not(windows))] -#[inline] -pub(crate) const fn in_addr_new(s_addr: u32) -> c::in_addr { - c::in_addr { s_addr } -} - -#[cfg(windows)] -#[inline] -pub(crate) const fn in_addr_new(s_addr: u32) -> c::in_addr { - unsafe { core::mem::transmute(s_addr) } -} - -#[cfg(not(windows))] -#[inline] -pub(crate) const fn in6_addr_s6_addr(addr: c::in6_addr) -> [u8; 16] { - addr.s6_addr -} - -#[cfg(windows)] -#[inline] -pub(crate) const fn in6_addr_s6_addr(addr: c::in6_addr) -> [u8; 16] { - unsafe { core::mem::transmute(addr) } -} - -#[cfg(not(windows))] -#[inline] -pub(crate) const fn in6_addr_new(s6_addr: [u8; 16]) -> c::in6_addr { - c::in6_addr { s6_addr } -} - -#[cfg(windows)] -#[inline] -pub(crate) const fn in6_addr_new(s6_addr: [u8; 16]) -> c::in6_addr { - unsafe { core::mem::transmute(s6_addr) } -} - -#[cfg(not(windows))] -#[inline] -pub(crate) const fn sockaddr_in6_sin6_scope_id(addr: &c::sockaddr_in6) -> u32 { - addr.sin6_scope_id -} - -#[cfg(windows)] -#[inline] -pub(crate) const fn sockaddr_in6_sin6_scope_id(addr: &c::sockaddr_in6) -> u32 { - let addr: &sockaddr_in6 = unsafe { core::mem::transmute(addr) }; - addr.sin6_scope_id -} - -#[cfg(not(windows))] -#[inline] -pub(crate) const fn sockaddr_in6_new( - #[cfg(any( - bsd, - target_os = "aix", - target_os = "espidf", - target_os = "haiku", - target_os = "nto", - target_os = "vita" - ))] - sin6_len: u8, - sin6_family: c::sa_family_t, - sin6_port: u16, - sin6_flowinfo: u32, - sin6_addr: c::in6_addr, - sin6_scope_id: u32, -) -> c::sockaddr_in6 { - c::sockaddr_in6 { - #[cfg(any( - bsd, - target_os = "aix", - target_os = "espidf", - target_os = "haiku", - target_os = "nto", - target_os = "vita" - ))] - sin6_len, - sin6_family, - sin6_port, - sin6_flowinfo, - sin6_addr, - sin6_scope_id, - #[cfg(solarish)] - __sin6_src_id: 0, - #[cfg(target_os = "vita")] - sin6_vport: 0, - } -} - -#[cfg(windows)] -#[inline] -pub(crate) const fn sockaddr_in6_new( - sin6_family: u16, - sin6_port: u16, - sin6_flowinfo: u32, - sin6_addr: c::in6_addr, - sin6_scope_id: u32, -) -> c::sockaddr_in6 { - let addr = sockaddr_in6 { - sin6_family, - sin6_port, - sin6_flowinfo, - sin6_addr, - sin6_scope_id, - }; - unsafe { core::mem::transmute(addr) } -} diff --git a/vendor/rustix/src/backend/libc/net/mod.rs b/vendor/rustix/src/backend/libc/net/mod.rs deleted file mode 100644 index d7ab68d..0000000 --- a/vendor/rustix/src/backend/libc/net/mod.rs +++ /dev/null @@ -1,16 +0,0 @@ -pub(crate) mod addr; -pub(crate) mod ext; -#[cfg(not(any( - windows, - target_os = "espidf", - target_os = "redox", - target_os = "vita", - target_os = "wasi" -)))] -pub(crate) mod msghdr; -pub(crate) mod read_sockaddr; -pub(crate) mod send_recv; -#[cfg(not(any(target_os = "redox", target_os = "wasi")))] -pub(crate) mod sockopt; -pub(crate) mod syscalls; -pub(crate) mod write_sockaddr; diff --git a/vendor/rustix/src/backend/libc/net/msghdr.rs b/vendor/rustix/src/backend/libc/net/msghdr.rs deleted file mode 100644 index dd9b156..0000000 --- a/vendor/rustix/src/backend/libc/net/msghdr.rs +++ /dev/null @@ -1,134 +0,0 @@ -//! Utilities for dealing with message headers. -//! -//! These take closures rather than returning a `c::msghdr` directly because -//! the message headers may reference stack-local data. - -use crate::backend::c; -use crate::backend::conv::{msg_control_len, msg_iov_len}; -use crate::backend::net::write_sockaddr::{encode_sockaddr_v4, encode_sockaddr_v6}; - -use crate::io::{self, IoSlice, IoSliceMut}; -use crate::net::{RecvAncillaryBuffer, SendAncillaryBuffer, SocketAddrV4, SocketAddrV6}; -use crate::utils::as_ptr; - -use core::mem::{size_of, zeroed, MaybeUninit}; - -/// Create a message header intended to receive a datagram. -pub(crate) fn with_recv_msghdr<R>( - name: &mut MaybeUninit<c::sockaddr_storage>, - iov: &mut [IoSliceMut<'_>], - control: &mut RecvAncillaryBuffer<'_>, - f: impl FnOnce(&mut c::msghdr) -> io::Result<R>, -) -> io::Result<R> { - control.clear(); - - let namelen = size_of::<c::sockaddr_storage>() as c::socklen_t; - let mut msghdr = { - let mut h = zero_msghdr(); - h.msg_name = name.as_mut_ptr().cast(); - h.msg_namelen = namelen; - h.msg_iov = iov.as_mut_ptr().cast(); - h.msg_iovlen = msg_iov_len(iov.len()); - h.msg_control = control.as_control_ptr().cast(); - h.msg_controllen = msg_control_len(control.control_len()); - h - }; - - let res = f(&mut msghdr); - - // Reset the control length. - if res.is_ok() { - unsafe { - control.set_control_len(msghdr.msg_controllen.try_into().unwrap_or(usize::MAX)); - } - } - - res -} - -/// Create a message header intended to send without an address. -pub(crate) fn with_noaddr_msghdr<R>( - iov: &[IoSlice<'_>], - control: &mut SendAncillaryBuffer<'_, '_, '_>, - f: impl FnOnce(c::msghdr) -> R, -) -> R { - f({ - let mut h = zero_msghdr(); - h.msg_iov = iov.as_ptr() as _; - h.msg_iovlen = msg_iov_len(iov.len()); - h.msg_control = control.as_control_ptr().cast(); - h.msg_controllen = msg_control_len(control.control_len()); - h - }) -} - -/// Create a message header intended to send with an IPv4 address. -pub(crate) fn with_v4_msghdr<R>( - addr: &SocketAddrV4, - iov: &[IoSlice<'_>], - control: &mut SendAncillaryBuffer<'_, '_, '_>, - f: impl FnOnce(c::msghdr) -> R, -) -> R { - let encoded = encode_sockaddr_v4(addr); - - f({ - let mut h = zero_msghdr(); - h.msg_name = as_ptr(&encoded) as _; - h.msg_namelen = size_of::<SocketAddrV4>() as _; - h.msg_iov = iov.as_ptr() as _; - h.msg_iovlen = msg_iov_len(iov.len()); - h.msg_control = control.as_control_ptr().cast(); - h.msg_controllen = msg_control_len(control.control_len()); - h - }) -} - -/// Create a message header intended to send with an IPv6 address. -pub(crate) fn with_v6_msghdr<R>( - addr: &SocketAddrV6, - iov: &[IoSlice<'_>], - control: &mut SendAncillaryBuffer<'_, '_, '_>, - f: impl FnOnce(c::msghdr) -> R, -) -> R { - let encoded = encode_sockaddr_v6(addr); - - f({ - let mut h = zero_msghdr(); - h.msg_name = as_ptr(&encoded) as _; - h.msg_namelen = size_of::<SocketAddrV6>() as _; - h.msg_iov = iov.as_ptr() as _; - h.msg_iovlen = msg_iov_len(iov.len()); - h.msg_control = control.as_control_ptr().cast(); - h.msg_controllen = msg_control_len(control.control_len()); - h - }) -} - -/// Create a message header intended to send with a Unix address. -#[cfg(all(unix, not(target_os = "redox")))] -pub(crate) fn with_unix_msghdr<R>( - addr: &crate::net::SocketAddrUnix, - iov: &[IoSlice<'_>], - control: &mut SendAncillaryBuffer<'_, '_, '_>, - f: impl FnOnce(c::msghdr) -> R, -) -> R { - f({ - let mut h = zero_msghdr(); - h.msg_name = as_ptr(&addr.unix) as _; - h.msg_namelen = addr.addr_len(); - h.msg_iov = iov.as_ptr() as _; - h.msg_iovlen = msg_iov_len(iov.len()); - h.msg_control = control.as_control_ptr().cast(); - h.msg_controllen = msg_control_len(control.control_len()); - h - }) -} - -/// Create a zero-initialized message header struct value. -#[cfg(all(unix, not(target_os = "redox")))] -pub(crate) fn zero_msghdr() -> c::msghdr { - // SAFETY: We can't initialize all the fields by value because on some - // platforms the `msghdr` struct in the libc crate contains private padding - // fields. But it is still a C type that's meant to be zero-initializable. - unsafe { zeroed() } -} diff --git a/vendor/rustix/src/backend/libc/net/read_sockaddr.rs b/vendor/rustix/src/backend/libc/net/read_sockaddr.rs deleted file mode 100644 index 6da7a50..0000000 --- a/vendor/rustix/src/backend/libc/net/read_sockaddr.rs +++ /dev/null @@ -1,306 +0,0 @@ -//! The BSD sockets API requires us to read the `ss_family` field before we can -//! interpret the rest of a `sockaddr` produced by the kernel. - -#[cfg(unix)] -use super::addr::SocketAddrUnix; -use super::ext::{in6_addr_s6_addr, in_addr_s_addr, sockaddr_in6_sin6_scope_id}; -use crate::backend::c; -#[cfg(not(windows))] -use crate::ffi::CStr; -use crate::io; -use crate::net::{Ipv4Addr, Ipv6Addr, SocketAddrAny, SocketAddrV4, SocketAddrV6}; -use core::mem::size_of; - -// This must match the header of `sockaddr`. -#[repr(C)] -struct sockaddr_header { - #[cfg(any( - bsd, - target_os = "aix", - target_os = "espidf", - target_os = "haiku", - target_os = "nto", - target_os = "vita" - ))] - sa_len: u8, - #[cfg(any( - bsd, - target_os = "aix", - target_os = "espidf", - target_os = "haiku", - target_os = "nto", - target_os = "vita" - ))] - ss_family: u8, - #[cfg(not(any( - bsd, - target_os = "aix", - target_os = "espidf", - target_os = "haiku", - target_os = "nto", - target_os = "vita" - )))] - ss_family: u16, -} - -/// Read the `ss_family` field from a socket address returned from the OS. -/// -/// # Safety -/// -/// `storage` must point to a valid socket address returned from the OS. -#[inline] -unsafe fn read_ss_family(storage: *const c::sockaddr_storage) -> u16 { - // Assert that we know the layout of `sockaddr`. - let _ = c::sockaddr { - #[cfg(any( - bsd, - target_os = "aix", - target_os = "espidf", - target_os = "haiku", - target_os = "nto", - target_os = "vita" - ))] - sa_len: 0_u8, - #[cfg(any( - bsd, - target_os = "aix", - target_os = "espidf", - target_os = "haiku", - target_os = "nto", - target_os = "vita" - ))] - sa_family: 0_u8, - #[cfg(not(any( - bsd, - target_os = "aix", - target_os = "espidf", - target_os = "haiku", - target_os = "nto", - target_os = "vita" - )))] - sa_family: 0_u16, - #[cfg(not(target_os = "haiku"))] - sa_data: [0; 14], - #[cfg(target_os = "haiku")] - sa_data: [0; 30], - }; - - (*storage.cast::<sockaddr_header>()).ss_family.into() -} - -/// Set the `ss_family` field of a socket address to `AF_UNSPEC`, so that we -/// can test for `AF_UNSPEC` to test whether it was stored to. -pub(crate) unsafe fn initialize_family_to_unspec(storage: *mut c::sockaddr_storage) { - (*storage.cast::<sockaddr_header>()).ss_family = c::AF_UNSPEC as _; -} - -/// Read a socket address encoded in a platform-specific format. -/// -/// # Safety -/// -/// `storage` must point to valid socket address storage. -pub(crate) unsafe fn read_sockaddr( - storage: *const c::sockaddr_storage, - len: usize, -) -> io::Result<SocketAddrAny> { - #[cfg(unix)] - let offsetof_sun_path = super::addr::offsetof_sun_path(); - - if len < size_of::<c::sa_family_t>() { - return Err(io::Errno::INVAL); - } - match read_ss_family(storage).into() { - c::AF_INET => { - if len < size_of::<c::sockaddr_in>() { - return Err(io::Errno::INVAL); - } - let decode = &*storage.cast::<c::sockaddr_in>(); - Ok(SocketAddrAny::V4(SocketAddrV4::new( - Ipv4Addr::from(u32::from_be(in_addr_s_addr(decode.sin_addr))), - u16::from_be(decode.sin_port), - ))) - } - c::AF_INET6 => { - if len < size_of::<c::sockaddr_in6>() { - return Err(io::Errno::INVAL); - } - let decode = &*storage.cast::<c::sockaddr_in6>(); - #[cfg(not(windows))] - let s6_addr = decode.sin6_addr.s6_addr; - #[cfg(windows)] - let s6_addr = decode.sin6_addr.u.Byte; - #[cfg(not(windows))] - let sin6_scope_id = decode.sin6_scope_id; - #[cfg(windows)] - let sin6_scope_id = decode.Anonymous.sin6_scope_id; - Ok(SocketAddrAny::V6(SocketAddrV6::new( - Ipv6Addr::from(s6_addr), - u16::from_be(decode.sin6_port), - u32::from_be(decode.sin6_flowinfo), - sin6_scope_id, - ))) - } - #[cfg(unix)] - c::AF_UNIX => { - if len < offsetof_sun_path { - return Err(io::Errno::INVAL); - } - if len == offsetof_sun_path { - SocketAddrUnix::new(&[][..]).map(SocketAddrAny::Unix) - } else { - let decode = &*storage.cast::<c::sockaddr_un>(); - - // On Linux check for Linux's [abstract namespace]. - // - // [abstract namespace]: https://man7.org/linux/man-pages/man7/unix.7.html - #[cfg(linux_kernel)] - if decode.sun_path[0] == 0 { - return SocketAddrUnix::new_abstract_name(core::mem::transmute::< - &[c::c_char], - &[u8], - >( - &decode.sun_path[1..len - offsetof_sun_path], - )) - .map(SocketAddrAny::Unix); - } - - // Otherwise we expect a NUL-terminated filesystem path. - - // Trim off unused bytes from the end of `path_bytes`. - let path_bytes = if cfg!(any(solarish, target_os = "freebsd")) { - // FreeBSD and illumos sometimes set the length to longer - // than the length of the NUL-terminated string. Find the - // NUL and truncate the string accordingly. - &decode.sun_path[..decode - .sun_path - .iter() - .position(|b| *b == 0) - .ok_or(io::Errno::INVAL)?] - } else { - // Otherwise, use the provided length. - let provided_len = len - 1 - offsetof_sun_path; - if decode.sun_path[provided_len] != 0 { - return Err(io::Errno::INVAL); - } - debug_assert_eq!( - CStr::from_ptr(decode.sun_path.as_ptr()).to_bytes().len(), - provided_len - ); - &decode.sun_path[..provided_len] - }; - - SocketAddrUnix::new(core::mem::transmute::<&[c::c_char], &[u8]>(path_bytes)) - .map(SocketAddrAny::Unix) - } - } - _ => Err(io::Errno::INVAL), - } -} - -/// Read an optional socket address returned from the OS. -/// -/// # Safety -/// -/// `storage` must point to a valid socket address returned from the OS. -pub(crate) unsafe fn maybe_read_sockaddr_os( - storage: *const c::sockaddr_storage, - len: usize, -) -> Option<SocketAddrAny> { - if len == 0 { - return None; - } - - assert!(len >= size_of::<c::sa_family_t>()); - let family = read_ss_family(storage).into(); - if family == c::AF_UNSPEC { - None - } else { - Some(inner_read_sockaddr_os(family, storage, len)) - } -} - -/// Read a socket address returned from the OS. -/// -/// # Safety -/// -/// `storage` must point to a valid socket address returned from the OS. -pub(crate) unsafe fn read_sockaddr_os( - storage: *const c::sockaddr_storage, - len: usize, -) -> SocketAddrAny { - assert!(len >= size_of::<c::sa_family_t>()); - let family = read_ss_family(storage).into(); - inner_read_sockaddr_os(family, storage, len) -} - -unsafe fn inner_read_sockaddr_os( - family: c::c_int, - storage: *const c::sockaddr_storage, - len: usize, -) -> SocketAddrAny { - #[cfg(unix)] - let offsetof_sun_path = super::addr::offsetof_sun_path(); - - assert!(len >= size_of::<c::sa_family_t>()); - match family { - c::AF_INET => { - assert!(len >= size_of::<c::sockaddr_in>()); - let decode = &*storage.cast::<c::sockaddr_in>(); - SocketAddrAny::V4(SocketAddrV4::new( - Ipv4Addr::from(u32::from_be(in_addr_s_addr(decode.sin_addr))), - u16::from_be(decode.sin_port), - )) - } - c::AF_INET6 => { - assert!(len >= size_of::<c::sockaddr_in6>()); - let decode = &*storage.cast::<c::sockaddr_in6>(); - SocketAddrAny::V6(SocketAddrV6::new( - Ipv6Addr::from(in6_addr_s6_addr(decode.sin6_addr)), - u16::from_be(decode.sin6_port), - u32::from_be(decode.sin6_flowinfo), - sockaddr_in6_sin6_scope_id(decode), - )) - } - #[cfg(unix)] - c::AF_UNIX => { - assert!(len >= offsetof_sun_path); - if len == offsetof_sun_path { - SocketAddrAny::Unix(SocketAddrUnix::new(&[][..]).unwrap()) - } else { - let decode = &*storage.cast::<c::sockaddr_un>(); - - // On Linux check for Linux's [abstract namespace]. - // - // [abstract namespace]: https://man7.org/linux/man-pages/man7/unix.7.html - #[cfg(linux_kernel)] - if decode.sun_path[0] == 0 { - return SocketAddrAny::Unix( - SocketAddrUnix::new_abstract_name(core::mem::transmute::< - &[c::c_char], - &[u8], - >( - &decode.sun_path[1..len - offsetof_sun_path], - )) - .unwrap(), - ); - } - - // Otherwise we expect a NUL-terminated filesystem path. - assert_eq!(decode.sun_path[len - 1 - offsetof_sun_path], 0); - let path_bytes = &decode.sun_path[..len - 1 - offsetof_sun_path]; - - // FreeBSD and illumos sometimes set the length to longer than - // the length of the NUL-terminated string. Find the NUL and - // truncate the string accordingly. - #[cfg(any(solarish, target_os = "freebsd"))] - let path_bytes = &path_bytes[..path_bytes.iter().position(|b| *b == 0).unwrap()]; - - SocketAddrAny::Unix( - SocketAddrUnix::new(core::mem::transmute::<&[c::c_char], &[u8]>(path_bytes)) - .unwrap(), - ) - } - } - other => unimplemented!("{:?}", other), - } -} diff --git a/vendor/rustix/src/backend/libc/net/send_recv.rs b/vendor/rustix/src/backend/libc/net/send_recv.rs deleted file mode 100644 index 5dc60dd..0000000 --- a/vendor/rustix/src/backend/libc/net/send_recv.rs +++ /dev/null @@ -1,103 +0,0 @@ -use crate::backend::c; -use bitflags::bitflags; - -bitflags! { - /// `MSG_*` flags for use with [`send`], [`send_to`], and related - /// functions. - /// - /// [`send`]: crate::net::send - /// [`sendto`]: crate::net::sendto - #[repr(transparent)] - #[derive(Copy, Clone, Eq, PartialEq, Hash, Debug)] - pub struct SendFlags: u32 { - /// `MSG_CONFIRM` - #[cfg(not(any( - bsd, - solarish, - windows, - target_os = "aix", - target_os = "espidf", - target_os = "nto", - target_os = "haiku", - target_os = "vita", - )))] - const CONFIRM = bitcast!(c::MSG_CONFIRM); - /// `MSG_DONTROUTE` - const DONTROUTE = bitcast!(c::MSG_DONTROUTE); - /// `MSG_DONTWAIT` - #[cfg(not(windows))] - const DONTWAIT = bitcast!(c::MSG_DONTWAIT); - /// `MSG_EOR` - #[cfg(not(windows))] - const EOT = bitcast!(c::MSG_EOR); - /// `MSG_MORE` - #[cfg(not(any( - bsd, - solarish, - windows, - target_os = "aix", - target_os = "haiku", - target_os = "nto", - target_os = "vita", - )))] - const MORE = bitcast!(c::MSG_MORE); - #[cfg(not(any(apple, windows, target_os = "vita")))] - /// `MSG_NOSIGNAL` - const NOSIGNAL = bitcast!(c::MSG_NOSIGNAL); - /// `MSG_OOB` - const OOB = bitcast!(c::MSG_OOB); - - /// <https://docs.rs/bitflags/*/bitflags/#externally-defined-flags> - const _ = !0; - } -} - -bitflags! { - /// `MSG_*` flags for use with [`recv`], [`recvfrom`], and related - /// functions. - /// - /// [`recv`]: crate::net::recv - /// [`recvfrom`]: crate::net::recvfrom - #[repr(transparent)] - #[derive(Copy, Clone, Eq, PartialEq, Hash, Debug)] - pub struct RecvFlags: u32 { - #[cfg(not(any( - apple, - solarish, - windows, - target_os = "aix", - target_os = "espidf", - target_os = "haiku", - target_os = "nto", - target_os = "vita", - )))] - /// `MSG_CMSG_CLOEXEC` - const CMSG_CLOEXEC = bitcast!(c::MSG_CMSG_CLOEXEC); - /// `MSG_DONTWAIT` - #[cfg(not(windows))] - const DONTWAIT = bitcast!(c::MSG_DONTWAIT); - /// `MSG_ERRQUEUE` - #[cfg(not(any( - bsd, - solarish, - windows, - target_os = "aix", - target_os = "espidf", - target_os = "haiku", - target_os = "nto", - target_os = "vita", - )))] - const ERRQUEUE = bitcast!(c::MSG_ERRQUEUE); - /// `MSG_OOB` - const OOB = bitcast!(c::MSG_OOB); - /// `MSG_PEEK` - const PEEK = bitcast!(c::MSG_PEEK); - /// `MSG_TRUNC` - const TRUNC = bitcast!(c::MSG_TRUNC); - /// `MSG_WAITALL` - const WAITALL = bitcast!(c::MSG_WAITALL); - - /// <https://docs.rs/bitflags/*/bitflags/#externally-defined-flags> - const _ = !0; - } -} diff --git a/vendor/rustix/src/backend/libc/net/sockopt.rs b/vendor/rustix/src/backend/libc/net/sockopt.rs deleted file mode 100644 index cff2ca2..0000000 --- a/vendor/rustix/src/backend/libc/net/sockopt.rs +++ /dev/null @@ -1,1065 +0,0 @@ -//! libc syscalls supporting `rustix::net::sockopt`. - -use super::ext::{in6_addr_new, in_addr_new}; -use crate::backend::c; -use crate::backend::conv::{borrowed_fd, ret}; -use crate::fd::BorrowedFd; -#[cfg(feature = "alloc")] -#[cfg(any( - linux_like, - target_os = "freebsd", - target_os = "fuchsia", - target_os = "illumos" -))] -use crate::ffi::CStr; -use crate::io; -use crate::net::sockopt::Timeout; -#[cfg(not(any( - apple, - windows, - target_os = "aix", - target_os = "dragonfly", - target_os = "emscripten", - target_os = "espidf", - target_os = "haiku", - target_os = "netbsd", - target_os = "nto", - target_os = "vita", -)))] -use crate::net::AddressFamily; -#[cfg(any( - linux_kernel, - target_os = "freebsd", - target_os = "fuchsia", - target_os = "openbsd", - target_os = "redox", - target_env = "newlib" -))] -use crate::net::Protocol; -#[cfg(any( - linux_kernel, - target_os = "freebsd", - target_os = "fuchsia", - target_os = "openbsd", - target_os = "redox", - target_env = "newlib" -))] -use crate::net::RawProtocol; -use crate::net::{Ipv4Addr, Ipv6Addr, SocketType}; -#[cfg(any(linux_kernel, target_os = "fuchsia"))] -use crate::net::{SocketAddrAny, SocketAddrStorage, SocketAddrV4}; -#[cfg(linux_kernel)] -use crate::net::{SocketAddrV6, UCred}; -use crate::utils::as_mut_ptr; -#[cfg(feature = "alloc")] -#[cfg(any( - linux_like, - target_os = "freebsd", - target_os = "fuchsia", - target_os = "illumos" -))] -use alloc::borrow::ToOwned; -#[cfg(feature = "alloc")] -#[cfg(any( - linux_like, - target_os = "freebsd", - target_os = "fuchsia", - target_os = "illumos" -))] -use alloc::string::String; -#[cfg(apple)] -use c::TCP_KEEPALIVE as TCP_KEEPIDLE; -#[cfg(not(any(apple, target_os = "openbsd", target_os = "haiku", target_os = "nto")))] -use c::TCP_KEEPIDLE; -use core::mem::{size_of, MaybeUninit}; -use core::time::Duration; -#[cfg(windows)] -use windows_sys::Win32::Foundation::BOOL; - -#[inline] -fn getsockopt<T: Copy>(fd: BorrowedFd<'_>, level: i32, optname: i32) -> io::Result<T> { - let mut optlen = core::mem::size_of::<T>().try_into().unwrap(); - debug_assert!( - optlen as usize >= core::mem::size_of::<c::c_int>(), - "Socket APIs don't ever use `bool` directly" - ); - - let mut value = MaybeUninit::<T>::zeroed(); - getsockopt_raw(fd, level, optname, &mut value, &mut optlen)?; - - // On Windows at least, `getsockopt` has been observed writing 1 - // byte on at least (`IPPROTO_TCP`, `TCP_NODELAY`), even though - // Windows' documentation says that should write a 4-byte `BOOL`. - // So, we initialize the memory to zeros above, and just assert - // that `getsockopt` doesn't write too many bytes here. - assert!( - optlen as usize <= size_of::<T>(), - "unexpected getsockopt size" - ); - - unsafe { Ok(value.assume_init()) } -} - -#[inline] -fn getsockopt_raw<T>( - fd: BorrowedFd<'_>, - level: i32, - optname: i32, - value: &mut MaybeUninit<T>, - optlen: &mut c::socklen_t, -) -> io::Result<()> { - unsafe { - ret(c::getsockopt( - borrowed_fd(fd), - level, - optname, - as_mut_ptr(value).cast(), - optlen, - )) - } -} - -#[inline] -fn setsockopt<T: Copy>(fd: BorrowedFd<'_>, level: i32, optname: i32, value: T) -> io::Result<()> { - let optlen = core::mem::size_of::<T>().try_into().unwrap(); - debug_assert!( - optlen as usize >= core::mem::size_of::<c::c_int>(), - "Socket APIs don't ever use `bool` directly" - ); - setsockopt_raw(fd, level, optname, &value, optlen) -} - -#[inline] -fn setsockopt_raw<T>( - fd: BorrowedFd<'_>, - level: i32, - optname: i32, - ptr: *const T, - optlen: c::socklen_t, -) -> io::Result<()> { - unsafe { - ret(c::setsockopt( - borrowed_fd(fd), - level, - optname, - ptr.cast(), - optlen, - )) - } -} - -#[inline] -pub(crate) fn get_socket_type(fd: BorrowedFd<'_>) -> io::Result<SocketType> { - getsockopt(fd, c::SOL_SOCKET, c::SO_TYPE) -} - -#[inline] -pub(crate) fn set_socket_reuseaddr(fd: BorrowedFd<'_>, reuseaddr: bool) -> io::Result<()> { - setsockopt(fd, c::SOL_SOCKET, c::SO_REUSEADDR, from_bool(reuseaddr)) -} - -#[inline] -pub(crate) fn get_socket_reuseaddr(fd: BorrowedFd<'_>) -> io::Result<bool> { - getsockopt(fd, c::SOL_SOCKET, c::SO_REUSEADDR).map(to_bool) -} - -#[inline] -pub(crate) fn set_socket_broadcast(fd: BorrowedFd<'_>, broadcast: bool) -> io::Result<()> { - setsockopt(fd, c::SOL_SOCKET, c::SO_BROADCAST, from_bool(broadcast)) -} - -#[inline] -pub(crate) fn get_socket_broadcast(fd: BorrowedFd<'_>) -> io::Result<bool> { - getsockopt(fd, c::SOL_SOCKET, c::SO_BROADCAST).map(to_bool) -} - -#[inline] -pub(crate) fn set_socket_linger(fd: BorrowedFd<'_>, linger: Option<Duration>) -> io::Result<()> { - // Convert `linger` to seconds, rounding up. - let l_linger = if let Some(linger) = linger { - duration_to_secs(linger)? - } else { - 0 - }; - let linger = c::linger { - l_onoff: linger.is_some().into(), - l_linger, - }; - setsockopt(fd, c::SOL_SOCKET, c::SO_LINGER, linger) -} - -#[inline] -pub(crate) fn get_socket_linger(fd: BorrowedFd<'_>) -> io::Result<Option<Duration>> { - let linger: c::linger = getsockopt(fd, c::SOL_SOCKET, c::SO_LINGER)?; - Ok((linger.l_onoff != 0).then(|| Duration::from_secs(linger.l_linger as u64))) -} - -#[cfg(linux_kernel)] -#[inline] -pub(crate) fn set_socket_passcred(fd: BorrowedFd<'_>, passcred: bool) -> io::Result<()> { - setsockopt(fd, c::SOL_SOCKET, c::SO_PASSCRED, from_bool(passcred)) -} - -#[cfg(linux_kernel)] -#[inline] -pub(crate) fn get_socket_passcred(fd: BorrowedFd<'_>) -> io::Result<bool> { - getsockopt(fd, c::SOL_SOCKET, c::SO_PASSCRED).map(to_bool) -} - -#[inline] -pub(crate) fn set_socket_timeout( - fd: BorrowedFd<'_>, - id: Timeout, - timeout: Option<Duration>, -) -> io::Result<()> { - let optname = match id { - Timeout::Recv => c::SO_RCVTIMEO, - Timeout::Send => c::SO_SNDTIMEO, - }; - - #[cfg(not(windows))] - let timeout = match timeout { - Some(timeout) => { - if timeout == Duration::ZERO { - return Err(io::Errno::INVAL); - } - - // Rust's musl libc bindings deprecated `time_t` while they - // transition to 64-bit `time_t`. What we want here is just - // “whatever type `timeval`'s `tv_sec` is”, so we're ok using - // the deprecated type. - #[allow(deprecated)] - let tv_sec = timeout.as_secs().try_into().unwrap_or(c::time_t::MAX); - - // `subsec_micros` rounds down, so we use `subsec_nanos` and - // manually round up. - let mut timeout = c::timeval { - tv_sec, - tv_usec: ((timeout.subsec_nanos() + 999) / 1000) as _, - }; - if timeout.tv_sec == 0 && timeout.tv_usec == 0 { - timeout.tv_usec = 1; - } - timeout - } - None => c::timeval { - tv_sec: 0, - tv_usec: 0, - }, - }; - - #[cfg(windows)] - let timeout: u32 = match timeout { - Some(timeout) => { - if timeout == Duration::ZERO { - return Err(io::Errno::INVAL); - } - - // `as_millis` rounds down, so we use `as_nanos` and - // manually round up. - let mut timeout: u32 = ((timeout.as_nanos() + 999_999) / 1_000_000) - .try_into() - .map_err(|_convert_err| io::Errno::INVAL)?; - if timeout == 0 { - timeout = 1; - } - timeout - } - None => 0, - }; - - setsockopt(fd, c::SOL_SOCKET, optname, timeout) -} - -#[inline] -pub(crate) fn get_socket_timeout(fd: BorrowedFd<'_>, id: Timeout) -> io::Result<Option<Duration>> { - let optname = match id { - Timeout::Recv => c::SO_RCVTIMEO, - Timeout::Send => c::SO_SNDTIMEO, - }; - - #[cfg(not(windows))] - { - let timeout: c::timeval = getsockopt(fd, c::SOL_SOCKET, optname)?; - if timeout.tv_sec == 0 && timeout.tv_usec == 0 { - Ok(None) - } else { - Ok(Some( - Duration::from_secs(timeout.tv_sec as u64) - + Duration::from_micros(timeout.tv_usec as u64), - )) - } - } - - #[cfg(windows)] - { - let timeout: u32 = getsockopt(fd, c::SOL_SOCKET, optname)?; - if timeout == 0 { - Ok(None) - } else { - Ok(Some(Duration::from_millis(timeout as u64))) - } - } -} - -#[cfg(any(apple, freebsdlike, target_os = "netbsd"))] -#[inline] -pub(crate) fn get_socket_nosigpipe(fd: BorrowedFd<'_>) -> io::Result<bool> { - getsockopt(fd, c::SOL_SOCKET, c::SO_NOSIGPIPE).map(to_bool) -} - -#[cfg(any(apple, freebsdlike, target_os = "netbsd"))] -#[inline] -pub(crate) fn set_socket_nosigpipe(fd: BorrowedFd<'_>, val: bool) -> io::Result<()> { - setsockopt(fd, c::SOL_SOCKET, c::SO_NOSIGPIPE, from_bool(val)) -} - -#[inline] -pub(crate) fn get_socket_error(fd: BorrowedFd<'_>) -> io::Result<Result<(), io::Errno>> { - let err: c::c_int = getsockopt(fd, c::SOL_SOCKET, c::SO_ERROR)?; - Ok(if err == 0 { - Ok(()) - } else { - Err(io::Errno::from_raw_os_error(err)) - }) -} - -#[inline] -pub(crate) fn set_socket_keepalive(fd: BorrowedFd<'_>, keepalive: bool) -> io::Result<()> { - setsockopt(fd, c::SOL_SOCKET, c::SO_KEEPALIVE, from_bool(keepalive)) -} - -#[inline] -pub(crate) fn get_socket_keepalive(fd: BorrowedFd<'_>) -> io::Result<bool> { - getsockopt(fd, c::SOL_SOCKET, c::SO_KEEPALIVE).map(to_bool) -} - -#[inline] -pub(crate) fn set_socket_recv_buffer_size(fd: BorrowedFd<'_>, size: usize) -> io::Result<()> { - let size: c::c_int = size.try_into().map_err(|_| io::Errno::INVAL)?; - setsockopt(fd, c::SOL_SOCKET, c::SO_RCVBUF, size) -} - -#[inline] -pub(crate) fn get_socket_recv_buffer_size(fd: BorrowedFd<'_>) -> io::Result<usize> { - getsockopt(fd, c::SOL_SOCKET, c::SO_RCVBUF).map(|size: u32| size as usize) -} - -#[inline] -pub(crate) fn set_socket_send_buffer_size(fd: BorrowedFd<'_>, size: usize) -> io::Result<()> { - let size: c::c_int = size.try_into().map_err(|_| io::Errno::INVAL)?; - setsockopt(fd, c::SOL_SOCKET, c::SO_SNDBUF, size) -} - -#[inline] -pub(crate) fn get_socket_send_buffer_size(fd: BorrowedFd<'_>) -> io::Result<usize> { - getsockopt(fd, c::SOL_SOCKET, c::SO_SNDBUF).map(|size: u32| size as usize) -} - -#[inline] -#[cfg(not(any( - apple, - windows, - target_os = "aix", - target_os = "dragonfly", - target_os = "emscripten", - target_os = "espidf", - target_os = "haiku", - target_os = "netbsd", - target_os = "nto", - target_os = "vita", -)))] -pub(crate) fn get_socket_domain(fd: BorrowedFd<'_>) -> io::Result<AddressFamily> { - let domain: c::c_int = getsockopt(fd, c::SOL_SOCKET, c::SO_DOMAIN)?; - Ok(AddressFamily( - domain.try_into().map_err(|_| io::Errno::OPNOTSUPP)?, - )) -} - -#[inline] -#[cfg(not(apple))] // Apple platforms declare the constant, but do not actually implement it. -pub(crate) fn get_socket_acceptconn(fd: BorrowedFd<'_>) -> io::Result<bool> { - getsockopt(fd, c::SOL_SOCKET, c::SO_ACCEPTCONN).map(to_bool) -} - -#[inline] -pub(crate) fn set_socket_oobinline(fd: BorrowedFd<'_>, value: bool) -> io::Result<()> { - setsockopt(fd, c::SOL_SOCKET, c::SO_OOBINLINE, from_bool(value)) -} - -#[inline] -pub(crate) fn get_socket_oobinline(fd: BorrowedFd<'_>) -> io::Result<bool> { - getsockopt(fd, c::SOL_SOCKET, c::SO_OOBINLINE).map(to_bool) -} - -#[cfg(not(any(solarish, windows)))] -#[inline] -pub(crate) fn set_socket_reuseport(fd: BorrowedFd<'_>, value: bool) -> io::Result<()> { - setsockopt(fd, c::SOL_SOCKET, c::SO_REUSEPORT, from_bool(value)) -} - -#[cfg(not(any(solarish, windows)))] -#[inline] -pub(crate) fn get_socket_reuseport(fd: BorrowedFd<'_>) -> io::Result<bool> { - getsockopt(fd, c::SOL_SOCKET, c::SO_REUSEPORT).map(to_bool) -} - -#[cfg(target_os = "freebsd")] -#[inline] -pub(crate) fn set_socket_reuseport_lb(fd: BorrowedFd<'_>, value: bool) -> io::Result<()> { - setsockopt(fd, c::SOL_SOCKET, c::SO_REUSEPORT_LB, from_bool(value)) -} - -#[cfg(target_os = "freebsd")] -#[inline] -pub(crate) fn get_socket_reuseport_lb(fd: BorrowedFd<'_>) -> io::Result<bool> { - getsockopt(fd, c::SOL_SOCKET, c::SO_REUSEPORT_LB).map(to_bool) -} - -#[cfg(any( - linux_kernel, - target_os = "freebsd", - target_os = "fuchsia", - target_os = "openbsd", - target_os = "redox", - target_env = "newlib" -))] -#[inline] -pub(crate) fn get_socket_protocol(fd: BorrowedFd<'_>) -> io::Result<Option<Protocol>> { - getsockopt(fd, c::SOL_SOCKET, c::SO_PROTOCOL) - .map(|raw| RawProtocol::new(raw).map(Protocol::from_raw)) -} - -#[cfg(target_os = "linux")] -#[inline] -pub(crate) fn get_socket_cookie(fd: BorrowedFd<'_>) -> io::Result<u64> { - getsockopt(fd, c::SOL_SOCKET, c::SO_COOKIE) -} - -#[cfg(target_os = "linux")] -#[inline] -pub(crate) fn get_socket_incoming_cpu(fd: BorrowedFd<'_>) -> io::Result<u32> { - getsockopt(fd, c::SOL_SOCKET, c::SO_INCOMING_CPU) -} - -#[cfg(target_os = "linux")] -#[inline] -pub(crate) fn set_socket_incoming_cpu(fd: BorrowedFd<'_>, value: u32) -> io::Result<()> { - setsockopt(fd, c::SOL_SOCKET, c::SO_INCOMING_CPU, value) -} - -#[inline] -pub(crate) fn set_ip_ttl(fd: BorrowedFd<'_>, ttl: u32) -> io::Result<()> { - setsockopt(fd, c::IPPROTO_IP, c::IP_TTL, ttl) -} - -#[inline] -pub(crate) fn get_ip_ttl(fd: BorrowedFd<'_>) -> io::Result<u32> { - getsockopt(fd, c::IPPROTO_IP, c::IP_TTL) -} - -#[inline] -pub(crate) fn set_ipv6_v6only(fd: BorrowedFd<'_>, only_v6: bool) -> io::Result<()> { - setsockopt(fd, c::IPPROTO_IPV6, c::IPV6_V6ONLY, from_bool(only_v6)) -} - -#[inline] -pub(crate) fn get_ipv6_v6only(fd: BorrowedFd<'_>) -> io::Result<bool> { - getsockopt(fd, c::IPPROTO_IPV6, c::IPV6_V6ONLY).map(to_bool) -} - -#[inline] -pub(crate) fn set_ip_multicast_loop(fd: BorrowedFd<'_>, multicast_loop: bool) -> io::Result<()> { - setsockopt( - fd, - c::IPPROTO_IP, - c::IP_MULTICAST_LOOP, - from_bool(multicast_loop), - ) -} - -#[inline] -pub(crate) fn get_ip_multicast_loop(fd: BorrowedFd<'_>) -> io::Result<bool> { - getsockopt(fd, c::IPPROTO_IP, c::IP_MULTICAST_LOOP).map(to_bool) -} - -#[inline] -pub(crate) fn set_ip_multicast_ttl(fd: BorrowedFd<'_>, multicast_ttl: u32) -> io::Result<()> { - setsockopt(fd, c::IPPROTO_IP, c::IP_MULTICAST_TTL, multicast_ttl) -} - -#[inline] -pub(crate) fn get_ip_multicast_ttl(fd: BorrowedFd<'_>) -> io::Result<u32> { - getsockopt(fd, c::IPPROTO_IP, c::IP_MULTICAST_TTL) -} - -#[inline] -pub(crate) fn set_ipv6_multicast_loop(fd: BorrowedFd<'_>, multicast_loop: bool) -> io::Result<()> { - setsockopt( - fd, - c::IPPROTO_IPV6, - c::IPV6_MULTICAST_LOOP, - from_bool(multicast_loop), - ) -} - -#[inline] -pub(crate) fn get_ipv6_multicast_loop(fd: BorrowedFd<'_>) -> io::Result<bool> { - getsockopt(fd, c::IPPROTO_IPV6, c::IPV6_MULTICAST_LOOP).map(to_bool) -} - -#[inline] -pub(crate) fn set_ipv6_multicast_hops(fd: BorrowedFd<'_>, multicast_hops: u32) -> io::Result<()> { - setsockopt(fd, c::IPPROTO_IP, c::IPV6_MULTICAST_HOPS, multicast_hops) -} - -#[inline] -pub(crate) fn get_ipv6_multicast_hops(fd: BorrowedFd<'_>) -> io::Result<u32> { - getsockopt(fd, c::IPPROTO_IP, c::IPV6_MULTICAST_HOPS) -} - -#[inline] -pub(crate) fn set_ip_add_membership( - fd: BorrowedFd<'_>, - multiaddr: &Ipv4Addr, - interface: &Ipv4Addr, -) -> io::Result<()> { - let mreq = to_ip_mreq(multiaddr, interface); - setsockopt(fd, c::IPPROTO_IP, c::IP_ADD_MEMBERSHIP, mreq) -} - -#[cfg(any( - apple, - freebsdlike, - linux_like, - target_os = "fuchsia", - target_os = "openbsd" -))] -#[inline] -pub(crate) fn set_ip_add_membership_with_ifindex( - fd: BorrowedFd<'_>, - multiaddr: &Ipv4Addr, - address: &Ipv4Addr, - ifindex: i32, -) -> io::Result<()> { - let mreqn = to_ip_mreqn(multiaddr, address, ifindex); - setsockopt(fd, c::IPPROTO_IP, c::IP_ADD_MEMBERSHIP, mreqn) -} - -#[cfg(any(apple, freebsdlike, linux_like, solarish, target_os = "aix"))] -#[inline] -pub(crate) fn set_ip_add_source_membership( - fd: BorrowedFd<'_>, - multiaddr: &Ipv4Addr, - interface: &Ipv4Addr, - sourceaddr: &Ipv4Addr, -) -> io::Result<()> { - let mreq_source = to_imr_source(multiaddr, interface, sourceaddr); - setsockopt(fd, c::IPPROTO_IP, c::IP_ADD_SOURCE_MEMBERSHIP, mreq_source) -} - -#[cfg(any(apple, freebsdlike, linux_like, solarish, target_os = "aix"))] -#[inline] -pub(crate) fn set_ip_drop_source_membership( - fd: BorrowedFd<'_>, - multiaddr: &Ipv4Addr, - interface: &Ipv4Addr, - sourceaddr: &Ipv4Addr, -) -> io::Result<()> { - let mreq_source = to_imr_source(multiaddr, interface, sourceaddr); - setsockopt(fd, c::IPPROTO_IP, c::IP_DROP_SOURCE_MEMBERSHIP, mreq_source) -} - -#[inline] -pub(crate) fn set_ipv6_add_membership( - fd: BorrowedFd<'_>, - multiaddr: &Ipv6Addr, - interface: u32, -) -> io::Result<()> { - #[cfg(not(any( - bsd, - solarish, - target_os = "haiku", - target_os = "l4re", - target_os = "nto" - )))] - use c::IPV6_ADD_MEMBERSHIP; - #[cfg(any( - bsd, - solarish, - target_os = "haiku", - target_os = "l4re", - target_os = "nto" - ))] - use c::IPV6_JOIN_GROUP as IPV6_ADD_MEMBERSHIP; - - let mreq = to_ipv6mr(multiaddr, interface); - setsockopt(fd, c::IPPROTO_IPV6, IPV6_ADD_MEMBERSHIP, mreq) -} - -#[inline] -pub(crate) fn set_ip_drop_membership( - fd: BorrowedFd<'_>, - multiaddr: &Ipv4Addr, - interface: &Ipv4Addr, -) -> io::Result<()> { - let mreq = to_ip_mreq(multiaddr, interface); - setsockopt(fd, c::IPPROTO_IP, c::IP_DROP_MEMBERSHIP, mreq) -} - -#[cfg(any( - apple, - freebsdlike, - linux_like, - target_os = "fuchsia", - target_os = "openbsd" -))] -#[inline] -pub(crate) fn set_ip_drop_membership_with_ifindex( - fd: BorrowedFd<'_>, - multiaddr: &Ipv4Addr, - address: &Ipv4Addr, - ifindex: i32, -) -> io::Result<()> { - let mreqn = to_ip_mreqn(multiaddr, address, ifindex); - setsockopt(fd, c::IPPROTO_IP, c::IP_DROP_MEMBERSHIP, mreqn) -} - -#[inline] -pub(crate) fn set_ipv6_drop_membership( - fd: BorrowedFd<'_>, - multiaddr: &Ipv6Addr, - interface: u32, -) -> io::Result<()> { - #[cfg(not(any( - bsd, - solarish, - target_os = "haiku", - target_os = "l4re", - target_os = "nto" - )))] - use c::IPV6_DROP_MEMBERSHIP; - #[cfg(any( - bsd, - solarish, - target_os = "haiku", - target_os = "l4re", - target_os = "nto" - ))] - use c::IPV6_LEAVE_GROUP as IPV6_DROP_MEMBERSHIP; - - let mreq = to_ipv6mr(multiaddr, interface); - setsockopt(fd, c::IPPROTO_IPV6, IPV6_DROP_MEMBERSHIP, mreq) -} - -#[inline] -pub(crate) fn get_ipv6_unicast_hops(fd: BorrowedFd<'_>) -> io::Result<u8> { - getsockopt(fd, c::IPPROTO_IPV6, c::IPV6_UNICAST_HOPS).map(|hops: c::c_int| hops as u8) -} - -#[inline] -pub(crate) fn set_ipv6_unicast_hops(fd: BorrowedFd<'_>, hops: Option<u8>) -> io::Result<()> { - let hops = match hops { - Some(hops) => hops as c::c_int, - None => -1, - }; - setsockopt(fd, c::IPPROTO_IPV6, c::IPV6_UNICAST_HOPS, hops) -} - -#[cfg(any( - bsd, - linux_like, - target_os = "aix", - target_os = "fuchsia", - target_os = "haiku", - target_os = "nto", - target_env = "newlib" -))] -#[inline] -pub(crate) fn set_ip_tos(fd: BorrowedFd<'_>, value: u8) -> io::Result<()> { - setsockopt(fd, c::IPPROTO_IP, c::IP_TOS, i32::from(value)) -} - -#[cfg(any( - bsd, - linux_like, - target_os = "aix", - target_os = "fuchsia", - target_os = "haiku", - target_os = "nto", - target_env = "newlib" -))] -#[inline] -pub(crate) fn get_ip_tos(fd: BorrowedFd<'_>) -> io::Result<u8> { - let value: i32 = getsockopt(fd, c::IPPROTO_IP, c::IP_TOS)?; - Ok(value as u8) -} - -#[cfg(any(apple, linux_like, target_os = "freebsd", target_os = "fuchsia"))] -#[inline] -pub(crate) fn set_ip_recvtos(fd: BorrowedFd<'_>, value: bool) -> io::Result<()> { - setsockopt(fd, c::IPPROTO_IP, c::IP_RECVTOS, from_bool(value)) -} - -#[cfg(any(apple, linux_like, target_os = "freebsd", target_os = "fuchsia"))] -#[inline] -pub(crate) fn get_ip_recvtos(fd: BorrowedFd<'_>) -> io::Result<bool> { - getsockopt(fd, c::IPPROTO_IP, c::IP_RECVTOS).map(to_bool) -} - -#[cfg(any( - bsd, - linux_like, - target_os = "aix", - target_os = "fuchsia", - target_os = "nto" -))] -#[inline] -pub(crate) fn set_ipv6_recvtclass(fd: BorrowedFd<'_>, value: bool) -> io::Result<()> { - setsockopt(fd, c::IPPROTO_IPV6, c::IPV6_RECVTCLASS, from_bool(value)) -} - -#[cfg(any( - bsd, - linux_like, - target_os = "aix", - target_os = "fuchsia", - target_os = "nto" -))] -#[inline] -pub(crate) fn get_ipv6_recvtclass(fd: BorrowedFd<'_>) -> io::Result<bool> { - getsockopt(fd, c::IPPROTO_IPV6, c::IPV6_RECVTCLASS).map(to_bool) -} - -#[cfg(any(linux_kernel, target_os = "fuchsia"))] -#[inline] -pub(crate) fn set_ip_freebind(fd: BorrowedFd<'_>, value: bool) -> io::Result<()> { - setsockopt(fd, c::IPPROTO_IP, c::IP_FREEBIND, from_bool(value)) -} - -#[cfg(any(linux_kernel, target_os = "fuchsia"))] -#[inline] -pub(crate) fn get_ip_freebind(fd: BorrowedFd<'_>) -> io::Result<bool> { - getsockopt(fd, c::IPPROTO_IP, c::IP_FREEBIND).map(to_bool) -} - -#[cfg(linux_kernel)] -#[inline] -pub(crate) fn set_ipv6_freebind(fd: BorrowedFd<'_>, value: bool) -> io::Result<()> { - setsockopt(fd, c::IPPROTO_IPV6, c::IPV6_FREEBIND, from_bool(value)) -} - -#[cfg(linux_kernel)] -#[inline] -pub(crate) fn get_ipv6_freebind(fd: BorrowedFd<'_>) -> io::Result<bool> { - getsockopt(fd, c::IPPROTO_IPV6, c::IPV6_FREEBIND).map(to_bool) -} - -#[cfg(any(linux_kernel, target_os = "fuchsia"))] -#[inline] -pub(crate) fn get_ip_original_dst(fd: BorrowedFd<'_>) -> io::Result<SocketAddrV4> { - let level = c::IPPROTO_IP; - let optname = c::SO_ORIGINAL_DST; - let mut value = MaybeUninit::<SocketAddrStorage>::uninit(); - let mut optlen = core::mem::size_of_val(&value).try_into().unwrap(); - - getsockopt_raw(fd, level, optname, &mut value, &mut optlen)?; - - let any = unsafe { SocketAddrAny::read(value.as_ptr(), optlen as usize)? }; - match any { - SocketAddrAny::V4(v4) => Ok(v4), - _ => unreachable!(), - } -} - -#[cfg(linux_kernel)] -#[inline] -pub(crate) fn get_ipv6_original_dst(fd: BorrowedFd<'_>) -> io::Result<SocketAddrV6> { - let level = c::IPPROTO_IPV6; - let optname = c::IP6T_SO_ORIGINAL_DST; - let mut value = MaybeUninit::<SocketAddrStorage>::uninit(); - let mut optlen = core::mem::size_of_val(&value).try_into().unwrap(); - - getsockopt_raw(fd, level, optname, &mut value, &mut optlen)?; - - let any = unsafe { SocketAddrAny::read(value.as_ptr(), optlen as usize)? }; - match any { - SocketAddrAny::V6(v6) => Ok(v6), - _ => unreachable!(), - } -} - -#[cfg(not(any( - solarish, - windows, - target_os = "espidf", - target_os = "haiku", - target_os = "vita" -)))] -#[inline] -pub(crate) fn set_ipv6_tclass(fd: BorrowedFd<'_>, value: u32) -> io::Result<()> { - setsockopt(fd, c::IPPROTO_IPV6, c::IPV6_TCLASS, value) -} - -#[cfg(not(any( - solarish, - windows, - target_os = "espidf", - target_os = "haiku", - target_os = "vita" -)))] -#[inline] -pub(crate) fn get_ipv6_tclass(fd: BorrowedFd<'_>) -> io::Result<u32> { - getsockopt(fd, c::IPPROTO_IPV6, c::IPV6_TCLASS) -} - -#[inline] -pub(crate) fn set_tcp_nodelay(fd: BorrowedFd<'_>, nodelay: bool) -> io::Result<()> { - setsockopt(fd, c::IPPROTO_TCP, c::TCP_NODELAY, from_bool(nodelay)) -} - -#[inline] -pub(crate) fn get_tcp_nodelay(fd: BorrowedFd<'_>) -> io::Result<bool> { - getsockopt(fd, c::IPPROTO_TCP, c::TCP_NODELAY).map(to_bool) -} - -#[inline] -#[cfg(not(any(target_os = "openbsd", target_os = "haiku", target_os = "nto")))] -pub(crate) fn set_tcp_keepcnt(fd: BorrowedFd<'_>, count: u32) -> io::Result<()> { - setsockopt(fd, c::IPPROTO_TCP, c::TCP_KEEPCNT, count) -} - -#[inline] -#[cfg(not(any(target_os = "openbsd", target_os = "haiku", target_os = "nto")))] -pub(crate) fn get_tcp_keepcnt(fd: BorrowedFd<'_>) -> io::Result<u32> { - getsockopt(fd, c::IPPROTO_TCP, c::TCP_KEEPCNT) -} - -#[inline] -#[cfg(not(any(target_os = "openbsd", target_os = "haiku", target_os = "nto")))] -pub(crate) fn set_tcp_keepidle(fd: BorrowedFd<'_>, duration: Duration) -> io::Result<()> { - let secs: c::c_uint = duration_to_secs(duration)?; - setsockopt(fd, c::IPPROTO_TCP, TCP_KEEPIDLE, secs) -} - -#[inline] -#[cfg(not(any(target_os = "openbsd", target_os = "haiku", target_os = "nto")))] -pub(crate) fn get_tcp_keepidle(fd: BorrowedFd<'_>) -> io::Result<Duration> { - let secs: c::c_uint = getsockopt(fd, c::IPPROTO_TCP, TCP_KEEPIDLE)?; - Ok(Duration::from_secs(secs as u64)) -} - -#[inline] -#[cfg(not(any(target_os = "openbsd", target_os = "haiku", target_os = "nto")))] -pub(crate) fn set_tcp_keepintvl(fd: BorrowedFd<'_>, duration: Duration) -> io::Result<()> { - let secs: c::c_uint = duration_to_secs(duration)?; - setsockopt(fd, c::IPPROTO_TCP, c::TCP_KEEPINTVL, secs) -} - -#[inline] -#[cfg(not(any(target_os = "openbsd", target_os = "haiku", target_os = "nto")))] -pub(crate) fn get_tcp_keepintvl(fd: BorrowedFd<'_>) -> io::Result<Duration> { - let secs: c::c_uint = getsockopt(fd, c::IPPROTO_TCP, c::TCP_KEEPINTVL)?; - Ok(Duration::from_secs(secs as u64)) -} - -#[inline] -#[cfg(any(linux_like, target_os = "fuchsia"))] -pub(crate) fn set_tcp_user_timeout(fd: BorrowedFd<'_>, value: u32) -> io::Result<()> { - setsockopt(fd, c::IPPROTO_TCP, c::TCP_USER_TIMEOUT, value) -} - -#[inline] -#[cfg(any(linux_like, target_os = "fuchsia"))] -pub(crate) fn get_tcp_user_timeout(fd: BorrowedFd<'_>) -> io::Result<u32> { - getsockopt(fd, c::IPPROTO_TCP, c::TCP_USER_TIMEOUT) -} - -#[cfg(any(linux_like, target_os = "fuchsia"))] -#[inline] -pub(crate) fn set_tcp_quickack(fd: BorrowedFd<'_>, value: bool) -> io::Result<()> { - setsockopt(fd, c::IPPROTO_TCP, c::TCP_QUICKACK, from_bool(value)) -} - -#[cfg(any(linux_like, target_os = "fuchsia"))] -#[inline] -pub(crate) fn get_tcp_quickack(fd: BorrowedFd<'_>) -> io::Result<bool> { - getsockopt(fd, c::IPPROTO_TCP, c::TCP_QUICKACK).map(to_bool) -} - -#[cfg(any( - linux_like, - target_os = "freebsd", - target_os = "fuchsia", - target_os = "illumos" -))] -#[inline] -pub(crate) fn set_tcp_congestion(fd: BorrowedFd<'_>, value: &str) -> io::Result<()> { - let level = c::IPPROTO_TCP; - let optname = c::TCP_CONGESTION; - let optlen = value.len().try_into().unwrap(); - setsockopt_raw(fd, level, optname, value.as_ptr(), optlen) -} - -#[cfg(feature = "alloc")] -#[cfg(any( - linux_like, - target_os = "freebsd", - target_os = "fuchsia", - target_os = "illumos" -))] -#[inline] -pub(crate) fn get_tcp_congestion(fd: BorrowedFd<'_>) -> io::Result<String> { - let level = c::IPPROTO_TCP; - let optname = c::TCP_CONGESTION; - const OPTLEN: c::socklen_t = 16; - let mut value = MaybeUninit::<[MaybeUninit<u8>; OPTLEN as usize]>::uninit(); - let mut optlen = OPTLEN; - getsockopt_raw(fd, level, optname, &mut value, &mut optlen)?; - unsafe { - let value = value.assume_init(); - let slice: &[u8] = core::mem::transmute(&value[..optlen as usize]); - assert!(slice.iter().any(|b| *b == b'\0')); - Ok( - core::str::from_utf8(CStr::from_ptr(slice.as_ptr().cast()).to_bytes()) - .unwrap() - .to_owned(), - ) - } -} - -#[cfg(any(linux_like, target_os = "fuchsia"))] -#[inline] -pub(crate) fn set_tcp_thin_linear_timeouts(fd: BorrowedFd<'_>, value: bool) -> io::Result<()> { - setsockopt( - fd, - c::IPPROTO_TCP, - c::TCP_THIN_LINEAR_TIMEOUTS, - from_bool(value), - ) -} - -#[cfg(any(linux_like, target_os = "fuchsia"))] -#[inline] -pub(crate) fn get_tcp_thin_linear_timeouts(fd: BorrowedFd<'_>) -> io::Result<bool> { - getsockopt(fd, c::IPPROTO_TCP, c::TCP_THIN_LINEAR_TIMEOUTS).map(to_bool) -} - -#[cfg(any(linux_like, solarish, target_os = "fuchsia"))] -#[inline] -pub(crate) fn set_tcp_cork(fd: BorrowedFd<'_>, value: bool) -> io::Result<()> { - setsockopt(fd, c::IPPROTO_TCP, c::TCP_CORK, from_bool(value)) -} - -#[cfg(any(linux_like, solarish, target_os = "fuchsia"))] -#[inline] -pub(crate) fn get_tcp_cork(fd: BorrowedFd<'_>) -> io::Result<bool> { - getsockopt(fd, c::IPPROTO_TCP, c::TCP_CORK).map(to_bool) -} - -#[cfg(linux_kernel)] -#[inline] -pub(crate) fn get_socket_peercred(fd: BorrowedFd<'_>) -> io::Result<UCred> { - getsockopt(fd, c::SOL_SOCKET, c::SO_PEERCRED) -} - -#[inline] -fn to_ip_mreq(multiaddr: &Ipv4Addr, interface: &Ipv4Addr) -> c::ip_mreq { - c::ip_mreq { - imr_multiaddr: to_imr_addr(multiaddr), - imr_interface: to_imr_addr(interface), - } -} - -#[cfg(any( - apple, - freebsdlike, - linux_like, - target_os = "fuchsia", - target_os = "openbsd" -))] -#[inline] -fn to_ip_mreqn(multiaddr: &Ipv4Addr, address: &Ipv4Addr, ifindex: i32) -> c::ip_mreqn { - c::ip_mreqn { - imr_multiaddr: to_imr_addr(multiaddr), - imr_address: to_imr_addr(address), - imr_ifindex: ifindex, - } -} - -#[cfg(any(apple, freebsdlike, linux_like, solarish, target_os = "aix"))] -#[inline] -fn to_imr_source( - multiaddr: &Ipv4Addr, - interface: &Ipv4Addr, - sourceaddr: &Ipv4Addr, -) -> c::ip_mreq_source { - c::ip_mreq_source { - imr_multiaddr: to_imr_addr(multiaddr), - imr_interface: to_imr_addr(interface), - imr_sourceaddr: to_imr_addr(sourceaddr), - } -} - -#[inline] -fn to_imr_addr(addr: &Ipv4Addr) -> c::in_addr { - in_addr_new(u32::from_ne_bytes(addr.octets())) -} - -#[inline] -fn to_ipv6mr(multiaddr: &Ipv6Addr, interface: u32) -> c::ipv6_mreq { - c::ipv6_mreq { - ipv6mr_multiaddr: to_ipv6mr_multiaddr(multiaddr), - ipv6mr_interface: to_ipv6mr_interface(interface), - } -} - -#[inline] -fn to_ipv6mr_multiaddr(multiaddr: &Ipv6Addr) -> c::in6_addr { - in6_addr_new(multiaddr.octets()) -} - -#[cfg(target_os = "android")] -#[inline] -fn to_ipv6mr_interface(interface: u32) -> c::c_int { - interface as c::c_int -} - -#[cfg(not(target_os = "android"))] -#[inline] -fn to_ipv6mr_interface(interface: u32) -> c::c_uint { - interface as c::c_uint -} - -// `getsockopt` and `setsockopt` represent boolean values as integers. -#[cfg(not(windows))] -type RawSocketBool = c::c_int; -#[cfg(windows)] -type RawSocketBool = BOOL; - -// Wrap `RawSocketBool` in a newtype to discourage misuse. -#[repr(transparent)] -#[derive(Copy, Clone)] -struct SocketBool(RawSocketBool); - -// Convert from a `bool` to a `SocketBool`. -#[inline] -fn from_bool(value: bool) -> SocketBool { - SocketBool(value.into()) -} - -// Convert from a `SocketBool` to a `bool`. -#[inline] -fn to_bool(value: SocketBool) -> bool { - value.0 != 0 -} - -/// Convert to seconds, rounding up if necessary. -#[inline] -fn duration_to_secs<T: TryFrom<u64>>(duration: Duration) -> io::Result<T> { - let mut secs = duration.as_secs(); - if duration.subsec_nanos() != 0 { - secs = secs.checked_add(1).ok_or(io::Errno::INVAL)?; - } - T::try_from(secs).map_err(|_e| io::Errno::INVAL) -} diff --git a/vendor/rustix/src/backend/libc/net/syscalls.rs b/vendor/rustix/src/backend/libc/net/syscalls.rs deleted file mode 100644 index 48dbf1f..0000000 --- a/vendor/rustix/src/backend/libc/net/syscalls.rs +++ /dev/null @@ -1,568 +0,0 @@ -//! libc syscalls supporting `rustix::net`. - -#[cfg(unix)] -use super::addr::SocketAddrUnix; -use crate::backend::c; -use crate::backend::conv::{borrowed_fd, ret, ret_owned_fd, ret_send_recv, send_recv_len}; -use crate::fd::{BorrowedFd, OwnedFd}; -use crate::io; -use crate::net::{SocketAddrAny, SocketAddrV4, SocketAddrV6}; -use crate::utils::as_ptr; -use core::mem::{size_of, MaybeUninit}; -#[cfg(not(any( - windows, - target_os = "espidf", - target_os = "redox", - target_os = "vita", - target_os = "wasi" -)))] -use { - super::msghdr::{with_noaddr_msghdr, with_recv_msghdr, with_v4_msghdr, with_v6_msghdr}, - crate::io::{IoSlice, IoSliceMut}, - crate::net::{RecvAncillaryBuffer, RecvMsgReturn, SendAncillaryBuffer}, -}; -#[cfg(not(any(target_os = "redox", target_os = "wasi")))] -use { - super::read_sockaddr::{initialize_family_to_unspec, maybe_read_sockaddr_os, read_sockaddr_os}, - super::send_recv::{RecvFlags, SendFlags}, - super::write_sockaddr::{encode_sockaddr_v4, encode_sockaddr_v6}, - crate::net::{AddressFamily, Protocol, Shutdown, SocketFlags, SocketType}, - core::ptr::null_mut, -}; - -#[cfg(not(any(target_os = "redox", target_os = "wasi")))] -pub(crate) unsafe fn recv( - fd: BorrowedFd<'_>, - buf: *mut u8, - len: usize, - flags: RecvFlags, -) -> io::Result<usize> { - ret_send_recv(c::recv( - borrowed_fd(fd), - buf.cast(), - send_recv_len(len), - bitflags_bits!(flags), - )) -} - -#[cfg(not(any(target_os = "redox", target_os = "wasi")))] -pub(crate) fn send(fd: BorrowedFd<'_>, buf: &[u8], flags: SendFlags) -> io::Result<usize> { - unsafe { - ret_send_recv(c::send( - borrowed_fd(fd), - buf.as_ptr().cast(), - send_recv_len(buf.len()), - bitflags_bits!(flags), - )) - } -} - -#[cfg(not(any(target_os = "redox", target_os = "wasi")))] -pub(crate) unsafe fn recvfrom( - fd: BorrowedFd<'_>, - buf: *mut u8, - buf_len: usize, - flags: RecvFlags, -) -> io::Result<(usize, Option<SocketAddrAny>)> { - let mut storage = MaybeUninit::<c::sockaddr_storage>::uninit(); - let mut len = size_of::<c::sockaddr_storage>() as c::socklen_t; - - // `recvfrom` does not write to the storage if the socket is - // connection-oriented sockets, so we initialize the family field to - // `AF_UNSPEC` so that we can detect this case. - initialize_family_to_unspec(storage.as_mut_ptr()); - - ret_send_recv(c::recvfrom( - borrowed_fd(fd), - buf.cast(), - send_recv_len(buf_len), - bitflags_bits!(flags), - storage.as_mut_ptr().cast(), - &mut len, - )) - .map(|nread| { - ( - nread, - maybe_read_sockaddr_os(storage.as_ptr(), len.try_into().unwrap()), - ) - }) -} - -#[cfg(not(any(target_os = "redox", target_os = "wasi")))] -pub(crate) fn sendto_v4( - fd: BorrowedFd<'_>, - buf: &[u8], - flags: SendFlags, - addr: &SocketAddrV4, -) -> io::Result<usize> { - unsafe { - ret_send_recv(c::sendto( - borrowed_fd(fd), - buf.as_ptr().cast(), - send_recv_len(buf.len()), - bitflags_bits!(flags), - as_ptr(&encode_sockaddr_v4(addr)).cast::<c::sockaddr>(), - size_of::<c::sockaddr_in>() as c::socklen_t, - )) - } -} - -#[cfg(not(any(target_os = "redox", target_os = "wasi")))] -pub(crate) fn sendto_v6( - fd: BorrowedFd<'_>, - buf: &[u8], - flags: SendFlags, - addr: &SocketAddrV6, -) -> io::Result<usize> { - unsafe { - ret_send_recv(c::sendto( - borrowed_fd(fd), - buf.as_ptr().cast(), - send_recv_len(buf.len()), - bitflags_bits!(flags), - as_ptr(&encode_sockaddr_v6(addr)).cast::<c::sockaddr>(), - size_of::<c::sockaddr_in6>() as c::socklen_t, - )) - } -} - -#[cfg(not(any(windows, target_os = "redox", target_os = "wasi")))] -pub(crate) fn sendto_unix( - fd: BorrowedFd<'_>, - buf: &[u8], - flags: SendFlags, - addr: &SocketAddrUnix, -) -> io::Result<usize> { - unsafe { - ret_send_recv(c::sendto( - borrowed_fd(fd), - buf.as_ptr().cast(), - send_recv_len(buf.len()), - bitflags_bits!(flags), - as_ptr(&addr.unix).cast(), - addr.addr_len(), - )) - } -} - -#[cfg(not(any(target_os = "redox", target_os = "wasi")))] -pub(crate) fn socket( - domain: AddressFamily, - type_: SocketType, - protocol: Option<Protocol>, -) -> io::Result<OwnedFd> { - let raw_protocol = match protocol { - Some(p) => p.0.get(), - None => 0, - }; - unsafe { - ret_owned_fd(c::socket( - domain.0 as c::c_int, - type_.0 as c::c_int, - raw_protocol as c::c_int, - )) - } -} - -#[cfg(not(any(target_os = "redox", target_os = "wasi")))] -pub(crate) fn socket_with( - domain: AddressFamily, - type_: SocketType, - flags: SocketFlags, - protocol: Option<Protocol>, -) -> io::Result<OwnedFd> { - let raw_protocol = match protocol { - Some(p) => p.0.get(), - None => 0, - }; - unsafe { - ret_owned_fd(c::socket( - domain.0 as c::c_int, - (type_.0 | flags.bits()) as c::c_int, - raw_protocol as c::c_int, - )) - } -} - -#[cfg(not(any(target_os = "redox", target_os = "wasi")))] -pub(crate) fn bind_v4(sockfd: BorrowedFd<'_>, addr: &SocketAddrV4) -> io::Result<()> { - unsafe { - ret(c::bind( - borrowed_fd(sockfd), - as_ptr(&encode_sockaddr_v4(addr)).cast(), - size_of::<c::sockaddr_in>() as c::socklen_t, - )) - } -} - -#[cfg(not(any(target_os = "redox", target_os = "wasi")))] -pub(crate) fn bind_v6(sockfd: BorrowedFd<'_>, addr: &SocketAddrV6) -> io::Result<()> { - unsafe { - ret(c::bind( - borrowed_fd(sockfd), - as_ptr(&encode_sockaddr_v6(addr)).cast(), - size_of::<c::sockaddr_in6>() as c::socklen_t, - )) - } -} - -#[cfg(not(any(windows, target_os = "redox", target_os = "wasi")))] -pub(crate) fn bind_unix(sockfd: BorrowedFd<'_>, addr: &SocketAddrUnix) -> io::Result<()> { - unsafe { - ret(c::bind( - borrowed_fd(sockfd), - as_ptr(&addr.unix).cast(), - addr.addr_len(), - )) - } -} - -#[cfg(not(any(target_os = "redox", target_os = "wasi")))] -pub(crate) fn connect_v4(sockfd: BorrowedFd<'_>, addr: &SocketAddrV4) -> io::Result<()> { - unsafe { - ret(c::connect( - borrowed_fd(sockfd), - as_ptr(&encode_sockaddr_v4(addr)).cast(), - size_of::<c::sockaddr_in>() as c::socklen_t, - )) - } -} - -#[cfg(not(any(target_os = "redox", target_os = "wasi")))] -pub(crate) fn connect_v6(sockfd: BorrowedFd<'_>, addr: &SocketAddrV6) -> io::Result<()> { - unsafe { - ret(c::connect( - borrowed_fd(sockfd), - as_ptr(&encode_sockaddr_v6(addr)).cast(), - size_of::<c::sockaddr_in6>() as c::socklen_t, - )) - } -} - -#[cfg(not(any(windows, target_os = "redox", target_os = "wasi")))] -pub(crate) fn connect_unix(sockfd: BorrowedFd<'_>, addr: &SocketAddrUnix) -> io::Result<()> { - unsafe { - ret(c::connect( - borrowed_fd(sockfd), - as_ptr(&addr.unix).cast(), - addr.addr_len(), - )) - } -} - -#[cfg(not(any(target_os = "redox", target_os = "wasi")))] -pub(crate) fn connect_unspec(sockfd: BorrowedFd<'_>) -> io::Result<()> { - debug_assert_eq!(c::AF_UNSPEC, 0); - let addr = MaybeUninit::<c::sockaddr_storage>::zeroed(); - unsafe { - ret(c::connect( - borrowed_fd(sockfd), - as_ptr(&addr).cast(), - size_of::<c::sockaddr_storage>() as c::socklen_t, - )) - } -} - -#[cfg(not(any(target_os = "redox", target_os = "wasi")))] -pub(crate) fn listen(sockfd: BorrowedFd<'_>, backlog: c::c_int) -> io::Result<()> { - unsafe { ret(c::listen(borrowed_fd(sockfd), backlog)) } -} - -#[cfg(not(any(target_os = "redox", target_os = "wasi")))] -pub(crate) fn accept(sockfd: BorrowedFd<'_>) -> io::Result<OwnedFd> { - unsafe { - let owned_fd = ret_owned_fd(c::accept(borrowed_fd(sockfd), null_mut(), null_mut()))?; - Ok(owned_fd) - } -} - -#[cfg(not(any( - windows, - target_os = "espidf", - target_os = "redox", - target_os = "vita", - target_os = "wasi" -)))] -pub(crate) fn recvmsg( - sockfd: BorrowedFd<'_>, - iov: &mut [IoSliceMut<'_>], - control: &mut RecvAncillaryBuffer<'_>, - msg_flags: RecvFlags, -) -> io::Result<RecvMsgReturn> { - let mut storage = MaybeUninit::<c::sockaddr_storage>::uninit(); - - with_recv_msghdr(&mut storage, iov, control, |msghdr| { - let result = unsafe { - ret_send_recv(c::recvmsg( - borrowed_fd(sockfd), - msghdr, - bitflags_bits!(msg_flags), - )) - }; - - result.map(|bytes| { - // Get the address of the sender, if any. - let addr = - unsafe { maybe_read_sockaddr_os(msghdr.msg_name as _, msghdr.msg_namelen as _) }; - - RecvMsgReturn { - bytes, - address: addr, - flags: RecvFlags::from_bits_retain(bitcast!(msghdr.msg_flags)), - } - }) - }) -} - -#[cfg(not(any( - windows, - target_os = "espidf", - target_os = "redox", - target_os = "vita", - target_os = "wasi" -)))] -pub(crate) fn sendmsg( - sockfd: BorrowedFd<'_>, - iov: &[IoSlice<'_>], - control: &mut SendAncillaryBuffer<'_, '_, '_>, - msg_flags: SendFlags, -) -> io::Result<usize> { - with_noaddr_msghdr(iov, control, |msghdr| unsafe { - ret_send_recv(c::sendmsg( - borrowed_fd(sockfd), - &msghdr, - bitflags_bits!(msg_flags), - )) - }) -} - -#[cfg(not(any( - windows, - target_os = "espidf", - target_os = "redox", - target_os = "vita", - target_os = "wasi" -)))] -pub(crate) fn sendmsg_v4( - sockfd: BorrowedFd<'_>, - addr: &SocketAddrV4, - iov: &[IoSlice<'_>], - control: &mut SendAncillaryBuffer<'_, '_, '_>, - msg_flags: SendFlags, -) -> io::Result<usize> { - with_v4_msghdr(addr, iov, control, |msghdr| unsafe { - ret_send_recv(c::sendmsg( - borrowed_fd(sockfd), - &msghdr, - bitflags_bits!(msg_flags), - )) - }) -} - -#[cfg(not(any( - windows, - target_os = "espidf", - target_os = "redox", - target_os = "vita", - target_os = "wasi" -)))] -pub(crate) fn sendmsg_v6( - sockfd: BorrowedFd<'_>, - addr: &SocketAddrV6, - iov: &[IoSlice<'_>], - control: &mut SendAncillaryBuffer<'_, '_, '_>, - msg_flags: SendFlags, -) -> io::Result<usize> { - with_v6_msghdr(addr, iov, control, |msghdr| unsafe { - ret_send_recv(c::sendmsg( - borrowed_fd(sockfd), - &msghdr, - bitflags_bits!(msg_flags), - )) - }) -} - -#[cfg(all( - unix, - not(any(target_os = "espidf", target_os = "redox", target_os = "vita")) -))] -pub(crate) fn sendmsg_unix( - sockfd: BorrowedFd<'_>, - addr: &SocketAddrUnix, - iov: &[IoSlice<'_>], - control: &mut SendAncillaryBuffer<'_, '_, '_>, - msg_flags: SendFlags, -) -> io::Result<usize> { - super::msghdr::with_unix_msghdr(addr, iov, control, |msghdr| unsafe { - ret_send_recv(c::sendmsg( - borrowed_fd(sockfd), - &msghdr, - bitflags_bits!(msg_flags), - )) - }) -} - -#[cfg(not(any( - apple, - windows, - target_os = "aix", - target_os = "espidf", - target_os = "haiku", - target_os = "redox", - target_os = "nto", - target_os = "vita", - target_os = "wasi", -)))] -pub(crate) fn accept_with(sockfd: BorrowedFd<'_>, flags: SocketFlags) -> io::Result<OwnedFd> { - unsafe { - let owned_fd = ret_owned_fd(c::accept4( - borrowed_fd(sockfd), - null_mut(), - null_mut(), - flags.bits() as c::c_int, - ))?; - Ok(owned_fd) - } -} - -#[cfg(not(any(target_os = "redox", target_os = "wasi")))] -pub(crate) fn acceptfrom(sockfd: BorrowedFd<'_>) -> io::Result<(OwnedFd, Option<SocketAddrAny>)> { - unsafe { - let mut storage = MaybeUninit::<c::sockaddr_storage>::uninit(); - let mut len = size_of::<c::sockaddr_storage>() as c::socklen_t; - let owned_fd = ret_owned_fd(c::accept( - borrowed_fd(sockfd), - storage.as_mut_ptr().cast(), - &mut len, - ))?; - Ok(( - owned_fd, - maybe_read_sockaddr_os(storage.as_ptr(), len.try_into().unwrap()), - )) - } -} - -#[cfg(not(any( - apple, - windows, - target_os = "aix", - target_os = "espidf", - target_os = "haiku", - target_os = "nto", - target_os = "redox", - target_os = "vita", - target_os = "wasi", -)))] -pub(crate) fn acceptfrom_with( - sockfd: BorrowedFd<'_>, - flags: SocketFlags, -) -> io::Result<(OwnedFd, Option<SocketAddrAny>)> { - unsafe { - let mut storage = MaybeUninit::<c::sockaddr_storage>::uninit(); - let mut len = size_of::<c::sockaddr_storage>() as c::socklen_t; - let owned_fd = ret_owned_fd(c::accept4( - borrowed_fd(sockfd), - storage.as_mut_ptr().cast(), - &mut len, - flags.bits() as c::c_int, - ))?; - Ok(( - owned_fd, - maybe_read_sockaddr_os(storage.as_ptr(), len.try_into().unwrap()), - )) - } -} - -/// Darwin lacks `accept4`, but does have `accept`. We define -/// `SocketFlags` to have no flags, so we can discard it here. -#[cfg(any( - apple, - windows, - target_os = "aix", - target_os = "espidf", - target_os = "haiku", - target_os = "nto", - target_os = "vita", -))] -pub(crate) fn accept_with(sockfd: BorrowedFd<'_>, _flags: SocketFlags) -> io::Result<OwnedFd> { - accept(sockfd) -} - -/// Darwin lacks `accept4`, but does have `accept`. We define -/// `SocketFlags` to have no flags, so we can discard it here. -#[cfg(any( - apple, - windows, - target_os = "aix", - target_os = "espidf", - target_os = "haiku", - target_os = "nto", - target_os = "vita", -))] -pub(crate) fn acceptfrom_with( - sockfd: BorrowedFd<'_>, - _flags: SocketFlags, -) -> io::Result<(OwnedFd, Option<SocketAddrAny>)> { - acceptfrom(sockfd) -} - -#[cfg(not(any(target_os = "redox", target_os = "wasi")))] -pub(crate) fn shutdown(sockfd: BorrowedFd<'_>, how: Shutdown) -> io::Result<()> { - unsafe { ret(c::shutdown(borrowed_fd(sockfd), how as c::c_int)) } -} - -#[cfg(not(any(target_os = "redox", target_os = "wasi")))] -pub(crate) fn getsockname(sockfd: BorrowedFd<'_>) -> io::Result<SocketAddrAny> { - unsafe { - let mut storage = MaybeUninit::<c::sockaddr_storage>::uninit(); - let mut len = size_of::<c::sockaddr_storage>() as c::socklen_t; - ret(c::getsockname( - borrowed_fd(sockfd), - storage.as_mut_ptr().cast(), - &mut len, - ))?; - Ok(read_sockaddr_os(storage.as_ptr(), len.try_into().unwrap())) - } -} - -#[cfg(not(any(target_os = "redox", target_os = "wasi")))] -pub(crate) fn getpeername(sockfd: BorrowedFd<'_>) -> io::Result<Option<SocketAddrAny>> { - unsafe { - let mut storage = MaybeUninit::<c::sockaddr_storage>::uninit(); - let mut len = size_of::<c::sockaddr_storage>() as c::socklen_t; - ret(c::getpeername( - borrowed_fd(sockfd), - storage.as_mut_ptr().cast(), - &mut len, - ))?; - Ok(maybe_read_sockaddr_os( - storage.as_ptr(), - len.try_into().unwrap(), - )) - } -} - -#[cfg(not(any(windows, target_os = "redox", target_os = "wasi")))] -pub(crate) fn socketpair( - domain: AddressFamily, - type_: SocketType, - flags: SocketFlags, - protocol: Option<Protocol>, -) -> io::Result<(OwnedFd, OwnedFd)> { - let raw_protocol = match protocol { - Some(p) => p.0.get(), - None => 0, - }; - unsafe { - let mut fds = MaybeUninit::<[OwnedFd; 2]>::uninit(); - ret(c::socketpair( - c::c_int::from(domain.0), - (type_.0 | flags.bits()) as c::c_int, - raw_protocol as c::c_int, - fds.as_mut_ptr().cast::<c::c_int>(), - ))?; - - let [fd0, fd1] = fds.assume_init(); - Ok((fd0, fd1)) - } -} diff --git a/vendor/rustix/src/backend/libc/net/write_sockaddr.rs b/vendor/rustix/src/backend/libc/net/write_sockaddr.rs deleted file mode 100644 index 2eee98c..0000000 --- a/vendor/rustix/src/backend/libc/net/write_sockaddr.rs +++ /dev/null @@ -1,103 +0,0 @@ -//! The BSD sockets API requires us to read the `ss_family` field before we can -//! interpret the rest of a `sockaddr` produced by the kernel. - -use super::addr::SocketAddrStorage; -#[cfg(unix)] -use super::addr::SocketAddrUnix; -use super::ext::{in6_addr_new, in_addr_new, sockaddr_in6_new}; -use crate::backend::c; -use crate::net::{SocketAddrAny, SocketAddrV4, SocketAddrV6}; -use core::mem::size_of; - -pub(crate) unsafe fn write_sockaddr( - addr: &SocketAddrAny, - storage: *mut SocketAddrStorage, -) -> usize { - match addr { - SocketAddrAny::V4(v4) => write_sockaddr_v4(v4, storage), - SocketAddrAny::V6(v6) => write_sockaddr_v6(v6, storage), - #[cfg(unix)] - SocketAddrAny::Unix(unix) => write_sockaddr_unix(unix, storage), - } -} - -pub(crate) fn encode_sockaddr_v4(v4: &SocketAddrV4) -> c::sockaddr_in { - c::sockaddr_in { - #[cfg(any( - bsd, - target_os = "aix", - target_os = "espidf", - target_os = "haiku", - target_os = "nto", - target_os = "vita", - ))] - sin_len: size_of::<c::sockaddr_in>() as _, - sin_family: c::AF_INET as _, - sin_port: u16::to_be(v4.port()), - sin_addr: in_addr_new(u32::from_ne_bytes(v4.ip().octets())), - #[cfg(not(any(target_os = "haiku", target_os = "vita")))] - sin_zero: [0; 8_usize], - #[cfg(target_os = "haiku")] - sin_zero: [0; 24_usize], - #[cfg(target_os = "vita")] - sin_zero: [0; 6_usize], - #[cfg(target_os = "vita")] - sin_vport: 0, - } -} - -unsafe fn write_sockaddr_v4(v4: &SocketAddrV4, storage: *mut SocketAddrStorage) -> usize { - let encoded = encode_sockaddr_v4(v4); - core::ptr::write(storage.cast(), encoded); - size_of::<c::sockaddr_in>() -} - -pub(crate) fn encode_sockaddr_v6(v6: &SocketAddrV6) -> c::sockaddr_in6 { - #[cfg(any( - bsd, - target_os = "aix", - target_os = "espidf", - target_os = "haiku", - target_os = "nto", - target_os = "vita" - ))] - { - sockaddr_in6_new( - size_of::<c::sockaddr_in6>() as _, - c::AF_INET6 as _, - u16::to_be(v6.port()), - u32::to_be(v6.flowinfo()), - in6_addr_new(v6.ip().octets()), - v6.scope_id(), - ) - } - #[cfg(not(any( - bsd, - target_os = "aix", - target_os = "espidf", - target_os = "haiku", - target_os = "nto", - target_os = "vita" - )))] - { - sockaddr_in6_new( - c::AF_INET6 as _, - u16::to_be(v6.port()), - u32::to_be(v6.flowinfo()), - in6_addr_new(v6.ip().octets()), - v6.scope_id(), - ) - } -} - -unsafe fn write_sockaddr_v6(v6: &SocketAddrV6, storage: *mut SocketAddrStorage) -> usize { - let encoded = encode_sockaddr_v6(v6); - core::ptr::write(storage.cast(), encoded); - size_of::<c::sockaddr_in6>() -} - -#[cfg(unix)] -unsafe fn write_sockaddr_unix(unix: &SocketAddrUnix, storage: *mut SocketAddrStorage) -> usize { - core::ptr::write(storage.cast(), unix.unix); - unix.len() -} diff --git a/vendor/rustix/src/backend/libc/param/auxv.rs b/vendor/rustix/src/backend/libc/param/auxv.rs deleted file mode 100644 index 880a1d4..0000000 --- a/vendor/rustix/src/backend/libc/param/auxv.rs +++ /dev/null @@ -1,54 +0,0 @@ -use crate::backend::c; -#[cfg(any( - all(target_os = "android", target_pointer_width = "64"), - target_os = "linux", -))] -use crate::ffi::CStr; - -// `getauxval` wasn't supported in glibc until 2.16. -#[cfg(any( - all(target_os = "android", target_pointer_width = "64"), - target_os = "linux", -))] -weak!(fn getauxval(c::c_ulong) -> *mut c::c_void); - -#[inline] -pub(crate) fn page_size() -> usize { - unsafe { c::sysconf(c::_SC_PAGESIZE) as usize } -} - -#[cfg(not(any(target_os = "vita", target_os = "wasi")))] -#[inline] -pub(crate) fn clock_ticks_per_second() -> u64 { - unsafe { c::sysconf(c::_SC_CLK_TCK) as u64 } -} - -#[cfg(any( - all(target_os = "android", target_pointer_width = "64"), - target_os = "linux", -))] -#[inline] -pub(crate) fn linux_hwcap() -> (usize, usize) { - if let Some(libc_getauxval) = getauxval.get() { - unsafe { - let hwcap = libc_getauxval(c::AT_HWCAP) as usize; - let hwcap2 = libc_getauxval(c::AT_HWCAP2) as usize; - (hwcap, hwcap2) - } - } else { - (0, 0) - } -} - -#[cfg(any( - all(target_os = "android", target_pointer_width = "64"), - target_os = "linux", -))] -#[inline] -pub(crate) fn linux_execfn() -> &'static CStr { - if let Some(libc_getauxval) = getauxval.get() { - unsafe { CStr::from_ptr(libc_getauxval(c::AT_EXECFN).cast()) } - } else { - cstr!("") - } -} diff --git a/vendor/rustix/src/backend/libc/param/mod.rs b/vendor/rustix/src/backend/libc/param/mod.rs deleted file mode 100644 index 2cb2fe7..0000000 --- a/vendor/rustix/src/backend/libc/param/mod.rs +++ /dev/null @@ -1 +0,0 @@ -pub(crate) mod auxv; diff --git a/vendor/rustix/src/backend/libc/pid/mod.rs b/vendor/rustix/src/backend/libc/pid/mod.rs deleted file mode 100644 index ef944f0..0000000 --- a/vendor/rustix/src/backend/libc/pid/mod.rs +++ /dev/null @@ -1 +0,0 @@ -pub(crate) mod syscalls; diff --git a/vendor/rustix/src/backend/libc/pid/syscalls.rs b/vendor/rustix/src/backend/libc/pid/syscalls.rs deleted file mode 100644 index d0ed4bc..0000000 --- a/vendor/rustix/src/backend/libc/pid/syscalls.rs +++ /dev/null @@ -1,14 +0,0 @@ -//! libc syscalls for PIDs - -use crate::backend::c; -use crate::pid::Pid; - -#[cfg(not(target_os = "wasi"))] -#[inline] -#[must_use] -pub(crate) fn getpid() -> Pid { - unsafe { - let pid = c::getpid(); - Pid::from_raw_unchecked(pid) - } -} diff --git a/vendor/rustix/src/backend/libc/pipe/mod.rs b/vendor/rustix/src/backend/libc/pipe/mod.rs deleted file mode 100644 index 1e0181a..0000000 --- a/vendor/rustix/src/backend/libc/pipe/mod.rs +++ /dev/null @@ -1,2 +0,0 @@ -pub(crate) mod syscalls; -pub(crate) mod types; diff --git a/vendor/rustix/src/backend/libc/pipe/syscalls.rs b/vendor/rustix/src/backend/libc/pipe/syscalls.rs deleted file mode 100644 index cff932d..0000000 --- a/vendor/rustix/src/backend/libc/pipe/syscalls.rs +++ /dev/null @@ -1,125 +0,0 @@ -use crate::backend::c; -use crate::backend::conv::ret; -use crate::fd::OwnedFd; -use crate::io; -#[cfg(not(any( - apple, - target_os = "aix", - target_os = "espidf", - target_os = "haiku", - target_os = "nto", - target_os = "wasi" -)))] -use crate::pipe::PipeFlags; -use core::mem::MaybeUninit; -#[cfg(linux_kernel)] -use { - crate::backend::conv::{borrowed_fd, ret_c_int, ret_usize}, - crate::backend::MAX_IOV, - crate::fd::BorrowedFd, - crate::pipe::{IoSliceRaw, SpliceFlags}, - crate::utils::option_as_mut_ptr, - core::cmp::min, -}; - -#[cfg(not(target_os = "wasi"))] -pub(crate) fn pipe() -> io::Result<(OwnedFd, OwnedFd)> { - unsafe { - let mut result = MaybeUninit::<[OwnedFd; 2]>::uninit(); - ret(c::pipe(result.as_mut_ptr().cast::<i32>()))?; - let [p0, p1] = result.assume_init(); - Ok((p0, p1)) - } -} - -#[cfg(not(any( - apple, - target_os = "aix", - target_os = "espidf", - target_os = "haiku", - target_os = "nto", - target_os = "wasi" -)))] -pub(crate) fn pipe_with(flags: PipeFlags) -> io::Result<(OwnedFd, OwnedFd)> { - unsafe { - let mut result = MaybeUninit::<[OwnedFd; 2]>::uninit(); - ret(c::pipe2( - result.as_mut_ptr().cast::<i32>(), - bitflags_bits!(flags), - ))?; - let [p0, p1] = result.assume_init(); - Ok((p0, p1)) - } -} - -#[cfg(linux_kernel)] -#[inline] -pub fn splice( - fd_in: BorrowedFd<'_>, - off_in: Option<&mut u64>, - fd_out: BorrowedFd<'_>, - off_out: Option<&mut u64>, - len: usize, - flags: SpliceFlags, -) -> io::Result<usize> { - let off_in = option_as_mut_ptr(off_in).cast(); - let off_out = option_as_mut_ptr(off_out).cast(); - - unsafe { - ret_usize(c::splice( - borrowed_fd(fd_in), - off_in, - borrowed_fd(fd_out), - off_out, - len, - flags.bits(), - )) - } -} - -#[cfg(linux_kernel)] -#[inline] -pub unsafe fn vmsplice( - fd: BorrowedFd<'_>, - bufs: &[IoSliceRaw<'_>], - flags: SpliceFlags, -) -> io::Result<usize> { - ret_usize(c::vmsplice( - borrowed_fd(fd), - bufs.as_ptr().cast::<c::iovec>(), - min(bufs.len(), MAX_IOV), - flags.bits(), - )) -} - -#[cfg(linux_kernel)] -#[inline] -pub fn tee( - fd_in: BorrowedFd<'_>, - fd_out: BorrowedFd<'_>, - len: usize, - flags: SpliceFlags, -) -> io::Result<usize> { - unsafe { - ret_usize(c::tee( - borrowed_fd(fd_in), - borrowed_fd(fd_out), - len, - flags.bits(), - )) - } -} - -#[cfg(linux_kernel)] -#[inline] -pub(crate) fn fcntl_getpipe_sz(fd: BorrowedFd<'_>) -> io::Result<usize> { - unsafe { ret_c_int(c::fcntl(borrowed_fd(fd), c::F_GETPIPE_SZ)).map(|size| size as usize) } -} - -#[cfg(linux_kernel)] -#[inline] -pub(crate) fn fcntl_setpipe_sz(fd: BorrowedFd<'_>, size: usize) -> io::Result<()> { - let size: c::c_int = size.try_into().map_err(|_| io::Errno::PERM)?; - - unsafe { ret(c::fcntl(borrowed_fd(fd), c::F_SETPIPE_SZ, size)) } -} diff --git a/vendor/rustix/src/backend/libc/pipe/types.rs b/vendor/rustix/src/backend/libc/pipe/types.rs deleted file mode 100644 index 78fc2fc..0000000 --- a/vendor/rustix/src/backend/libc/pipe/types.rs +++ /dev/null @@ -1,103 +0,0 @@ -#[cfg(linux_kernel)] -use core::marker::PhantomData; -#[cfg(not(any(apple, target_os = "wasi")))] -use {crate::backend::c, bitflags::bitflags}; - -#[cfg(not(any(apple, target_os = "wasi")))] -bitflags! { - /// `O_*` constants for use with [`pipe_with`]. - /// - /// [`pipe_with`]: crate::pipe::pipe_with - #[repr(transparent)] - #[derive(Copy, Clone, Eq, PartialEq, Hash, Debug)] - pub struct PipeFlags: u32 { - /// `O_CLOEXEC` - const CLOEXEC = bitcast!(c::O_CLOEXEC); - /// `O_DIRECT` - #[cfg(not(any( - solarish, - target_os = "espidf", - target_os = "haiku", - target_os = "nto", - target_os = "openbsd", - target_os = "redox", - target_os = "vita", - )))] - const DIRECT = bitcast!(c::O_DIRECT); - /// `O_NONBLOCK` - const NONBLOCK = bitcast!(c::O_NONBLOCK); - - /// <https://docs.rs/bitflags/*/bitflags/#externally-defined-flags> - const _ = !0; - } -} - -#[cfg(linux_kernel)] -bitflags! { - /// `SPLICE_F_*` constants for use with [`splice`], [`vmsplice`], and - /// [`tee`]. - #[repr(transparent)] - #[derive(Copy, Clone, Eq, PartialEq, Hash, Debug)] - pub struct SpliceFlags: c::c_uint { - /// `SPLICE_F_MOVE` - const MOVE = c::SPLICE_F_MOVE; - /// `SPLICE_F_NONBLOCK` - const NONBLOCK = c::SPLICE_F_NONBLOCK; - /// `SPLICE_F_MORE` - const MORE = c::SPLICE_F_MORE; - /// `SPLICE_F_GIFT` - const GIFT = c::SPLICE_F_GIFT; - - /// <https://docs.rs/bitflags/*/bitflags/#externally-defined-flags> - const _ = !0; - } -} - -/// A buffer type for use with [`vmsplice`]. -/// -/// It is guaranteed to be ABI compatible with the iovec type on Unix platforms -/// and `WSABUF` on Windows. Unlike `IoSlice` and `IoSliceMut` it is -/// semantically like a raw pointer, and therefore can be shared or mutated as -/// needed. -/// -/// [`vmsplice`]: crate::pipe::vmsplice -#[cfg(linux_kernel)] -#[repr(transparent)] -pub struct IoSliceRaw<'a> { - _buf: c::iovec, - _lifetime: PhantomData<&'a ()>, -} - -#[cfg(linux_kernel)] -impl<'a> IoSliceRaw<'a> { - /// Creates a new `IoSlice` wrapping a byte slice. - pub fn from_slice(buf: &'a [u8]) -> Self { - IoSliceRaw { - _buf: c::iovec { - iov_base: buf.as_ptr() as *mut u8 as *mut c::c_void, - iov_len: buf.len() as _, - }, - _lifetime: PhantomData, - } - } - - /// Creates a new `IoSlice` wrapping a mutable byte slice. - pub fn from_slice_mut(buf: &'a mut [u8]) -> Self { - IoSliceRaw { - _buf: c::iovec { - iov_base: buf.as_mut_ptr() as *mut c::c_void, - iov_len: buf.len() as _, - }, - _lifetime: PhantomData, - } - } -} - -#[cfg(not(any(apple, target_os = "wasi")))] -#[test] -fn test_types() { - assert_eq_size!(PipeFlags, c::c_int); - - #[cfg(linux_kernel)] - assert_eq_size!(SpliceFlags, c::c_int); -} diff --git a/vendor/rustix/src/backend/libc/prctl/mod.rs b/vendor/rustix/src/backend/libc/prctl/mod.rs deleted file mode 100644 index ef944f0..0000000 --- a/vendor/rustix/src/backend/libc/prctl/mod.rs +++ /dev/null @@ -1 +0,0 @@ -pub(crate) mod syscalls; diff --git a/vendor/rustix/src/backend/libc/prctl/syscalls.rs b/vendor/rustix/src/backend/libc/prctl/syscalls.rs deleted file mode 100644 index 451cecc..0000000 --- a/vendor/rustix/src/backend/libc/prctl/syscalls.rs +++ /dev/null @@ -1,14 +0,0 @@ -use crate::backend::c; -use crate::backend::conv::ret_c_int; -use crate::io; - -#[inline] -pub(crate) unsafe fn prctl( - option: c::c_int, - arg2: *mut c::c_void, - arg3: *mut c::c_void, - arg4: *mut c::c_void, - arg5: *mut c::c_void, -) -> io::Result<c::c_int> { - ret_c_int(c::prctl(option, arg2, arg3, arg4, arg5)) -} diff --git a/vendor/rustix/src/backend/libc/process/cpu_set.rs b/vendor/rustix/src/backend/libc/process/cpu_set.rs deleted file mode 100644 index 4cf06b9..0000000 --- a/vendor/rustix/src/backend/libc/process/cpu_set.rs +++ /dev/null @@ -1,50 +0,0 @@ -//! Rust implementation of the `CPU_*` macro API. - -#![allow(non_snake_case)] - -use super::types::{RawCpuSet, CPU_SETSIZE}; -use crate::backend::c; - -#[inline] -pub(crate) fn CPU_SET(cpu: usize, cpuset: &mut RawCpuSet) { - assert!( - cpu < CPU_SETSIZE, - "cpu out of bounds: the cpu max is {} but the cpu is {}", - CPU_SETSIZE, - cpu - ); - unsafe { c::CPU_SET(cpu, cpuset) } -} - -#[inline] -pub(crate) fn CPU_ZERO(cpuset: &mut RawCpuSet) { - unsafe { c::CPU_ZERO(cpuset) } -} - -#[inline] -pub(crate) fn CPU_CLR(cpu: usize, cpuset: &mut RawCpuSet) { - assert!( - cpu < CPU_SETSIZE, - "cpu out of bounds: the cpu max is {} but the cpu is {}", - CPU_SETSIZE, - cpu - ); - unsafe { c::CPU_CLR(cpu, cpuset) } -} - -#[inline] -pub(crate) fn CPU_ISSET(cpu: usize, cpuset: &RawCpuSet) -> bool { - assert!( - cpu < CPU_SETSIZE, - "cpu out of bounds: the cpu max is {} but the cpu is {}", - CPU_SETSIZE, - cpu - ); - unsafe { c::CPU_ISSET(cpu, cpuset) } -} - -#[cfg(linux_kernel)] -#[inline] -pub(crate) fn CPU_COUNT(cpuset: &RawCpuSet) -> u32 { - unsafe { c::CPU_COUNT(cpuset).try_into().unwrap() } -} diff --git a/vendor/rustix/src/backend/libc/process/mod.rs b/vendor/rustix/src/backend/libc/process/mod.rs deleted file mode 100644 index 39803b5..0000000 --- a/vendor/rustix/src/backend/libc/process/mod.rs +++ /dev/null @@ -1,7 +0,0 @@ -#[cfg(any(freebsdlike, linux_kernel, target_os = "fuchsia"))] -pub(crate) mod cpu_set; -#[cfg(not(windows))] -pub(crate) mod syscalls; -pub(crate) mod types; -#[cfg(not(any(target_os = "espidf", target_os = "vita", target_os = "wasi")))] -pub(crate) mod wait; diff --git a/vendor/rustix/src/backend/libc/process/syscalls.rs b/vendor/rustix/src/backend/libc/process/syscalls.rs deleted file mode 100644 index 46fd182..0000000 --- a/vendor/rustix/src/backend/libc/process/syscalls.rs +++ /dev/null @@ -1,713 +0,0 @@ -//! libc syscalls supporting `rustix::process`. - -#[cfg(any(freebsdlike, linux_kernel, target_os = "fuchsia"))] -use super::types::RawCpuSet; -use crate::backend::c; -#[cfg(not(any(target_os = "wasi", target_os = "fuchsia")))] -use crate::backend::conv::borrowed_fd; -#[cfg(feature = "fs")] -use crate::backend::conv::c_str; -#[cfg(all(feature = "alloc", feature = "fs", not(target_os = "wasi")))] -use crate::backend::conv::ret_discarded_char_ptr; -#[cfg(not(any( - target_os = "espidf", - target_os = "fuchsia", - target_os = "redox", - target_os = "vita", - target_os = "wasi" -)))] -use crate::backend::conv::ret_infallible; -#[cfg(not(target_os = "wasi"))] -use crate::backend::conv::ret_pid_t; -#[cfg(linux_kernel)] -use crate::backend::conv::ret_u32; -#[cfg(all(feature = "alloc", not(target_os = "wasi")))] -use crate::backend::conv::ret_usize; -use crate::backend::conv::{ret, ret_c_int}; -#[cfg(not(any(target_os = "wasi", target_os = "fuchsia")))] -use crate::fd::BorrowedFd; -#[cfg(target_os = "linux")] -use crate::fd::{AsRawFd, OwnedFd, RawFd}; -#[cfg(feature = "fs")] -use crate::ffi::CStr; -#[cfg(feature = "fs")] -use crate::fs::Mode; -use crate::io; -#[cfg(all(feature = "alloc", not(target_os = "wasi")))] -use crate::process::Gid; -#[cfg(not(target_os = "wasi"))] -use crate::process::Pid; -#[cfg(not(any(target_os = "espidf", target_os = "wasi")))] -use crate::process::Signal; -#[cfg(not(any( - target_os = "espidf", - target_os = "fuchsia", - target_os = "vita", - target_os = "wasi" -)))] -use crate::process::Uid; -#[cfg(linux_kernel)] -use crate::process::{Cpuid, MembarrierCommand, MembarrierQuery}; -#[cfg(not(any(target_os = "espidf", target_os = "vita", target_os = "wasi")))] -use crate::process::{RawPid, WaitOptions, WaitStatus}; -#[cfg(not(any( - target_os = "espidf", - target_os = "fuchsia", - target_os = "redox", - target_os = "vita", - target_os = "wasi" -)))] -use crate::process::{Resource, Rlimit}; -#[cfg(not(any( - target_os = "espidf", - target_os = "redox", - target_os = "openbsd", - target_os = "vita", - target_os = "wasi" -)))] -use crate::process::{WaitId, WaitidOptions, WaitidStatus}; -use core::mem::MaybeUninit; -#[cfg(target_os = "linux")] -use { - super::super::conv::ret_owned_fd, crate::process::PidfdFlags, crate::process::PidfdGetfdFlags, -}; - -#[cfg(any(linux_kernel, target_os = "dragonfly"))] -#[inline] -pub(crate) fn sched_getcpu() -> usize { - let r = unsafe { libc::sched_getcpu() }; - debug_assert!(r >= 0); - r as usize -} - -#[cfg(feature = "fs")] -#[cfg(not(target_os = "wasi"))] -pub(crate) fn chdir(path: &CStr) -> io::Result<()> { - unsafe { ret(c::chdir(c_str(path))) } -} - -#[cfg(not(any(target_os = "fuchsia", target_os = "wasi")))] -pub(crate) fn fchdir(dirfd: BorrowedFd<'_>) -> io::Result<()> { - unsafe { ret(c::fchdir(borrowed_fd(dirfd))) } -} - -#[cfg(feature = "fs")] -#[cfg(not(any(target_os = "fuchsia", target_os = "wasi")))] -pub(crate) fn chroot(path: &CStr) -> io::Result<()> { - unsafe { ret(c::chroot(c_str(path))) } -} - -#[cfg(all(feature = "alloc", feature = "fs"))] -#[cfg(not(target_os = "wasi"))] -pub(crate) fn getcwd(buf: &mut [MaybeUninit<u8>]) -> io::Result<()> { - unsafe { ret_discarded_char_ptr(c::getcwd(buf.as_mut_ptr().cast(), buf.len())) } -} - -// The `membarrier` syscall has a third argument, but it's only used when -// the `flags` argument is `MEMBARRIER_CMD_FLAG_CPU`. -#[cfg(linux_kernel)] -syscall! { - fn membarrier_all( - cmd: c::c_int, - flags: c::c_uint - ) via SYS_membarrier -> c::c_int -} - -#[cfg(linux_kernel)] -pub(crate) fn membarrier_query() -> MembarrierQuery { - // glibc does not have a wrapper for `membarrier`; [the documentation] - // says to use `syscall`. - // - // [the documentation]: https://man7.org/linux/man-pages/man2/membarrier.2.html#NOTES - const MEMBARRIER_CMD_QUERY: u32 = 0; - unsafe { - match ret_u32(membarrier_all(MEMBARRIER_CMD_QUERY as i32, 0)) { - Ok(query) => MembarrierQuery::from_bits_retain(query), - Err(_) => MembarrierQuery::empty(), - } - } -} - -#[cfg(linux_kernel)] -pub(crate) fn membarrier(cmd: MembarrierCommand) -> io::Result<()> { - unsafe { ret(membarrier_all(cmd as i32, 0)) } -} - -#[cfg(linux_kernel)] -pub(crate) fn membarrier_cpu(cmd: MembarrierCommand, cpu: Cpuid) -> io::Result<()> { - const MEMBARRIER_CMD_FLAG_CPU: u32 = 1; - - syscall! { - fn membarrier_cpu( - cmd: c::c_int, - flags: c::c_uint, - cpu_id: c::c_int - ) via SYS_membarrier -> c::c_int - } - - unsafe { - ret(membarrier_cpu( - cmd as i32, - MEMBARRIER_CMD_FLAG_CPU, - bitcast!(cpu.as_raw()), - )) - } -} - -#[cfg(not(target_os = "wasi"))] -#[inline] -#[must_use] -pub(crate) fn getppid() -> Option<Pid> { - unsafe { - let pid: i32 = c::getppid(); - Pid::from_raw(pid) - } -} - -#[cfg(not(target_os = "wasi"))] -#[inline] -pub(crate) fn getpgid(pid: Option<Pid>) -> io::Result<Pid> { - unsafe { - let pgid = ret_pid_t(c::getpgid(Pid::as_raw(pid) as _))?; - Ok(Pid::from_raw_unchecked(pgid)) - } -} - -#[cfg(not(target_os = "wasi"))] -#[inline] -pub(crate) fn setpgid(pid: Option<Pid>, pgid: Option<Pid>) -> io::Result<()> { - unsafe { ret(c::setpgid(Pid::as_raw(pid) as _, Pid::as_raw(pgid) as _)) } -} - -#[cfg(not(target_os = "wasi"))] -#[inline] -#[must_use] -pub(crate) fn getpgrp() -> Pid { - unsafe { - let pgid = c::getpgrp(); - Pid::from_raw_unchecked(pgid) - } -} - -#[cfg(any(freebsdlike, linux_kernel, target_os = "fuchsia"))] -#[inline] -pub(crate) fn sched_getaffinity(pid: Option<Pid>, cpuset: &mut RawCpuSet) -> io::Result<()> { - unsafe { - ret(c::sched_getaffinity( - Pid::as_raw(pid) as _, - core::mem::size_of::<RawCpuSet>(), - cpuset, - )) - } -} - -#[cfg(any(freebsdlike, linux_kernel, target_os = "fuchsia"))] -#[inline] -pub(crate) fn sched_setaffinity(pid: Option<Pid>, cpuset: &RawCpuSet) -> io::Result<()> { - unsafe { - ret(c::sched_setaffinity( - Pid::as_raw(pid) as _, - core::mem::size_of::<RawCpuSet>(), - cpuset, - )) - } -} - -#[inline] -pub(crate) fn sched_yield() { - unsafe { - let _ = c::sched_yield(); - } -} - -#[cfg(not(target_os = "wasi"))] -#[cfg(feature = "fs")] -#[inline] -pub(crate) fn umask(mask: Mode) -> Mode { - unsafe { Mode::from_bits_retain(c::umask(mask.bits() as c::mode_t).into()) } -} - -#[cfg(not(any(target_os = "fuchsia", target_os = "vita", target_os = "wasi")))] -#[inline] -pub(crate) fn nice(inc: i32) -> io::Result<i32> { - libc_errno::set_errno(libc_errno::Errno(0)); - let r = unsafe { c::nice(inc) }; - if libc_errno::errno().0 != 0 { - ret_c_int(r) - } else { - Ok(r) - } -} - -#[cfg(not(any( - target_os = "espidf", - target_os = "fuchsia", - target_os = "vita", - target_os = "wasi" -)))] -#[inline] -pub(crate) fn getpriority_user(uid: Uid) -> io::Result<i32> { - libc_errno::set_errno(libc_errno::Errno(0)); - let r = unsafe { c::getpriority(c::PRIO_USER, uid.as_raw() as _) }; - if libc_errno::errno().0 != 0 { - ret_c_int(r) - } else { - Ok(r) - } -} - -#[cfg(not(any( - target_os = "espidf", - target_os = "fuchsia", - target_os = "vita", - target_os = "wasi" -)))] -#[inline] -pub(crate) fn getpriority_pgrp(pgid: Option<Pid>) -> io::Result<i32> { - libc_errno::set_errno(libc_errno::Errno(0)); - let r = unsafe { c::getpriority(c::PRIO_PGRP, Pid::as_raw(pgid) as _) }; - if libc_errno::errno().0 != 0 { - ret_c_int(r) - } else { - Ok(r) - } -} - -#[cfg(not(any( - target_os = "espidf", - target_os = "fuchsia", - target_os = "vita", - target_os = "wasi" -)))] -#[inline] -pub(crate) fn getpriority_process(pid: Option<Pid>) -> io::Result<i32> { - libc_errno::set_errno(libc_errno::Errno(0)); - let r = unsafe { c::getpriority(c::PRIO_PROCESS, Pid::as_raw(pid) as _) }; - if libc_errno::errno().0 != 0 { - ret_c_int(r) - } else { - Ok(r) - } -} - -#[cfg(not(any( - target_os = "espidf", - target_os = "fuchsia", - target_os = "vita", - target_os = "wasi" -)))] -#[inline] -pub(crate) fn setpriority_user(uid: Uid, priority: i32) -> io::Result<()> { - unsafe { ret(c::setpriority(c::PRIO_USER, uid.as_raw() as _, priority)) } -} - -#[cfg(not(any( - target_os = "espidf", - target_os = "fuchsia", - target_os = "vita", - target_os = "wasi" -)))] -#[inline] -pub(crate) fn setpriority_pgrp(pgid: Option<Pid>, priority: i32) -> io::Result<()> { - unsafe { - ret(c::setpriority( - c::PRIO_PGRP, - Pid::as_raw(pgid) as _, - priority, - )) - } -} - -#[cfg(not(any( - target_os = "espidf", - target_os = "fuchsia", - target_os = "vita", - target_os = "wasi" -)))] -#[inline] -pub(crate) fn setpriority_process(pid: Option<Pid>, priority: i32) -> io::Result<()> { - unsafe { - ret(c::setpriority( - c::PRIO_PROCESS, - Pid::as_raw(pid) as _, - priority, - )) - } -} - -#[cfg(not(any( - target_os = "espidf", - target_os = "fuchsia", - target_os = "redox", - target_os = "vita", - target_os = "wasi" -)))] -#[inline] -pub(crate) fn getrlimit(limit: Resource) -> Rlimit { - let mut result = MaybeUninit::<c::rlimit>::uninit(); - unsafe { - ret_infallible(c::getrlimit(limit as _, result.as_mut_ptr())); - rlimit_from_libc(result.assume_init()) - } -} - -#[cfg(not(any( - target_os = "espidf", - target_os = "fuchsia", - target_os = "redox", - target_os = "vita", - target_os = "wasi" -)))] -#[inline] -pub(crate) fn setrlimit(limit: Resource, new: Rlimit) -> io::Result<()> { - let lim = rlimit_to_libc(new)?; - unsafe { ret(c::setrlimit(limit as _, &lim)) } -} - -#[cfg(linux_kernel)] -#[inline] -pub(crate) fn prlimit(pid: Option<Pid>, limit: Resource, new: Rlimit) -> io::Result<Rlimit> { - let lim = rlimit_to_libc(new)?; - let mut result = MaybeUninit::<c::rlimit>::uninit(); - unsafe { - ret(c::prlimit( - Pid::as_raw(pid), - limit as _, - &lim, - result.as_mut_ptr(), - ))?; - Ok(rlimit_from_libc(result.assume_init())) - } -} - -/// Convert a Rust [`Rlimit`] to a C `c::rlimit`. -#[cfg(not(any( - target_os = "espidf", - target_os = "fuchsia", - target_os = "redox", - target_os = "vita", - target_os = "wasi" -)))] -fn rlimit_from_libc(lim: c::rlimit) -> Rlimit { - let current = if lim.rlim_cur == c::RLIM_INFINITY { - None - } else { - Some(lim.rlim_cur.try_into().unwrap()) - }; - let maximum = if lim.rlim_max == c::RLIM_INFINITY { - None - } else { - Some(lim.rlim_max.try_into().unwrap()) - }; - Rlimit { current, maximum } -} - -/// Convert a C `c::rlimit` to a Rust `Rlimit`. -#[cfg(not(any( - target_os = "espidf", - target_os = "fuchsia", - target_os = "redox", - target_os = "vita", - target_os = "wasi" -)))] -fn rlimit_to_libc(lim: Rlimit) -> io::Result<c::rlimit> { - let Rlimit { current, maximum } = lim; - let rlim_cur = match current { - Some(r) => r.try_into().map_err(|_e| io::Errno::INVAL)?, - None => c::RLIM_INFINITY as _, - }; - let rlim_max = match maximum { - Some(r) => r.try_into().map_err(|_e| io::Errno::INVAL)?, - None => c::RLIM_INFINITY as _, - }; - Ok(c::rlimit { rlim_cur, rlim_max }) -} - -#[cfg(not(any(target_os = "espidf", target_os = "vita", target_os = "wasi")))] -#[inline] -pub(crate) fn wait(waitopts: WaitOptions) -> io::Result<Option<(Pid, WaitStatus)>> { - _waitpid(!0, waitopts) -} - -#[cfg(not(any(target_os = "espidf", target_os = "vita", target_os = "wasi")))] -#[inline] -pub(crate) fn waitpid( - pid: Option<Pid>, - waitopts: WaitOptions, -) -> io::Result<Option<(Pid, WaitStatus)>> { - _waitpid(Pid::as_raw(pid), waitopts) -} - -#[cfg(not(any(target_os = "espidf", target_os = "vita", target_os = "wasi")))] -#[inline] -pub(crate) fn waitpgid(pgid: Pid, waitopts: WaitOptions) -> io::Result<Option<(Pid, WaitStatus)>> { - _waitpid(-pgid.as_raw_nonzero().get(), waitopts) -} - -#[cfg(not(any(target_os = "espidf", target_os = "vita", target_os = "wasi")))] -#[inline] -pub(crate) fn _waitpid( - pid: RawPid, - waitopts: WaitOptions, -) -> io::Result<Option<(Pid, WaitStatus)>> { - unsafe { - let mut status: c::c_int = 0; - let pid = ret_c_int(c::waitpid(pid as _, &mut status, waitopts.bits() as _))?; - Ok(Pid::from_raw(pid).map(|pid| (pid, WaitStatus::new(status as _)))) - } -} - -#[cfg(not(any( - target_os = "espidf", - target_os = "redox", - target_os = "openbsd", - target_os = "vita", - target_os = "wasi" -)))] -#[inline] -pub(crate) fn waitid(id: WaitId<'_>, options: WaitidOptions) -> io::Result<Option<WaitidStatus>> { - // Get the id to wait on. - match id { - WaitId::All => _waitid_all(options), - WaitId::Pid(pid) => _waitid_pid(pid, options), - WaitId::Pgid(pgid) => _waitid_pgid(pgid, options), - #[cfg(target_os = "linux")] - WaitId::PidFd(fd) => _waitid_pidfd(fd, options), - #[cfg(not(target_os = "linux"))] - WaitId::__EatLifetime(_) => unreachable!(), - } -} - -#[cfg(not(any( - target_os = "espidf", - target_os = "redox", - target_os = "openbsd", - target_os = "vita", - target_os = "wasi" -)))] -#[inline] -fn _waitid_all(options: WaitidOptions) -> io::Result<Option<WaitidStatus>> { - // `waitid` can return successfully without initializing the struct (no - // children found when using `WNOHANG`) - let mut status = MaybeUninit::<c::siginfo_t>::zeroed(); - unsafe { - ret(c::waitid( - c::P_ALL, - 0, - status.as_mut_ptr(), - options.bits() as _, - ))? - }; - - Ok(unsafe { cvt_waitid_status(status) }) -} - -#[cfg(not(any( - target_os = "espidf", - target_os = "redox", - target_os = "openbsd", - target_os = "vita", - target_os = "wasi" -)))] -#[inline] -fn _waitid_pid(pid: Pid, options: WaitidOptions) -> io::Result<Option<WaitidStatus>> { - // `waitid` can return successfully without initializing the struct (no - // children found when using `WNOHANG`) - let mut status = MaybeUninit::<c::siginfo_t>::zeroed(); - unsafe { - ret(c::waitid( - c::P_PID, - Pid::as_raw(Some(pid)) as _, - status.as_mut_ptr(), - options.bits() as _, - ))? - }; - - Ok(unsafe { cvt_waitid_status(status) }) -} - -#[cfg(not(any( - target_os = "espidf", - target_os = "redox", - target_os = "openbsd", - target_os = "vita", - target_os = "wasi" -)))] -#[inline] -fn _waitid_pgid(pgid: Option<Pid>, options: WaitidOptions) -> io::Result<Option<WaitidStatus>> { - // `waitid` can return successfully without initializing the struct (no - // children found when using `WNOHANG`) - let mut status = MaybeUninit::<c::siginfo_t>::zeroed(); - unsafe { - ret(c::waitid( - c::P_PGID, - Pid::as_raw(pgid) as _, - status.as_mut_ptr(), - options.bits() as _, - ))? - }; - - Ok(unsafe { cvt_waitid_status(status) }) -} - -#[cfg(target_os = "linux")] -#[inline] -fn _waitid_pidfd(fd: BorrowedFd<'_>, options: WaitidOptions) -> io::Result<Option<WaitidStatus>> { - // `waitid` can return successfully without initializing the struct (no - // children found when using `WNOHANG`) - let mut status = MaybeUninit::<c::siginfo_t>::zeroed(); - unsafe { - ret(c::waitid( - c::P_PIDFD, - fd.as_raw_fd() as _, - status.as_mut_ptr(), - options.bits() as _, - ))? - }; - - Ok(unsafe { cvt_waitid_status(status) }) -} - -/// Convert a `siginfo_t` to a `WaitidStatus`. -/// -/// # Safety -/// -/// The caller must ensure that `status` is initialized and that `waitid` -/// returned successfully. -#[cfg(not(any( - target_os = "espidf", - target_os = "openbsd", - target_os = "redox", - target_os = "vita", - target_os = "wasi" -)))] -#[inline] -unsafe fn cvt_waitid_status(status: MaybeUninit<c::siginfo_t>) -> Option<WaitidStatus> { - let status = status.assume_init(); - // `si_pid` is supposedly the better way to check that the struct has been - // filled, e.g. the Linux manpage says about the `WNOHANG` case “zero out - // the si_pid field before the call and check for a nonzero value”. - // But e.g. NetBSD/OpenBSD don't have it exposed in the libc crate for now, - // and some platforms don't have it at all. For simplicity, always check - // `si_signo`. We have zero-initialized the whole struct, and all kernels - // should set `SIGCHLD` here. - if status.si_signo == 0 { - None - } else { - Some(WaitidStatus(status)) - } -} - -#[cfg(not(any(target_os = "redox", target_os = "wasi")))] -#[inline] -pub(crate) fn getsid(pid: Option<Pid>) -> io::Result<Pid> { - unsafe { - let pid = ret_pid_t(c::getsid(Pid::as_raw(pid) as _))?; - Ok(Pid::from_raw_unchecked(pid)) - } -} - -#[cfg(not(target_os = "wasi"))] -#[inline] -pub(crate) fn setsid() -> io::Result<Pid> { - unsafe { - let pid = ret_c_int(c::setsid())?; - Ok(Pid::from_raw_unchecked(pid)) - } -} - -#[cfg(not(any(target_os = "espidf", target_os = "wasi")))] -#[inline] -pub(crate) fn kill_process(pid: Pid, sig: Signal) -> io::Result<()> { - unsafe { ret(c::kill(pid.as_raw_nonzero().get(), sig as i32)) } -} - -#[cfg(not(any(target_os = "espidf", target_os = "wasi")))] -#[inline] -pub(crate) fn kill_process_group(pid: Pid, sig: Signal) -> io::Result<()> { - unsafe { - ret(c::kill( - pid.as_raw_nonzero().get().wrapping_neg(), - sig as i32, - )) - } -} - -#[cfg(not(any(target_os = "espidf", target_os = "wasi")))] -#[inline] -pub(crate) fn kill_current_process_group(sig: Signal) -> io::Result<()> { - unsafe { ret(c::kill(0, sig as i32)) } -} - -#[cfg(not(any(target_os = "espidf", target_os = "wasi")))] -pub(crate) fn test_kill_process(pid: Pid) -> io::Result<()> { - unsafe { ret(c::kill(pid.as_raw_nonzero().get(), 0)) } -} - -#[cfg(not(any(target_os = "espidf", target_os = "wasi")))] -#[inline] -pub(crate) fn test_kill_process_group(pid: Pid) -> io::Result<()> { - unsafe { ret(c::kill(pid.as_raw_nonzero().get().wrapping_neg(), 0)) } -} - -#[cfg(not(any(target_os = "espidf", target_os = "wasi")))] -#[inline] -pub(crate) fn test_kill_current_process_group() -> io::Result<()> { - unsafe { ret(c::kill(0, 0)) } -} - -#[cfg(freebsdlike)] -#[inline] -pub(crate) unsafe fn procctl( - idtype: c::idtype_t, - id: c::id_t, - option: c::c_int, - data: *mut c::c_void, -) -> io::Result<()> { - ret(c::procctl(idtype, id, option, data)) -} - -#[cfg(target_os = "linux")] -pub(crate) fn pidfd_open(pid: Pid, flags: PidfdFlags) -> io::Result<OwnedFd> { - syscall! { - fn pidfd_open( - pid: c::pid_t, - flags: c::c_uint - ) via SYS_pidfd_open -> c::c_int - } - unsafe { - ret_owned_fd(pidfd_open( - pid.as_raw_nonzero().get(), - bitflags_bits!(flags), - )) - } -} - -#[cfg(target_os = "linux")] -pub(crate) fn pidfd_getfd( - pidfd: BorrowedFd<'_>, - targetfd: RawFd, - flags: PidfdGetfdFlags, -) -> io::Result<OwnedFd> { - syscall! { - fn pidfd_getfd( - pidfd: c::c_int, - targetfd: c::c_int, - flags: c::c_uint - ) via SYS_pidfd_getfd -> c::c_int - } - unsafe { - ret_owned_fd(pidfd_getfd( - borrowed_fd(pidfd), - targetfd, - bitflags_bits!(flags), - )) - } -} - -#[cfg(all(feature = "alloc", not(target_os = "wasi")))] -pub(crate) fn getgroups(buf: &mut [Gid]) -> io::Result<usize> { - let len = buf.len().try_into().map_err(|_| io::Errno::NOMEM)?; - - unsafe { ret_usize(c::getgroups(len, buf.as_mut_ptr().cast()) as isize) } -} diff --git a/vendor/rustix/src/backend/libc/process/types.rs b/vendor/rustix/src/backend/libc/process/types.rs deleted file mode 100644 index f914128..0000000 --- a/vendor/rustix/src/backend/libc/process/types.rs +++ /dev/null @@ -1,172 +0,0 @@ -#[cfg(not(any(target_os = "espidf", target_os = "vita")))] -use crate::backend::c; - -/// A command for use with [`membarrier`] and [`membarrier_cpu`]. -/// -/// For `MEMBARRIER_CMD_QUERY`, see [`membarrier_query`]. -/// -/// [`membarrier`]: crate::process::membarrier -/// [`membarrier_cpu`]: crate::process::membarrier_cpu -/// [`membarrier_query`]: crate::process::membarrier_query -#[cfg(linux_kernel)] -#[derive(Copy, Clone, Eq, PartialEq, Debug)] -#[repr(u32)] -pub enum MembarrierCommand { - /// `MEMBARRIER_CMD_GLOBAL` - #[doc(alias = "Shared")] - #[doc(alias = "MEMBARRIER_CMD_SHARED")] - Global = c::MEMBARRIER_CMD_GLOBAL as u32, - /// `MEMBARRIER_CMD_GLOBAL_EXPEDITED` - GlobalExpedited = c::MEMBARRIER_CMD_GLOBAL_EXPEDITED as u32, - /// `MEMBARRIER_CMD_REGISTER_GLOBAL_EXPEDITED` - RegisterGlobalExpedited = c::MEMBARRIER_CMD_REGISTER_GLOBAL_EXPEDITED as u32, - /// `MEMBARRIER_CMD_PRIVATE_EXPEDITED` - PrivateExpedited = c::MEMBARRIER_CMD_PRIVATE_EXPEDITED as u32, - /// `MEMBARRIER_CMD_REGISTER_PRIVATE_EXPEDITED` - RegisterPrivateExpedited = c::MEMBARRIER_CMD_REGISTER_PRIVATE_EXPEDITED as u32, - /// `MEMBARRIER_CMD_PRIVATE_EXPEDITED_SYNC_CORE` - PrivateExpeditedSyncCore = c::MEMBARRIER_CMD_PRIVATE_EXPEDITED_SYNC_CORE as u32, - /// `MEMBARRIER_CMD_REGISTER_PRIVATE_EXPEDITED_SYNC_CORE` - RegisterPrivateExpeditedSyncCore = - c::MEMBARRIER_CMD_REGISTER_PRIVATE_EXPEDITED_SYNC_CORE as u32, - /// `MEMBARRIER_CMD_PRIVATE_EXPEDITED_RSEQ` (since Linux 5.10) - PrivateExpeditedRseq = c::MEMBARRIER_CMD_PRIVATE_EXPEDITED_RSEQ as u32, - /// `MEMBARRIER_CMD_REGISTER_PRIVATE_EXPEDITED_RSEQ` (since Linux 5.10) - RegisterPrivateExpeditedRseq = c::MEMBARRIER_CMD_REGISTER_PRIVATE_EXPEDITED_RSEQ as u32, -} - -/// A resource value for use with [`getrlimit`], [`setrlimit`], and -/// [`prlimit`]. -/// -/// [`getrlimit`]: crate::process::getrlimit -/// [`setrlimit`]: crate::process::setrlimit -/// [`prlimit`]: crate::process::prlimit -#[cfg(not(any( - target_os = "espidf", - target_os = "fuchsia", - target_os = "redox", - target_os = "vita", - target_os = "wasi" -)))] -#[derive(Copy, Clone, Debug, Eq, PartialEq)] -#[cfg_attr(not(target_os = "l4re"), repr(u32))] -#[cfg_attr(target_os = "l4re", repr(u64))] -pub enum Resource { - /// `RLIMIT_CPU` - Cpu = bitcast!(c::RLIMIT_CPU), - /// `RLIMIT_FSIZE` - Fsize = bitcast!(c::RLIMIT_FSIZE), - /// `RLIMIT_DATA` - Data = bitcast!(c::RLIMIT_DATA), - /// `RLIMIT_STACK` - Stack = bitcast!(c::RLIMIT_STACK), - /// `RLIMIT_CORE` - #[cfg(not(target_os = "haiku"))] - Core = bitcast!(c::RLIMIT_CORE), - /// `RLIMIT_RSS` - // "nto" has `RLIMIT_RSS`, but it has the same value as `RLIMIT_AS`. - #[cfg(not(any(apple, solarish, target_os = "nto", target_os = "haiku")))] - Rss = bitcast!(c::RLIMIT_RSS), - /// `RLIMIT_NPROC` - #[cfg(not(any(solarish, target_os = "haiku")))] - Nproc = bitcast!(c::RLIMIT_NPROC), - /// `RLIMIT_NOFILE` - Nofile = bitcast!(c::RLIMIT_NOFILE), - /// `RLIMIT_MEMLOCK` - #[cfg(not(any(solarish, target_os = "aix", target_os = "haiku")))] - Memlock = bitcast!(c::RLIMIT_MEMLOCK), - /// `RLIMIT_AS` - #[cfg(not(target_os = "openbsd"))] - As = bitcast!(c::RLIMIT_AS), - /// `RLIMIT_LOCKS` - #[cfg(not(any( - bsd, - solarish, - target_os = "aix", - target_os = "haiku", - target_os = "hurd", - target_os = "nto" - )))] - Locks = bitcast!(c::RLIMIT_LOCKS), - /// `RLIMIT_SIGPENDING` - #[cfg(not(any( - bsd, - solarish, - target_os = "aix", - target_os = "haiku", - target_os = "hurd", - target_os = "nto" - )))] - Sigpending = bitcast!(c::RLIMIT_SIGPENDING), - /// `RLIMIT_MSGQUEUE` - #[cfg(not(any( - bsd, - solarish, - target_os = "aix", - target_os = "haiku", - target_os = "hurd", - target_os = "nto" - )))] - Msgqueue = bitcast!(c::RLIMIT_MSGQUEUE), - /// `RLIMIT_NICE` - #[cfg(not(any( - bsd, - solarish, - target_os = "aix", - target_os = "haiku", - target_os = "hurd", - target_os = "nto" - )))] - Nice = bitcast!(c::RLIMIT_NICE), - /// `RLIMIT_RTPRIO` - #[cfg(not(any( - bsd, - solarish, - target_os = "aix", - target_os = "haiku", - target_os = "hurd", - target_os = "nto" - )))] - Rtprio = bitcast!(c::RLIMIT_RTPRIO), - /// `RLIMIT_RTTIME` - #[cfg(not(any( - bsd, - solarish, - target_os = "aix", - target_os = "android", - target_os = "emscripten", - target_os = "haiku", - target_os = "hurd", - target_os = "nto", - )))] - Rttime = bitcast!(c::RLIMIT_RTTIME), -} - -#[cfg(apple)] -#[allow(non_upper_case_globals)] -impl Resource { - /// `RLIMIT_RSS` - pub const Rss: Self = Self::As; -} - -/// A CPU identifier as a raw integer. -#[cfg(linux_kernel)] -pub type RawCpuid = u32; -#[cfg(freebsdlike)] -pub type RawId = c::id_t; - -#[cfg(any(linux_kernel, target_os = "fuchsia"))] -pub(crate) type RawCpuSet = c::cpu_set_t; -#[cfg(freebsdlike)] -pub(crate) type RawCpuSet = c::cpuset_t; - -#[cfg(any(freebsdlike, linux_kernel, target_os = "fuchsia"))] -#[inline] -pub(crate) fn raw_cpu_set_new() -> RawCpuSet { - let mut set = unsafe { core::mem::zeroed() }; - super::cpu_set::CPU_ZERO(&mut set); - set -} - -#[cfg(any(freebsdlike, linux_kernel, target_os = "fuchsia"))] -pub(crate) const CPU_SETSIZE: usize = c::CPU_SETSIZE as usize; diff --git a/vendor/rustix/src/backend/libc/process/wait.rs b/vendor/rustix/src/backend/libc/process/wait.rs deleted file mode 100644 index 9a932cf..0000000 --- a/vendor/rustix/src/backend/libc/process/wait.rs +++ /dev/null @@ -1,9 +0,0 @@ -use crate::backend::c; - -pub(crate) use c::{ - WCONTINUED, WEXITSTATUS, WIFCONTINUED, WIFEXITED, WIFSIGNALED, WIFSTOPPED, WNOHANG, WSTOPSIG, - WTERMSIG, WUNTRACED, -}; - -#[cfg(not(any(target_os = "openbsd", target_os = "redox", target_os = "wasi")))] -pub(crate) use c::{WEXITED, WNOWAIT, WSTOPPED}; diff --git a/vendor/rustix/src/backend/libc/pty/mod.rs b/vendor/rustix/src/backend/libc/pty/mod.rs deleted file mode 100644 index ef944f0..0000000 --- a/vendor/rustix/src/backend/libc/pty/mod.rs +++ /dev/null @@ -1 +0,0 @@ -pub(crate) mod syscalls; diff --git a/vendor/rustix/src/backend/libc/pty/syscalls.rs b/vendor/rustix/src/backend/libc/pty/syscalls.rs deleted file mode 100644 index 2395efd..0000000 --- a/vendor/rustix/src/backend/libc/pty/syscalls.rs +++ /dev/null @@ -1,106 +0,0 @@ -//! libc syscalls supporting `rustix::pty`. - -use crate::backend::c; -use crate::backend::conv::{borrowed_fd, ret}; -use crate::fd::BorrowedFd; -use crate::io; -#[cfg(all( - feature = "alloc", - any(apple, linux_like, target_os = "freebsd", target_os = "fuchsia") -))] -use { - crate::ffi::{CStr, CString}, - crate::path::SMALL_PATH_BUFFER_SIZE, - alloc::borrow::ToOwned, - alloc::vec::Vec, -}; - -#[cfg(not(linux_kernel))] -use crate::{backend::conv::ret_owned_fd, fd::OwnedFd, pty::OpenptFlags}; - -#[cfg(not(linux_kernel))] -#[inline] -pub(crate) fn openpt(flags: OpenptFlags) -> io::Result<OwnedFd> { - unsafe { ret_owned_fd(c::posix_openpt(flags.bits() as _)) } -} - -#[cfg(all( - feature = "alloc", - any(apple, linux_like, target_os = "freebsd", target_os = "fuchsia") -))] -#[inline] -pub(crate) fn ptsname(fd: BorrowedFd<'_>, mut buffer: Vec<u8>) -> io::Result<CString> { - // This code would benefit from having a better way to read into - // uninitialized memory, but that requires `unsafe`. - buffer.clear(); - buffer.reserve(SMALL_PATH_BUFFER_SIZE); - buffer.resize(buffer.capacity(), 0_u8); - - loop { - // On platforms with `ptsname_r`, use it. - #[cfg(any(linux_like, target_os = "fuchsia"))] - let r = unsafe { c::ptsname_r(borrowed_fd(fd), buffer.as_mut_ptr().cast(), buffer.len()) }; - - // FreeBSD 12 doesn't have `ptsname_r`. - #[cfg(target_os = "freebsd")] - let r = unsafe { - weak! { - fn ptsname_r( - c::c_int, - *mut c::c_char, - c::size_t - ) -> c::c_int - } - if let Some(func) = ptsname_r.get() { - func(borrowed_fd(fd), buffer.as_mut_ptr().cast(), buffer.len()) - } else { - libc::ENOSYS - } - }; - - // macOS 10.13.4 has `ptsname_r`; use it if we have it, otherwise fall - // back to calling the underlying ioctl directly. - #[cfg(apple)] - let r = unsafe { - weak! { fn ptsname_r(c::c_int, *mut c::c_char, c::size_t) -> c::c_int } - - if let Some(libc_ptsname_r) = ptsname_r.get() { - libc_ptsname_r(borrowed_fd(fd), buffer.as_mut_ptr().cast(), buffer.len()) - } else { - // The size declared in the `TIOCPTYGNAME` macro in - // sys/ttycom.h is 128. - let mut name: [u8; 128] = [0_u8; 128]; - match c::ioctl(borrowed_fd(fd), c::TIOCPTYGNAME as _, &mut name) { - 0 => { - let len = CStr::from_ptr(name.as_ptr().cast()).to_bytes().len(); - std::ptr::copy_nonoverlapping(name.as_ptr(), buffer.as_mut_ptr(), len + 1); - 0 - } - _ => libc_errno::errno().0, - } - } - }; - - if r == 0 { - return Ok(unsafe { CStr::from_ptr(buffer.as_ptr().cast()).to_owned() }); - } - if r != c::ERANGE { - return Err(io::Errno::from_raw_os_error(r)); - } - - // Use `Vec` reallocation strategy to grow capacity exponentially. - buffer.reserve(1); - buffer.resize(buffer.capacity(), 0_u8); - } -} - -#[inline] -pub(crate) fn unlockpt(fd: BorrowedFd<'_>) -> io::Result<()> { - unsafe { ret(c::unlockpt(borrowed_fd(fd))) } -} - -#[cfg(not(linux_kernel))] -#[inline] -pub(crate) fn grantpt(fd: BorrowedFd<'_>) -> io::Result<()> { - unsafe { ret(c::grantpt(borrowed_fd(fd))) } -} diff --git a/vendor/rustix/src/backend/libc/rand/mod.rs b/vendor/rustix/src/backend/libc/rand/mod.rs deleted file mode 100644 index 1e0181a..0000000 --- a/vendor/rustix/src/backend/libc/rand/mod.rs +++ /dev/null @@ -1,2 +0,0 @@ -pub(crate) mod syscalls; -pub(crate) mod types; diff --git a/vendor/rustix/src/backend/libc/rand/syscalls.rs b/vendor/rustix/src/backend/libc/rand/syscalls.rs deleted file mode 100644 index 3a3929e..0000000 --- a/vendor/rustix/src/backend/libc/rand/syscalls.rs +++ /dev/null @@ -1,18 +0,0 @@ -//! libc syscalls supporting `rustix::rand`. - -#[cfg(linux_kernel)] -use {crate::backend::c, crate::backend::conv::ret_usize, crate::io, crate::rand::GetRandomFlags}; - -#[cfg(linux_kernel)] -pub(crate) unsafe fn getrandom( - buf: *mut u8, - cap: usize, - flags: GetRandomFlags, -) -> io::Result<usize> { - // `getrandom` wasn't supported in glibc until 2.25. - weak_or_syscall! { - fn getrandom(buf: *mut c::c_void, buflen: c::size_t, flags: c::c_uint) via SYS_getrandom -> c::ssize_t - } - - ret_usize(getrandom(buf.cast(), cap, flags.bits())) -} diff --git a/vendor/rustix/src/backend/libc/rand/types.rs b/vendor/rustix/src/backend/libc/rand/types.rs deleted file mode 100644 index 46690b5..0000000 --- a/vendor/rustix/src/backend/libc/rand/types.rs +++ /dev/null @@ -1,24 +0,0 @@ -#[cfg(linux_kernel)] -use crate::backend::c; -#[cfg(linux_kernel)] -use bitflags::bitflags; - -#[cfg(linux_kernel)] -bitflags! { - /// `GRND_*` flags for use with [`getrandom`]. - /// - /// [`getrandom`]: crate::rand::getrandom - #[repr(transparent)] - #[derive(Copy, Clone, Eq, PartialEq, Hash, Debug)] - pub struct GetRandomFlags: u32 { - /// `GRND_RANDOM` - const RANDOM = c::GRND_RANDOM; - /// `GRND_NONBLOCK` - const NONBLOCK = c::GRND_NONBLOCK; - /// `GRND_INSECURE` - const INSECURE = c::GRND_INSECURE; - - /// <https://docs.rs/bitflags/*/bitflags/#externally-defined-flags> - const _ = !0; - } -} diff --git a/vendor/rustix/src/backend/libc/shm/mod.rs b/vendor/rustix/src/backend/libc/shm/mod.rs deleted file mode 100644 index 1e0181a..0000000 --- a/vendor/rustix/src/backend/libc/shm/mod.rs +++ /dev/null @@ -1,2 +0,0 @@ -pub(crate) mod syscalls; -pub(crate) mod types; diff --git a/vendor/rustix/src/backend/libc/shm/syscalls.rs b/vendor/rustix/src/backend/libc/shm/syscalls.rs deleted file mode 100644 index b0d907f..0000000 --- a/vendor/rustix/src/backend/libc/shm/syscalls.rs +++ /dev/null @@ -1,25 +0,0 @@ -use crate::ffi::CStr; - -use crate::backend::c; -use crate::backend::conv::{c_str, ret, ret_owned_fd}; -use crate::fd::OwnedFd; -use crate::fs::Mode; -use crate::io; -use crate::shm::ShmOFlags; - -pub(crate) fn shm_open(name: &CStr, oflags: ShmOFlags, mode: Mode) -> io::Result<OwnedFd> { - // On this platforms, `mode_t` is `u16` and can't be passed directly to a - // variadic function. - #[cfg(apple)] - let mode: c::c_uint = mode.bits().into(); - - // Otherwise, cast to `mode_t` as that's what `open` is documented to take. - #[cfg(not(apple))] - let mode: c::mode_t = mode.bits() as _; - - unsafe { ret_owned_fd(c::shm_open(c_str(name), bitflags_bits!(oflags), mode)) } -} - -pub(crate) fn shm_unlink(name: &CStr) -> io::Result<()> { - unsafe { ret(c::shm_unlink(c_str(name))) } -} diff --git a/vendor/rustix/src/backend/libc/shm/types.rs b/vendor/rustix/src/backend/libc/shm/types.rs deleted file mode 100644 index 6575ef5..0000000 --- a/vendor/rustix/src/backend/libc/shm/types.rs +++ /dev/null @@ -1,30 +0,0 @@ -use crate::backend::c; -use bitflags::bitflags; - -bitflags! { - /// `O_*` constants for use with [`shm_open`]. - /// - /// [`shm_open`]: crate:shm::shm_open - #[repr(transparent)] - #[derive(Copy, Clone, Eq, PartialEq, Hash, Debug)] - pub struct ShmOFlags: u32 { - /// `O_CREAT` - #[doc(alias = "CREAT")] - const CREATE = bitcast!(c::O_CREAT); - - /// `O_EXCL` - const EXCL = bitcast!(c::O_EXCL); - - /// `O_RDONLY` - const RDONLY = bitcast!(c::O_RDONLY); - - /// `O_RDWR` - const RDWR = bitcast!(c::O_RDWR); - - /// `O_TRUNC` - const TRUNC = bitcast!(c::O_TRUNC); - - /// <https://docs.rs/bitflags/*/bitflags/#externally-defined-flags> - const _ = !0; - } -} diff --git a/vendor/rustix/src/backend/libc/system/mod.rs b/vendor/rustix/src/backend/libc/system/mod.rs deleted file mode 100644 index bff7fd5..0000000 --- a/vendor/rustix/src/backend/libc/system/mod.rs +++ /dev/null @@ -1,3 +0,0 @@ -#[cfg(not(windows))] -pub(crate) mod syscalls; -pub(crate) mod types; diff --git a/vendor/rustix/src/backend/libc/system/syscalls.rs b/vendor/rustix/src/backend/libc/system/syscalls.rs deleted file mode 100644 index 05d674b..0000000 --- a/vendor/rustix/src/backend/libc/system/syscalls.rs +++ /dev/null @@ -1,67 +0,0 @@ -//! libc syscalls supporting `rustix::process`. - -use super::types::RawUname; -use crate::backend::c; -#[cfg(not(target_os = "wasi"))] -use crate::backend::conv::ret_infallible; -#[cfg(target_os = "linux")] -use crate::system::RebootCommand; -#[cfg(linux_kernel)] -use crate::system::Sysinfo; -use core::mem::MaybeUninit; -#[cfg(not(any( - target_os = "emscripten", - target_os = "espidf", - target_os = "redox", - target_os = "vita", - target_os = "wasi" -)))] -use {crate::backend::conv::ret, crate::io}; - -#[cfg(not(target_os = "wasi"))] -#[inline] -pub(crate) fn uname() -> RawUname { - let mut uname = MaybeUninit::<RawUname>::uninit(); - unsafe { - let r = c::uname(uname.as_mut_ptr()); - - // On POSIX, `uname` is documented to return non-negative on success - // instead of the usual 0, though some specific systems do document - // that they always use zero allowing us to skip this check. - #[cfg(not(any(apple, freebsdlike, linux_like, target_os = "netbsd")))] - let r = core::cmp::min(r, 0); - - ret_infallible(r); - uname.assume_init() - } -} - -#[cfg(linux_kernel)] -pub(crate) fn sysinfo() -> Sysinfo { - let mut info = MaybeUninit::<Sysinfo>::uninit(); - unsafe { - ret_infallible(c::sysinfo(info.as_mut_ptr())); - info.assume_init() - } -} - -#[cfg(not(any( - target_os = "emscripten", - target_os = "espidf", - target_os = "redox", - target_os = "vita", - target_os = "wasi" -)))] -pub(crate) fn sethostname(name: &[u8]) -> io::Result<()> { - unsafe { - ret(c::sethostname( - name.as_ptr().cast(), - name.len().try_into().map_err(|_| io::Errno::INVAL)?, - )) - } -} - -#[cfg(target_os = "linux")] -pub(crate) fn reboot(cmd: RebootCommand) -> io::Result<()> { - unsafe { ret(c::reboot(cmd as i32)) } -} diff --git a/vendor/rustix/src/backend/libc/system/types.rs b/vendor/rustix/src/backend/libc/system/types.rs deleted file mode 100644 index 731e89b..0000000 --- a/vendor/rustix/src/backend/libc/system/types.rs +++ /dev/null @@ -1,8 +0,0 @@ -use crate::backend::c; - -/// `sysinfo` -#[cfg(linux_kernel)] -pub type Sysinfo = c::sysinfo; - -#[cfg(not(target_os = "wasi"))] -pub(crate) type RawUname = c::utsname; diff --git a/vendor/rustix/src/backend/libc/termios/mod.rs b/vendor/rustix/src/backend/libc/termios/mod.rs deleted file mode 100644 index ef944f0..0000000 --- a/vendor/rustix/src/backend/libc/termios/mod.rs +++ /dev/null @@ -1 +0,0 @@ -pub(crate) mod syscalls; diff --git a/vendor/rustix/src/backend/libc/termios/syscalls.rs b/vendor/rustix/src/backend/libc/termios/syscalls.rs deleted file mode 100644 index a833aea..0000000 --- a/vendor/rustix/src/backend/libc/termios/syscalls.rs +++ /dev/null @@ -1,403 +0,0 @@ -//! libc syscalls supporting `rustix::termios`. -//! -//! # Safety -//! -//! See the `rustix::backend::syscalls` module documentation for details. - -use crate::backend::c; -#[cfg(not(target_os = "wasi"))] -use crate::backend::conv::ret_pid_t; -use crate::backend::conv::{borrowed_fd, ret}; -use crate::fd::BorrowedFd; -#[cfg(all(feature = "alloc", feature = "procfs"))] -#[cfg(not(any(target_os = "fuchsia", target_os = "wasi")))] -use crate::ffi::CStr; -#[cfg(any( - not(target_os = "espidf"), - all( - feature = "procfs", - not(any(target_os = "fuchsia", target_os = "wasi")) - ) -))] -use core::mem::MaybeUninit; -#[cfg(not(target_os = "wasi"))] -use {crate::io, crate::pid::Pid}; -#[cfg(not(any(target_os = "espidf", target_os = "wasi")))] -use { - crate::termios::{Action, OptionalActions, QueueSelector, Termios, Winsize}, - crate::utils::as_mut_ptr, -}; - -#[cfg(not(any(target_os = "espidf", target_os = "wasi")))] -pub(crate) fn tcgetattr(fd: BorrowedFd<'_>) -> io::Result<Termios> { - // If we have `TCGETS2`, use it, so that we fill in the `c_ispeed` and - // `c_ospeed` fields. - #[cfg(linux_kernel)] - { - use crate::termios::{ControlModes, InputModes, LocalModes, OutputModes, SpecialCodes}; - use crate::utils::default_array; - - let termios2 = unsafe { - let mut termios2 = MaybeUninit::<c::termios2>::uninit(); - - // QEMU's `TCGETS2` doesn't currently set `input_speed` or - // `output_speed` on PowerPC, so zero out the fields ourselves. - #[cfg(any(target_arch = "powerpc", target_arch = "powerpc64"))] - { - termios2.write(core::mem::zeroed()); - } - - ret(c::ioctl( - borrowed_fd(fd), - c::TCGETS2 as _, - termios2.as_mut_ptr(), - ))?; - - termios2.assume_init() - }; - - // Convert from the Linux `termios2` to our `Termios`. - let mut result = Termios { - input_modes: InputModes::from_bits_retain(termios2.c_iflag), - output_modes: OutputModes::from_bits_retain(termios2.c_oflag), - control_modes: ControlModes::from_bits_retain(termios2.c_cflag), - local_modes: LocalModes::from_bits_retain(termios2.c_lflag), - line_discipline: termios2.c_line, - special_codes: SpecialCodes(default_array()), - input_speed: termios2.c_ispeed, - output_speed: termios2.c_ospeed, - }; - - // QEMU's `TCGETS2` doesn't currently set `input_speed` or - // `output_speed` on PowerPC, so set them manually if we can. - #[cfg(any(target_arch = "powerpc", target_arch = "powerpc64"))] - { - use crate::termios::speed; - - if result.output_speed == 0 && (termios2.c_cflag & c::CBAUD) != c::BOTHER { - if let Some(output_speed) = speed::decode(termios2.c_cflag & c::CBAUD) { - result.output_speed = output_speed; - } - } - if result.input_speed == 0 - && ((termios2.c_cflag & c::CIBAUD) >> c::IBSHIFT) != c::BOTHER - { - // For input speeds, `B0` is special-cased to mean the input - // speed is the same as the output speed. - if ((termios2.c_cflag & c::CIBAUD) >> c::IBSHIFT) == c::B0 { - result.input_speed = result.output_speed; - } else if let Some(input_speed) = - speed::decode((termios2.c_cflag & c::CIBAUD) >> c::IBSHIFT) - { - result.input_speed = input_speed; - } - } - } - - result.special_codes.0[..termios2.c_cc.len()].copy_from_slice(&termios2.c_cc); - - Ok(result) - } - - #[cfg(not(linux_kernel))] - unsafe { - let mut result = MaybeUninit::<Termios>::uninit(); - - // `result` is a `Termios` which starts with the same layout as - // `libc::termios`, so we can cast the pointer. - ret(c::tcgetattr(borrowed_fd(fd), result.as_mut_ptr().cast()))?; - - Ok(result.assume_init()) - } -} - -#[cfg(not(target_os = "wasi"))] -pub(crate) fn tcgetpgrp(fd: BorrowedFd<'_>) -> io::Result<Pid> { - unsafe { - let pid = ret_pid_t(c::tcgetpgrp(borrowed_fd(fd)))?; - - // This doesn't appear to be documented, but on Linux, it appears - // `tcsetpgrp` can succceed and set the pid to 0 if we pass it a - // pseudo-terminal device fd. For now, translate it into `OPNOTSUPP`. - #[cfg(linux_kernel)] - if pid == 0 { - return Err(io::Errno::OPNOTSUPP); - } - - Ok(Pid::from_raw_unchecked(pid)) - } -} - -#[cfg(not(target_os = "wasi"))] -pub(crate) fn tcsetpgrp(fd: BorrowedFd<'_>, pid: Pid) -> io::Result<()> { - unsafe { ret(c::tcsetpgrp(borrowed_fd(fd), pid.as_raw_nonzero().get())) } -} - -#[cfg(not(any(target_os = "espidf", target_os = "wasi")))] -pub(crate) fn tcsetattr( - fd: BorrowedFd<'_>, - optional_actions: OptionalActions, - termios: &Termios, -) -> io::Result<()> { - // If we have `TCSETS2`, use it, so that we use the `c_ispeed` and - // `c_ospeed` fields. - #[cfg(linux_kernel)] - { - use crate::termios::speed; - use crate::utils::default_array; - use linux_raw_sys::general::{termios2, BOTHER, CBAUD, IBSHIFT}; - - #[cfg(not(any(target_arch = "sparc", target_arch = "sparc64")))] - use linux_raw_sys::ioctl::{TCSETS, TCSETS2}; - - // linux-raw-sys' ioctl-generation script for sparc isn't working yet, - // so as a temporary workaround, declare these manually. - #[cfg(any(target_arch = "sparc", target_arch = "sparc64"))] - const TCSETS: u32 = 0x8024_5409; - #[cfg(any(target_arch = "sparc", target_arch = "sparc64"))] - const TCSETS2: u32 = 0x802c_540d; - - // Translate from `optional_actions` into an ioctl request code. On - // MIPS, `optional_actions` already has `TCGETS` added to it. - let request = TCSETS2 - + if cfg!(any( - target_arch = "mips", - target_arch = "mips32r6", - target_arch = "mips64", - target_arch = "mips64r6" - )) { - optional_actions as u32 - TCSETS - } else { - optional_actions as u32 - }; - - let input_speed = termios.input_speed(); - let output_speed = termios.output_speed(); - let mut termios2 = termios2 { - c_iflag: termios.input_modes.bits(), - c_oflag: termios.output_modes.bits(), - c_cflag: termios.control_modes.bits(), - c_lflag: termios.local_modes.bits(), - c_line: termios.line_discipline, - c_cc: default_array(), - c_ispeed: input_speed, - c_ospeed: output_speed, - }; - // Ensure that our input and output speeds are set, as `libc` - // routines don't always support setting these separately. - termios2.c_cflag &= !CBAUD; - termios2.c_cflag |= speed::encode(output_speed).unwrap_or(BOTHER); - termios2.c_cflag &= !(CBAUD << IBSHIFT); - termios2.c_cflag |= speed::encode(input_speed).unwrap_or(BOTHER) << IBSHIFT; - let nccs = termios2.c_cc.len(); - termios2 - .c_cc - .copy_from_slice(&termios.special_codes.0[..nccs]); - - unsafe { ret(c::ioctl(borrowed_fd(fd), request as _, &termios2)) } - } - - #[cfg(not(linux_kernel))] - unsafe { - ret(c::tcsetattr( - borrowed_fd(fd), - optional_actions as _, - crate::utils::as_ptr(termios).cast(), - )) - } -} - -#[cfg(not(target_os = "wasi"))] -pub(crate) fn tcsendbreak(fd: BorrowedFd<'_>) -> io::Result<()> { - unsafe { ret(c::tcsendbreak(borrowed_fd(fd), 0)) } -} - -#[cfg(not(any(target_os = "espidf", target_os = "wasi")))] -pub(crate) fn tcdrain(fd: BorrowedFd<'_>) -> io::Result<()> { - unsafe { ret(c::tcdrain(borrowed_fd(fd))) } -} - -#[cfg(not(any(target_os = "espidf", target_os = "wasi")))] -pub(crate) fn tcflush(fd: BorrowedFd<'_>, queue_selector: QueueSelector) -> io::Result<()> { - unsafe { ret(c::tcflush(borrowed_fd(fd), queue_selector as _)) } -} - -#[cfg(not(any(target_os = "espidf", target_os = "wasi")))] -pub(crate) fn tcflow(fd: BorrowedFd<'_>, action: Action) -> io::Result<()> { - unsafe { ret(c::tcflow(borrowed_fd(fd), action as _)) } -} - -#[cfg(not(target_os = "wasi"))] -pub(crate) fn tcgetsid(fd: BorrowedFd<'_>) -> io::Result<Pid> { - unsafe { - let pid = ret_pid_t(c::tcgetsid(borrowed_fd(fd)))?; - Ok(Pid::from_raw_unchecked(pid)) - } -} - -#[cfg(not(any(target_os = "espidf", target_os = "wasi")))] -pub(crate) fn tcsetwinsize(fd: BorrowedFd<'_>, winsize: Winsize) -> io::Result<()> { - unsafe { ret(c::ioctl(borrowed_fd(fd), c::TIOCSWINSZ, &winsize)) } -} - -#[cfg(not(any(target_os = "espidf", target_os = "wasi")))] -pub(crate) fn tcgetwinsize(fd: BorrowedFd<'_>) -> io::Result<Winsize> { - unsafe { - let mut buf = MaybeUninit::<Winsize>::uninit(); - ret(c::ioctl( - borrowed_fd(fd), - c::TIOCGWINSZ.into(), - buf.as_mut_ptr(), - ))?; - Ok(buf.assume_init()) - } -} - -#[cfg(not(any(target_os = "espidf", target_os = "nto", target_os = "wasi")))] -#[inline] -pub(crate) fn set_speed(termios: &mut Termios, arbitrary_speed: u32) -> io::Result<()> { - #[cfg(bsd)] - let encoded_speed = arbitrary_speed; - - #[cfg(not(bsd))] - let encoded_speed = match crate::termios::speed::encode(arbitrary_speed) { - Some(encoded_speed) => encoded_speed, - #[cfg(linux_kernel)] - None => c::BOTHER, - #[cfg(not(linux_kernel))] - None => return Err(io::Errno::INVAL), - }; - - #[cfg(not(linux_kernel))] - unsafe { - ret(c::cfsetspeed( - as_mut_ptr(termios).cast(), - encoded_speed.into(), - )) - } - - // Linux libc implementations don't support arbitrary speeds, so we encode - // the speed manually. - #[cfg(linux_kernel)] - { - use crate::termios::ControlModes; - - debug_assert_eq!(encoded_speed & !c::CBAUD, 0); - - termios.control_modes -= ControlModes::from_bits_retain(c::CBAUD | c::CIBAUD); - termios.control_modes |= - ControlModes::from_bits_retain(encoded_speed | (encoded_speed << c::IBSHIFT)); - - termios.input_speed = arbitrary_speed; - termios.output_speed = arbitrary_speed; - - Ok(()) - } -} - -#[cfg(not(any(target_os = "espidf", target_os = "wasi")))] -#[inline] -pub(crate) fn set_output_speed(termios: &mut Termios, arbitrary_speed: u32) -> io::Result<()> { - #[cfg(bsd)] - let encoded_speed = arbitrary_speed; - - #[cfg(not(bsd))] - let encoded_speed = match crate::termios::speed::encode(arbitrary_speed) { - Some(encoded_speed) => encoded_speed, - #[cfg(linux_kernel)] - None => c::BOTHER, - #[cfg(not(linux_kernel))] - None => return Err(io::Errno::INVAL), - }; - - #[cfg(not(linux_kernel))] - unsafe { - ret(c::cfsetospeed( - as_mut_ptr(termios).cast(), - encoded_speed.into(), - )) - } - - // Linux libc implementations don't support arbitrary speeds or setting the - // input and output speeds separately, so we encode the speed manually. - #[cfg(linux_kernel)] - { - use crate::termios::ControlModes; - - debug_assert_eq!(encoded_speed & !c::CBAUD, 0); - - termios.control_modes -= ControlModes::from_bits_retain(c::CBAUD); - termios.control_modes |= ControlModes::from_bits_retain(encoded_speed); - - termios.output_speed = arbitrary_speed; - - Ok(()) - } -} - -#[cfg(not(any(target_os = "espidf", target_os = "wasi")))] -#[inline] -pub(crate) fn set_input_speed(termios: &mut Termios, arbitrary_speed: u32) -> io::Result<()> { - #[cfg(bsd)] - let encoded_speed = arbitrary_speed; - - #[cfg(not(bsd))] - let encoded_speed = match crate::termios::speed::encode(arbitrary_speed) { - Some(encoded_speed) => encoded_speed, - #[cfg(linux_kernel)] - None => c::BOTHER, - #[cfg(not(linux_kernel))] - None => return Err(io::Errno::INVAL), - }; - - #[cfg(not(linux_kernel))] - unsafe { - ret(c::cfsetispeed( - as_mut_ptr(termios).cast(), - encoded_speed.into(), - )) - } - - // Linux libc implementations don't support arbitrary speeds or setting the - // input and output speeds separately, so we encode the speed manually. - #[cfg(linux_kernel)] - { - use crate::termios::ControlModes; - - debug_assert_eq!(encoded_speed & !c::CBAUD, 0); - - termios.control_modes -= ControlModes::from_bits_retain(c::CIBAUD); - termios.control_modes |= ControlModes::from_bits_retain(encoded_speed << c::IBSHIFT); - - termios.input_speed = arbitrary_speed; - - Ok(()) - } -} - -#[cfg(not(any(target_os = "espidf", target_os = "nto", target_os = "wasi")))] -#[inline] -pub(crate) fn cfmakeraw(termios: &mut Termios) { - unsafe { c::cfmakeraw(as_mut_ptr(termios).cast()) } -} - -pub(crate) fn isatty(fd: BorrowedFd<'_>) -> bool { - // Use the return value of `isatty` alone. We don't check `errno` because - // we return `bool` rather than `io::Result<bool>`, because we assume - // `BorrowedFd` protects us from `EBADF`, and any other reasonably - // anticipated `errno` value would end up interpreted as “assume it's not a - // terminal” anyway. - unsafe { c::isatty(borrowed_fd(fd)) != 0 } -} - -#[cfg(all(feature = "alloc", feature = "procfs"))] -#[cfg(not(any(target_os = "fuchsia", target_os = "wasi")))] -pub(crate) fn ttyname(dirfd: BorrowedFd<'_>, buf: &mut [MaybeUninit<u8>]) -> io::Result<usize> { - unsafe { - // `ttyname_r` returns its error status rather than using `errno`. - match c::ttyname_r(borrowed_fd(dirfd), buf.as_mut_ptr().cast(), buf.len()) { - 0 => Ok(CStr::from_ptr(buf.as_ptr().cast()).to_bytes().len()), - err => Err(io::Errno::from_raw_os_error(err)), - } - } -} diff --git a/vendor/rustix/src/backend/libc/thread/futex.rs b/vendor/rustix/src/backend/libc/thread/futex.rs deleted file mode 100644 index 44d96f0..0000000 --- a/vendor/rustix/src/backend/libc/thread/futex.rs +++ /dev/null @@ -1,43 +0,0 @@ -use crate::backend::c; - -bitflags::bitflags! { - /// `FUTEX_*` flags for use with [`futex`]. - /// - /// [`futex`]: crate::thread::futex - #[repr(transparent)] - #[derive(Copy, Clone, Eq, PartialEq, Hash, Debug)] - pub struct FutexFlags: u32 { - /// `FUTEX_PRIVATE_FLAG` - const PRIVATE = bitcast!(c::FUTEX_PRIVATE_FLAG); - /// `FUTEX_CLOCK_REALTIME` - const CLOCK_REALTIME = bitcast!(c::FUTEX_CLOCK_REALTIME); - } -} - -/// `FUTEX_*` operations for use with [`futex`]. -/// -/// [`futex`]: crate::thread::futex -#[derive(Debug, Copy, Clone, Eq, PartialEq)] -#[repr(u32)] -pub enum FutexOperation { - /// `FUTEX_WAIT` - Wait = bitcast!(c::FUTEX_WAIT), - /// `FUTEX_WAKE` - Wake = bitcast!(c::FUTEX_WAKE), - /// `FUTEX_FD` - Fd = bitcast!(c::FUTEX_FD), - /// `FUTEX_REQUEUE` - Requeue = bitcast!(c::FUTEX_REQUEUE), - /// `FUTEX_CMP_REQUEUE` - CmpRequeue = bitcast!(c::FUTEX_CMP_REQUEUE), - /// `FUTEX_WAKE_OP` - WakeOp = bitcast!(c::FUTEX_WAKE_OP), - /// `FUTEX_LOCK_PI` - LockPi = bitcast!(c::FUTEX_LOCK_PI), - /// `FUTEX_UNLOCK_PI` - UnlockPi = bitcast!(c::FUTEX_UNLOCK_PI), - /// `FUTEX_TRYLOCK_PI` - TrylockPi = bitcast!(c::FUTEX_TRYLOCK_PI), - /// `FUTEX_WAIT_BITSET` - WaitBitset = bitcast!(c::FUTEX_WAIT_BITSET), -} diff --git a/vendor/rustix/src/backend/libc/thread/mod.rs b/vendor/rustix/src/backend/libc/thread/mod.rs deleted file mode 100644 index 4f8c87c..0000000 --- a/vendor/rustix/src/backend/libc/thread/mod.rs +++ /dev/null @@ -1,4 +0,0 @@ -#[cfg(linux_kernel)] -pub(crate) mod futex; -#[cfg(not(windows))] -pub(crate) mod syscalls; diff --git a/vendor/rustix/src/backend/libc/thread/syscalls.rs b/vendor/rustix/src/backend/libc/thread/syscalls.rs deleted file mode 100644 index 33750f4..0000000 --- a/vendor/rustix/src/backend/libc/thread/syscalls.rs +++ /dev/null @@ -1,523 +0,0 @@ -//! libc syscalls supporting `rustix::thread`. - -use crate::backend::c; -use crate::backend::conv::ret; -use crate::io; -#[cfg(not(target_os = "redox"))] -use crate::thread::{NanosleepRelativeResult, Timespec}; -#[cfg(all(target_env = "gnu", fix_y2038))] -use crate::timespec::LibcTimespec; -use core::mem::MaybeUninit; -#[cfg(linux_kernel)] -use { - crate::backend::conv::{borrowed_fd, ret_c_int, ret_usize}, - crate::fd::BorrowedFd, - crate::pid::Pid, - crate::thread::{FutexFlags, FutexOperation}, - crate::utils::as_mut_ptr, -}; -#[cfg(not(any( - apple, - freebsdlike, - target_os = "emscripten", - target_os = "espidf", - target_os = "haiku", - target_os = "openbsd", - target_os = "redox", - target_os = "vita", - target_os = "wasi", -)))] -use {crate::thread::ClockId, core::ptr::null_mut}; - -#[cfg(all(target_env = "gnu", fix_y2038))] -weak!(fn __clock_nanosleep_time64(c::clockid_t, c::c_int, *const LibcTimespec, *mut LibcTimespec) -> c::c_int); -#[cfg(all(target_env = "gnu", fix_y2038))] -weak!(fn __nanosleep64(*const LibcTimespec, *mut LibcTimespec) -> c::c_int); - -#[cfg(not(any( - apple, - target_os = "dragonfly", - target_os = "emscripten", - target_os = "espidf", - target_os = "freebsd", // FreeBSD 12 has clock_nanosleep, but libc targets FreeBSD 11. - target_os = "haiku", - target_os = "openbsd", - target_os = "redox", - target_os = "vita", - target_os = "wasi", -)))] -#[inline] -pub(crate) fn clock_nanosleep_relative(id: ClockId, request: &Timespec) -> NanosleepRelativeResult { - // Old 32-bit version: libc has `clock_nanosleep` but it is not y2038 safe - // by default. But there may be a `__clock_nanosleep_time64` we can use. - #[cfg(fix_y2038)] - { - #[cfg(target_env = "gnu")] - if let Some(libc_clock_nanosleep) = __clock_nanosleep_time64.get() { - let flags = 0; - let mut remain = MaybeUninit::<LibcTimespec>::uninit(); - - unsafe { - return match libc_clock_nanosleep( - id as c::clockid_t, - flags, - &request.clone().into(), - remain.as_mut_ptr(), - ) { - 0 => NanosleepRelativeResult::Ok, - err if err == io::Errno::INTR.0 => { - NanosleepRelativeResult::Interrupted(remain.assume_init().into()) - } - err => NanosleepRelativeResult::Err(io::Errno(err)), - }; - } - } - - clock_nanosleep_relative_old(id, request) - } - - // Main version: libc is y2038 safe and has `clock_nanosleep`. - #[cfg(not(fix_y2038))] - unsafe { - let flags = 0; - let mut remain = MaybeUninit::<Timespec>::uninit(); - - match c::clock_nanosleep(id as c::clockid_t, flags, request, remain.as_mut_ptr()) { - 0 => NanosleepRelativeResult::Ok, - err if err == io::Errno::INTR.0 => { - NanosleepRelativeResult::Interrupted(remain.assume_init()) - } - err => NanosleepRelativeResult::Err(io::Errno(err)), - } - } -} - -#[cfg(all( - fix_y2038, - not(any( - apple, - target_os = "emscripten", - target_os = "haiku", - target_os = "vita" - )) -))] -fn clock_nanosleep_relative_old(id: ClockId, request: &Timespec) -> NanosleepRelativeResult { - let tv_sec = match request.tv_sec.try_into() { - Ok(tv_sec) => tv_sec, - Err(_) => return NanosleepRelativeResult::Err(io::Errno::OVERFLOW), - }; - let tv_nsec = match request.tv_nsec.try_into() { - Ok(tv_nsec) => tv_nsec, - Err(_) => return NanosleepRelativeResult::Err(io::Errno::INVAL), - }; - let old_request = c::timespec { tv_sec, tv_nsec }; - let mut old_remain = MaybeUninit::<c::timespec>::uninit(); - let flags = 0; - - unsafe { - match c::clock_nanosleep( - id as c::clockid_t, - flags, - &old_request, - old_remain.as_mut_ptr(), - ) { - 0 => NanosleepRelativeResult::Ok, - err if err == io::Errno::INTR.0 => { - let old_remain = old_remain.assume_init(); - let remain = Timespec { - tv_sec: old_remain.tv_sec.into(), - tv_nsec: old_remain.tv_nsec.into(), - }; - NanosleepRelativeResult::Interrupted(remain) - } - err => NanosleepRelativeResult::Err(io::Errno(err)), - } - } -} - -#[cfg(not(any( - apple, - target_os = "dragonfly", - target_os = "emscripten", - target_os = "espidf", - target_os = "freebsd", // FreeBSD 12 has clock_nanosleep, but libc targets FreeBSD 11. - target_os = "haiku", - target_os = "openbsd", - target_os = "redox", - target_os = "vita", - target_os = "wasi", -)))] -#[inline] -pub(crate) fn clock_nanosleep_absolute(id: ClockId, request: &Timespec) -> io::Result<()> { - // Old 32-bit version: libc has `clock_nanosleep` but it is not y2038 safe - // by default. But there may be a `__clock_nanosleep_time64` we can use. - #[cfg(fix_y2038)] - { - #[cfg(target_env = "gnu")] - if let Some(libc_clock_nanosleep) = __clock_nanosleep_time64.get() { - let flags = c::TIMER_ABSTIME; - unsafe { - return match { - libc_clock_nanosleep( - id as c::clockid_t, - flags, - &request.clone().into(), - null_mut(), - ) - } { - 0 => Ok(()), - err => Err(io::Errno(err)), - }; - } - } - - clock_nanosleep_absolute_old(id, request) - } - - // Main version: libc is y2038 safe and has `clock_nanosleep`. - #[cfg(not(fix_y2038))] - { - let flags = c::TIMER_ABSTIME; - - match unsafe { c::clock_nanosleep(id as c::clockid_t, flags as _, request, null_mut()) } { - 0 => Ok(()), - err => Err(io::Errno(err)), - } - } -} - -#[cfg(all( - fix_y2038, - not(any( - apple, - target_os = "emscripten", - target_os = "haiku", - target_os = "vita" - )) -))] -fn clock_nanosleep_absolute_old(id: ClockId, request: &Timespec) -> io::Result<()> { - let flags = c::TIMER_ABSTIME; - - let old_request = c::timespec { - tv_sec: request.tv_sec.try_into().map_err(|_| io::Errno::OVERFLOW)?, - tv_nsec: request.tv_nsec.try_into().map_err(|_| io::Errno::INVAL)?, - }; - match unsafe { c::clock_nanosleep(id as c::clockid_t, flags, &old_request, null_mut()) } { - 0 => Ok(()), - err => Err(io::Errno(err)), - } -} - -#[cfg(not(target_os = "redox"))] -#[inline] -pub(crate) fn nanosleep(request: &Timespec) -> NanosleepRelativeResult { - // Old 32-bit version: libc has `nanosleep` but it is not y2038 safe by - // default. But there may be a `__nanosleep64` we can use. - #[cfg(fix_y2038)] - { - #[cfg(target_env = "gnu")] - if let Some(libc_nanosleep) = __nanosleep64.get() { - let mut remain = MaybeUninit::<LibcTimespec>::uninit(); - unsafe { - return match ret(libc_nanosleep(&request.clone().into(), remain.as_mut_ptr())) { - Ok(()) => NanosleepRelativeResult::Ok, - Err(io::Errno::INTR) => { - NanosleepRelativeResult::Interrupted(remain.assume_init().into()) - } - Err(err) => NanosleepRelativeResult::Err(err), - }; - } - } - - nanosleep_old(request) - } - - // Main version: libc is y2038 safe and has `nanosleep`. - #[cfg(not(fix_y2038))] - unsafe { - let mut remain = MaybeUninit::<Timespec>::uninit(); - - match ret(c::nanosleep(request, remain.as_mut_ptr())) { - Ok(()) => NanosleepRelativeResult::Ok, - Err(io::Errno::INTR) => NanosleepRelativeResult::Interrupted(remain.assume_init()), - Err(err) => NanosleepRelativeResult::Err(err), - } - } -} - -#[cfg(fix_y2038)] -fn nanosleep_old(request: &Timespec) -> NanosleepRelativeResult { - let tv_sec = match request.tv_sec.try_into() { - Ok(tv_sec) => tv_sec, - Err(_) => return NanosleepRelativeResult::Err(io::Errno::OVERFLOW), - }; - let tv_nsec = match request.tv_nsec.try_into() { - Ok(tv_nsec) => tv_nsec, - Err(_) => return NanosleepRelativeResult::Err(io::Errno::INVAL), - }; - let old_request = c::timespec { tv_sec, tv_nsec }; - let mut old_remain = MaybeUninit::<c::timespec>::uninit(); - - unsafe { - match ret(c::nanosleep(&old_request, old_remain.as_mut_ptr())) { - Ok(()) => NanosleepRelativeResult::Ok, - Err(io::Errno::INTR) => { - let old_remain = old_remain.assume_init(); - let remain = Timespec { - tv_sec: old_remain.tv_sec.into(), - tv_nsec: old_remain.tv_nsec.into(), - }; - NanosleepRelativeResult::Interrupted(remain) - } - Err(err) => NanosleepRelativeResult::Err(err), - } - } -} - -#[cfg(linux_kernel)] -#[inline] -#[must_use] -pub(crate) fn gettid() -> Pid { - // `gettid` wasn't supported in glibc until 2.30, and musl until 1.2.2, - // so use `syscall`. - // <https://sourceware.org/bugzilla/show_bug.cgi?id=6399#c62> - weak_or_syscall! { - fn gettid() via SYS_gettid -> c::pid_t - } - - unsafe { - let tid = gettid(); - Pid::from_raw_unchecked(tid) - } -} - -#[cfg(linux_kernel)] -#[inline] -pub(crate) fn setns(fd: BorrowedFd<'_>, nstype: c::c_int) -> io::Result<c::c_int> { - // `setns` wasn't supported in glibc until 2.14, and musl until 0.9.5, - // so use `syscall`. - weak_or_syscall! { - fn setns(fd: c::c_int, nstype: c::c_int) via SYS_setns -> c::c_int - } - - unsafe { ret_c_int(setns(borrowed_fd(fd), nstype)) } -} - -#[cfg(linux_kernel)] -#[inline] -pub(crate) fn unshare(flags: crate::thread::UnshareFlags) -> io::Result<()> { - unsafe { ret(c::unshare(flags.bits() as i32)) } -} - -#[cfg(linux_kernel)] -#[inline] -pub(crate) fn capget( - header: &mut linux_raw_sys::general::__user_cap_header_struct, - data: &mut [MaybeUninit<linux_raw_sys::general::__user_cap_data_struct>], -) -> io::Result<()> { - syscall! { - fn capget( - hdrp: *mut linux_raw_sys::general::__user_cap_header_struct, - data: *mut linux_raw_sys::general::__user_cap_data_struct - ) via SYS_capget -> c::c_int - } - - unsafe { - ret(capget( - as_mut_ptr(header), - data.as_mut_ptr() - .cast::<linux_raw_sys::general::__user_cap_data_struct>(), - )) - } -} - -#[cfg(linux_kernel)] -#[inline] -pub(crate) fn capset( - header: &mut linux_raw_sys::general::__user_cap_header_struct, - data: &[linux_raw_sys::general::__user_cap_data_struct], -) -> io::Result<()> { - syscall! { - fn capset( - hdrp: *mut linux_raw_sys::general::__user_cap_header_struct, - data: *const linux_raw_sys::general::__user_cap_data_struct - ) via SYS_capset -> c::c_int - } - - unsafe { ret(capset(as_mut_ptr(header), data.as_ptr())) } -} - -#[cfg(linux_kernel)] -#[inline] -pub(crate) fn setuid_thread(uid: crate::ugid::Uid) -> io::Result<()> { - syscall! { - fn setuid(uid: c::uid_t) via SYS_setuid -> c::c_int - } - - unsafe { ret(setuid(uid.as_raw())) } -} - -#[cfg(linux_kernel)] -#[inline] -pub(crate) fn setresuid_thread( - ruid: crate::ugid::Uid, - euid: crate::ugid::Uid, - suid: crate::ugid::Uid, -) -> io::Result<()> { - #[cfg(any(target_arch = "x86", target_arch = "arm", target_arch = "sparc"))] - const SYS: c::c_long = c::SYS_setresuid32 as c::c_long; - #[cfg(not(any(target_arch = "x86", target_arch = "arm", target_arch = "sparc")))] - const SYS: c::c_long = c::SYS_setresuid as c::c_long; - - syscall! { - fn setresuid(ruid: c::uid_t, euid: c::uid_t, suid: c::uid_t) via SYS -> c::c_int - } - - unsafe { ret(setresuid(ruid.as_raw(), euid.as_raw(), suid.as_raw())) } -} - -#[cfg(linux_kernel)] -#[inline] -pub(crate) fn setgid_thread(gid: crate::ugid::Gid) -> io::Result<()> { - syscall! { - fn setgid(gid: c::gid_t) via SYS_setgid -> c::c_int - } - - unsafe { ret(setgid(gid.as_raw())) } -} - -#[cfg(linux_kernel)] -#[inline] -pub(crate) fn setresgid_thread( - rgid: crate::ugid::Gid, - egid: crate::ugid::Gid, - sgid: crate::ugid::Gid, -) -> io::Result<()> { - #[cfg(any(target_arch = "x86", target_arch = "arm", target_arch = "sparc"))] - const SYS: c::c_long = c::SYS_setresgid32 as c::c_long; - #[cfg(not(any(target_arch = "x86", target_arch = "arm", target_arch = "sparc")))] - const SYS: c::c_long = c::SYS_setresgid as c::c_long; - - syscall! { - fn setresgid(rgid: c::gid_t, egid: c::gid_t, sgid: c::gid_t) via SYS -> c::c_int - } - - unsafe { ret(setresgid(rgid.as_raw(), egid.as_raw(), sgid.as_raw())) } -} - -// TODO: This could be de-multiplexed. -#[cfg(linux_kernel)] -pub(crate) unsafe fn futex( - uaddr: *mut u32, - op: FutexOperation, - flags: FutexFlags, - val: u32, - utime: *const Timespec, - uaddr2: *mut u32, - val3: u32, -) -> io::Result<usize> { - #[cfg(all( - target_pointer_width = "32", - not(any(target_arch = "aarch64", target_arch = "x86_64")) - ))] - { - // TODO: Upstream this to the libc crate. - #[allow(non_upper_case_globals)] - const SYS_futex_time64: i32 = linux_raw_sys::general::__NR_futex_time64 as i32; - - syscall! { - fn futex_time64( - uaddr: *mut u32, - futex_op: c::c_int, - val: u32, - timeout: *const Timespec, - uaddr2: *mut u32, - val3: u32 - ) via SYS_futex_time64 -> c::ssize_t - } - - ret_usize(futex_time64( - uaddr, - op as i32 | flags.bits() as i32, - val, - utime, - uaddr2, - val3, - )) - .or_else(|err| { - // See the comments in `rustix_clock_gettime_via_syscall` about - // emulation. - if err == io::Errno::NOSYS { - futex_old(uaddr, op, flags, val, utime, uaddr2, val3) - } else { - Err(err) - } - }) - } - - #[cfg(any( - target_pointer_width = "64", - target_arch = "aarch64", - target_arch = "x86_64" - ))] - { - syscall! { - fn futex( - uaddr: *mut u32, - futex_op: c::c_int, - val: u32, - timeout: *const linux_raw_sys::general::__kernel_timespec, - uaddr2: *mut u32, - val3: u32 - ) via SYS_futex -> c::c_long - } - - ret_usize(futex( - uaddr, - op as i32 | flags.bits() as i32, - val, - utime.cast(), - uaddr2, - val3, - ) as isize) - } -} - -#[cfg(linux_kernel)] -#[cfg(all( - target_pointer_width = "32", - not(any(target_arch = "aarch64", target_arch = "x86_64")) -))] -unsafe fn futex_old( - uaddr: *mut u32, - op: FutexOperation, - flags: FutexFlags, - val: u32, - utime: *const Timespec, - uaddr2: *mut u32, - val3: u32, -) -> io::Result<usize> { - syscall! { - fn futex( - uaddr: *mut u32, - futex_op: c::c_int, - val: u32, - timeout: *const linux_raw_sys::general::__kernel_old_timespec, - uaddr2: *mut u32, - val3: u32 - ) via SYS_futex -> c::c_long - } - - let old_utime = linux_raw_sys::general::__kernel_old_timespec { - tv_sec: (*utime).tv_sec.try_into().map_err(|_| io::Errno::INVAL)?, - tv_nsec: (*utime).tv_nsec.try_into().map_err(|_| io::Errno::INVAL)?, - }; - ret_usize(futex( - uaddr, - op as i32 | flags.bits() as i32, - val, - &old_utime, - uaddr2, - val3, - ) as isize) -} diff --git a/vendor/rustix/src/backend/libc/time/mod.rs b/vendor/rustix/src/backend/libc/time/mod.rs deleted file mode 100644 index bff7fd5..0000000 --- a/vendor/rustix/src/backend/libc/time/mod.rs +++ /dev/null @@ -1,3 +0,0 @@ -#[cfg(not(windows))] -pub(crate) mod syscalls; -pub(crate) mod types; diff --git a/vendor/rustix/src/backend/libc/time/syscalls.rs b/vendor/rustix/src/backend/libc/time/syscalls.rs deleted file mode 100644 index 6b1c9fd..0000000 --- a/vendor/rustix/src/backend/libc/time/syscalls.rs +++ /dev/null @@ -1,452 +0,0 @@ -//! libc syscalls supporting `rustix::time`. - -use crate::backend::c; -use crate::backend::conv::ret; -#[cfg(any(linux_kernel, target_os = "fuchsia"))] -#[cfg(feature = "time")] -#[cfg(any(all(target_env = "gnu", fix_y2038), not(fix_y2038)))] -use crate::backend::time::types::LibcItimerspec; -#[cfg(not(target_os = "wasi"))] -use crate::clockid::{ClockId, DynamicClockId}; -use crate::io; -#[cfg(all(target_env = "gnu", fix_y2038))] -use crate::timespec::LibcTimespec; -use crate::timespec::Timespec; -use core::mem::MaybeUninit; -#[cfg(any(linux_kernel, target_os = "fuchsia"))] -#[cfg(feature = "time")] -use { - crate::backend::conv::{borrowed_fd, ret_owned_fd}, - crate::fd::{BorrowedFd, OwnedFd}, - crate::time::{Itimerspec, TimerfdClockId, TimerfdFlags, TimerfdTimerFlags}, -}; - -#[cfg(all(target_env = "gnu", fix_y2038))] -weak!(fn __clock_gettime64(c::clockid_t, *mut LibcTimespec) -> c::c_int); -#[cfg(all(target_env = "gnu", fix_y2038))] -weak!(fn __clock_settime64(c::clockid_t, *const LibcTimespec) -> c::c_int); -#[cfg(all(target_env = "gnu", fix_y2038))] -weak!(fn __clock_getres64(c::clockid_t, *mut LibcTimespec) -> c::c_int); -#[cfg(any(linux_kernel, target_os = "fuchsia"))] -#[cfg(all(target_env = "gnu", fix_y2038))] -#[cfg(feature = "time")] -weak!(fn __timerfd_gettime64(c::c_int, *mut LibcItimerspec) -> c::c_int); -#[cfg(any(linux_kernel, target_os = "fuchsia"))] -#[cfg(all(target_env = "gnu", fix_y2038))] -#[cfg(feature = "time")] -weak!(fn __timerfd_settime64(c::c_int, c::c_int, *const LibcItimerspec, *mut LibcItimerspec) -> c::c_int); - -#[cfg(not(any(target_os = "redox", target_os = "wasi")))] -#[inline] -#[must_use] -pub(crate) fn clock_getres(id: ClockId) -> Timespec { - // Old 32-bit version: libc has `clock_getres` but it is not y2038 safe by - // default. But there may be a `__clock_getres64` we can use. - #[cfg(fix_y2038)] - { - #[cfg(target_env = "gnu")] - if let Some(libc_clock_getres) = __clock_getres64.get() { - let mut timespec = MaybeUninit::<LibcTimespec>::uninit(); - unsafe { - ret(libc_clock_getres(id as c::clockid_t, timespec.as_mut_ptr())).unwrap(); - return timespec.assume_init().into(); - } - } - - clock_getres_old(id) - } - - // Main version: libc is y2038 safe and has `clock_getres`. - #[cfg(not(fix_y2038))] - unsafe { - let mut timespec = MaybeUninit::<Timespec>::uninit(); - let _ = c::clock_getres(id as c::clockid_t, timespec.as_mut_ptr()); - timespec.assume_init() - } -} - -#[cfg(fix_y2038)] -#[must_use] -fn clock_getres_old(id: ClockId) -> Timespec { - let mut old_timespec = MaybeUninit::<c::timespec>::uninit(); - - let old_timespec = unsafe { - ret(c::clock_getres( - id as c::clockid_t, - old_timespec.as_mut_ptr(), - )) - .unwrap(); - old_timespec.assume_init() - }; - - Timespec { - tv_sec: old_timespec.tv_sec.into(), - tv_nsec: old_timespec.tv_nsec.into(), - } -} - -#[cfg(not(target_os = "wasi"))] -#[inline] -#[must_use] -pub(crate) fn clock_gettime(id: ClockId) -> Timespec { - // Old 32-bit version: libc has `clock_gettime` but it is not y2038 safe by - // default. But there may be a `__clock_gettime64` we can use. - #[cfg(fix_y2038)] - { - #[cfg(target_env = "gnu")] - if let Some(libc_clock_gettime) = __clock_gettime64.get() { - let mut timespec = MaybeUninit::<LibcTimespec>::uninit(); - unsafe { - ret(libc_clock_gettime( - id as c::clockid_t, - timespec.as_mut_ptr(), - )) - .unwrap(); - return timespec.assume_init().into(); - } - } - - clock_gettime_old(id) - } - - // Use `.unwrap()` here because `clock_getres` can fail if the clock itself - // overflows a number of seconds, but if that happens, the monotonic clocks - // can't maintain their invariants, or the realtime clocks aren't properly - // configured. - #[cfg(not(fix_y2038))] - unsafe { - let mut timespec = MaybeUninit::<Timespec>::uninit(); - ret(c::clock_gettime(id as c::clockid_t, timespec.as_mut_ptr())).unwrap(); - timespec.assume_init() - } -} - -#[cfg(fix_y2038)] -#[must_use] -fn clock_gettime_old(id: ClockId) -> Timespec { - let mut old_timespec = MaybeUninit::<c::timespec>::uninit(); - - let old_timespec = unsafe { - ret(c::clock_gettime( - id as c::clockid_t, - old_timespec.as_mut_ptr(), - )) - .unwrap(); - old_timespec.assume_init() - }; - - Timespec { - tv_sec: old_timespec.tv_sec.into(), - tv_nsec: old_timespec.tv_nsec.into(), - } -} - -#[cfg(not(target_os = "wasi"))] -#[inline] -pub(crate) fn clock_gettime_dynamic(id: DynamicClockId<'_>) -> io::Result<Timespec> { - let id: c::clockid_t = match id { - DynamicClockId::Known(id) => id as c::clockid_t, - - #[cfg(linux_kernel)] - DynamicClockId::Dynamic(fd) => { - use crate::fd::AsRawFd; - const CLOCKFD: i32 = 3; - (!fd.as_raw_fd() << 3) | CLOCKFD - } - - #[cfg(not(linux_kernel))] - DynamicClockId::Dynamic(_fd) => { - // Dynamic clocks are not supported on this platform. - return Err(io::Errno::INVAL); - } - - #[cfg(linux_kernel)] - DynamicClockId::RealtimeAlarm => c::CLOCK_REALTIME_ALARM, - - #[cfg(linux_kernel)] - DynamicClockId::Tai => c::CLOCK_TAI, - - #[cfg(any( - freebsdlike, - linux_kernel, - target_os = "fuchsia", - target_os = "openbsd" - ))] - DynamicClockId::Boottime => c::CLOCK_BOOTTIME, - - #[cfg(any(linux_kernel, target_os = "fuchsia"))] - DynamicClockId::BoottimeAlarm => c::CLOCK_BOOTTIME_ALARM, - }; - - // Old 32-bit version: libc has `clock_gettime` but it is not y2038 - // safe by default. But there may be a `__clock_gettime64` we can use. - #[cfg(fix_y2038)] - { - #[cfg(target_env = "gnu")] - if let Some(libc_clock_gettime) = __clock_gettime64.get() { - let mut timespec = MaybeUninit::<LibcTimespec>::uninit(); - unsafe { - ret(libc_clock_gettime( - id as c::clockid_t, - timespec.as_mut_ptr(), - ))?; - - return Ok(timespec.assume_init().into()); - } - } - - clock_gettime_dynamic_old(id) - } - - // Main version: libc is y2038 safe and has `clock_gettime`. - #[cfg(not(fix_y2038))] - unsafe { - let mut timespec = MaybeUninit::<Timespec>::uninit(); - - ret(c::clock_gettime(id as c::clockid_t, timespec.as_mut_ptr()))?; - - Ok(timespec.assume_init()) - } -} - -#[cfg(fix_y2038)] -#[inline] -fn clock_gettime_dynamic_old(id: c::clockid_t) -> io::Result<Timespec> { - let mut old_timespec = MaybeUninit::<c::timespec>::uninit(); - - let old_timespec = unsafe { - ret(c::clock_gettime( - id as c::clockid_t, - old_timespec.as_mut_ptr(), - ))?; - - old_timespec.assume_init() - }; - - Ok(Timespec { - tv_sec: old_timespec.tv_sec.into(), - tv_nsec: old_timespec.tv_nsec.into(), - }) -} - -#[cfg(not(any( - target_os = "redox", - target_os = "wasi", - all(apple, not(target_os = "macos")) -)))] -#[inline] -pub(crate) fn clock_settime(id: ClockId, timespec: Timespec) -> io::Result<()> { - // Old 32-bit version: libc has `clock_gettime` but it is not y2038 safe by - // default. But there may be a `__clock_settime64` we can use. - #[cfg(fix_y2038)] - { - #[cfg(target_env = "gnu")] - if let Some(libc_clock_settime) = __clock_settime64.get() { - unsafe { - let mut new_timespec = core::mem::zeroed::<LibcTimespec>(); - new_timespec.tv_sec = timespec.tv_sec; - new_timespec.tv_nsec = timespec.tv_nsec as _; - return ret(libc_clock_settime(id as c::clockid_t, &new_timespec)); - } - } - - clock_settime_old(id, timespec) - } - - // Main version: libc is y2038 safe and has `clock_settime`. - #[cfg(not(fix_y2038))] - unsafe { - ret(c::clock_settime(id as c::clockid_t, ×pec)) - } -} - -#[cfg(not(any( - target_os = "redox", - target_os = "wasi", - all(apple, not(target_os = "macos")) -)))] -#[cfg(fix_y2038)] -fn clock_settime_old(id: ClockId, timespec: Timespec) -> io::Result<()> { - let old_timespec = c::timespec { - tv_sec: timespec - .tv_sec - .try_into() - .map_err(|_| io::Errno::OVERFLOW)?, - tv_nsec: timespec.tv_nsec as _, - }; - - unsafe { ret(c::clock_settime(id as c::clockid_t, &old_timespec)) } -} - -#[cfg(any(linux_kernel, target_os = "fuchsia"))] -#[cfg(feature = "time")] -pub(crate) fn timerfd_create(id: TimerfdClockId, flags: TimerfdFlags) -> io::Result<OwnedFd> { - unsafe { ret_owned_fd(c::timerfd_create(id as c::clockid_t, bitflags_bits!(flags))) } -} - -#[cfg(any(linux_kernel, target_os = "fuchsia"))] -#[cfg(feature = "time")] -pub(crate) fn timerfd_settime( - fd: BorrowedFd<'_>, - flags: TimerfdTimerFlags, - new_value: &Itimerspec, -) -> io::Result<Itimerspec> { - // Old 32-bit version: libc has `timerfd_settime` but it is not y2038 safe - // by default. But there may be a `__timerfd_settime64` we can use. - #[cfg(fix_y2038)] - { - #[cfg(target_env = "gnu")] - if let Some(libc_timerfd_settime) = __timerfd_settime64.get() { - let mut result = MaybeUninit::<LibcItimerspec>::uninit(); - unsafe { - ret(libc_timerfd_settime( - borrowed_fd(fd), - bitflags_bits!(flags), - &new_value.clone().into(), - result.as_mut_ptr(), - ))?; - return Ok(result.assume_init().into()); - } - } - - timerfd_settime_old(fd, flags, new_value) - } - - #[cfg(not(fix_y2038))] - unsafe { - let mut result = MaybeUninit::<LibcItimerspec>::uninit(); - ret(c::timerfd_settime( - borrowed_fd(fd), - bitflags_bits!(flags), - new_value, - result.as_mut_ptr(), - ))?; - Ok(result.assume_init()) - } -} - -#[cfg(any(linux_kernel, target_os = "fuchsia"))] -#[cfg(fix_y2038)] -#[cfg(feature = "time")] -fn timerfd_settime_old( - fd: BorrowedFd<'_>, - flags: TimerfdTimerFlags, - new_value: &Itimerspec, -) -> io::Result<Itimerspec> { - let mut old_result = MaybeUninit::<c::itimerspec>::uninit(); - - // Convert `new_value` to the old `itimerspec` format. - let old_new_value = c::itimerspec { - it_interval: c::timespec { - tv_sec: new_value - .it_interval - .tv_sec - .try_into() - .map_err(|_| io::Errno::OVERFLOW)?, - tv_nsec: new_value - .it_interval - .tv_nsec - .try_into() - .map_err(|_| io::Errno::INVAL)?, - }, - it_value: c::timespec { - tv_sec: new_value - .it_value - .tv_sec - .try_into() - .map_err(|_| io::Errno::OVERFLOW)?, - tv_nsec: new_value - .it_value - .tv_nsec - .try_into() - .map_err(|_| io::Errno::INVAL)?, - }, - }; - - let old_result = unsafe { - ret(c::timerfd_settime( - borrowed_fd(fd), - bitflags_bits!(flags), - &old_new_value, - old_result.as_mut_ptr(), - ))?; - old_result.assume_init() - }; - - Ok(Itimerspec { - it_interval: Timespec { - tv_sec: old_result - .it_interval - .tv_sec - .try_into() - .map_err(|_| io::Errno::OVERFLOW)?, - tv_nsec: old_result.it_interval.tv_nsec as _, - }, - it_value: Timespec { - tv_sec: old_result - .it_interval - .tv_sec - .try_into() - .map_err(|_| io::Errno::OVERFLOW)?, - tv_nsec: old_result.it_interval.tv_nsec as _, - }, - }) -} - -#[cfg(any(linux_kernel, target_os = "fuchsia"))] -#[cfg(feature = "time")] -pub(crate) fn timerfd_gettime(fd: BorrowedFd<'_>) -> io::Result<Itimerspec> { - // Old 32-bit version: libc has `timerfd_gettime` but it is not y2038 safe - // by default. But there may be a `__timerfd_gettime64` we can use. - #[cfg(fix_y2038)] - { - #[cfg(target_env = "gnu")] - if let Some(libc_timerfd_gettime) = __timerfd_gettime64.get() { - let mut result = MaybeUninit::<LibcItimerspec>::uninit(); - unsafe { - ret(libc_timerfd_gettime(borrowed_fd(fd), result.as_mut_ptr()))?; - return Ok(result.assume_init().into()); - } - } - - timerfd_gettime_old(fd) - } - - #[cfg(not(fix_y2038))] - unsafe { - let mut result = MaybeUninit::<LibcItimerspec>::uninit(); - ret(c::timerfd_gettime(borrowed_fd(fd), result.as_mut_ptr()))?; - Ok(result.assume_init()) - } -} - -#[cfg(any(linux_kernel, target_os = "fuchsia"))] -#[cfg(fix_y2038)] -#[cfg(feature = "time")] -fn timerfd_gettime_old(fd: BorrowedFd<'_>) -> io::Result<Itimerspec> { - let mut old_result = MaybeUninit::<c::itimerspec>::uninit(); - - let old_result = unsafe { - ret(c::timerfd_gettime(borrowed_fd(fd), old_result.as_mut_ptr()))?; - old_result.assume_init() - }; - - Ok(Itimerspec { - it_interval: Timespec { - tv_sec: old_result - .it_interval - .tv_sec - .try_into() - .map_err(|_| io::Errno::OVERFLOW)?, - tv_nsec: old_result.it_interval.tv_nsec as _, - }, - it_value: Timespec { - tv_sec: old_result - .it_interval - .tv_sec - .try_into() - .map_err(|_| io::Errno::OVERFLOW)?, - tv_nsec: old_result.it_interval.tv_nsec as _, - }, - }) -} diff --git a/vendor/rustix/src/backend/libc/time/types.rs b/vendor/rustix/src/backend/libc/time/types.rs deleted file mode 100644 index 5254c6b..0000000 --- a/vendor/rustix/src/backend/libc/time/types.rs +++ /dev/null @@ -1,177 +0,0 @@ -#[cfg(any(linux_kernel, target_os = "fuchsia"))] -use crate::backend::c; -#[cfg(any(linux_kernel, target_os = "fuchsia"))] -#[cfg(fix_y2038)] -use crate::timespec::LibcTimespec; -#[cfg(any(linux_kernel, target_os = "fuchsia"))] -#[cfg(fix_y2038)] -use crate::timespec::Timespec; -#[cfg(any(linux_kernel, target_os = "fuchsia"))] -use bitflags::bitflags; - -/// `struct itimerspec` for use with [`timerfd_gettime`] and -/// [`timerfd_settime`]. -/// -/// [`timerfd_gettime`]: crate::time::timerfd_gettime -/// [`timerfd_settime`]: crate::time::timerfd_settime -#[cfg(any(linux_kernel, target_os = "fuchsia"))] -#[cfg(not(fix_y2038))] -pub type Itimerspec = c::itimerspec; - -/// `struct itimerspec` for use with [`timerfd_gettime`] and -/// [`timerfd_settime`]. -/// -/// [`timerfd_gettime`]: crate::time::timerfd_gettime -/// [`timerfd_settime`]: crate::time::timerfd_settime -#[cfg(any(linux_kernel, target_os = "fuchsia"))] -#[cfg(fix_y2038)] -#[repr(C)] -#[derive(Debug, Clone)] -pub struct Itimerspec { - /// The interval of an interval timer. - pub it_interval: Timespec, - /// Time remaining in the current interval. - pub it_value: Timespec, -} - -/// On most platforms, `LibcItimerspec` is just `Itimerspec`. -#[cfg(any(linux_kernel, target_os = "fuchsia"))] -#[cfg(not(fix_y2038))] -pub(crate) type LibcItimerspec = Itimerspec; - -/// On 32-bit glibc platforms, `LibcTimespec` differs from `Timespec`, so we -/// define our own struct, with bidirectional `From` impls. -#[cfg(any(linux_kernel, target_os = "fuchsia"))] -#[cfg(fix_y2038)] -#[repr(C)] -#[derive(Debug, Clone)] -pub(crate) struct LibcItimerspec { - pub it_interval: LibcTimespec, - pub it_value: LibcTimespec, -} - -#[cfg(any(linux_kernel, target_os = "fuchsia"))] -#[cfg(fix_y2038)] -impl From<LibcItimerspec> for Itimerspec { - #[inline] - fn from(t: LibcItimerspec) -> Self { - Self { - it_interval: t.it_interval.into(), - it_value: t.it_value.into(), - } - } -} - -#[cfg(any(linux_kernel, target_os = "fuchsia"))] -#[cfg(fix_y2038)] -impl From<Itimerspec> for LibcItimerspec { - #[inline] - fn from(t: Itimerspec) -> Self { - Self { - it_interval: t.it_interval.into(), - it_value: t.it_value.into(), - } - } -} - -#[cfg(any(linux_kernel, target_os = "fuchsia"))] -bitflags! { - /// `TFD_*` flags for use with [`timerfd_create`]. - /// - /// [`timerfd_create`]: crate::time::timerfd_create - #[repr(transparent)] - #[derive(Copy, Clone, Eq, PartialEq, Hash, Debug)] - pub struct TimerfdFlags: u32 { - /// `TFD_NONBLOCK` - #[doc(alias = "TFD_NONBLOCK")] - const NONBLOCK = bitcast!(c::TFD_NONBLOCK); - - /// `TFD_CLOEXEC` - #[doc(alias = "TFD_CLOEXEC")] - const CLOEXEC = bitcast!(c::TFD_CLOEXEC); - - /// <https://docs.rs/bitflags/*/bitflags/#externally-defined-flags> - const _ = !0; - } -} - -#[cfg(any(linux_kernel, target_os = "fuchsia"))] -bitflags! { - /// `TFD_TIMER_*` flags for use with [`timerfd_settime`]. - /// - /// [`timerfd_settime`]: crate::time::timerfd_settime - #[repr(transparent)] - #[derive(Copy, Clone, Eq, PartialEq, Hash, Debug)] - pub struct TimerfdTimerFlags: u32 { - /// `TFD_TIMER_ABSTIME` - #[doc(alias = "TFD_TIMER_ABSTIME")] - const ABSTIME = bitcast!(c::TFD_TIMER_ABSTIME); - - /// `TFD_TIMER_CANCEL_ON_SET` - #[cfg(linux_kernel)] - #[doc(alias = "TFD_TIMER_CANCEL_ON_SET")] - const CANCEL_ON_SET = bitcast!(c::TFD_TIMER_CANCEL_ON_SET); - - /// <https://docs.rs/bitflags/*/bitflags/#externally-defined-flags> - const _ = !0; - } -} - -/// `CLOCK_*` constants for use with [`timerfd_create`]. -/// -/// [`timerfd_create`]: crate::time::timerfd_create -#[cfg(any(linux_kernel, target_os = "fuchsia"))] -#[derive(Debug, Copy, Clone, Eq, PartialEq, Hash)] -#[repr(u32)] -#[non_exhaustive] -pub enum TimerfdClockId { - /// `CLOCK_REALTIME`—A clock that tells the “real” time. - /// - /// This is a clock that tells the amount of time elapsed since the Unix - /// epoch, 1970-01-01T00:00:00Z. The clock is externally settable, so it is - /// not monotonic. Successive reads may see decreasing times, so it isn't - /// reliable for measuring durations. - #[doc(alias = "CLOCK_REALTIME")] - Realtime = bitcast!(c::CLOCK_REALTIME), - - /// `CLOCK_MONOTONIC`—A clock that tells an abstract time. - /// - /// Unlike `Realtime`, this clock is not based on a fixed known epoch, so - /// individual times aren't meaningful. However, since it isn't settable, - /// it is reliable for measuring durations. - /// - /// This clock does not advance while the system is suspended; see - /// `Boottime` for a clock that does. - #[doc(alias = "CLOCK_MONOTONIC")] - Monotonic = bitcast!(c::CLOCK_MONOTONIC), - - /// `CLOCK_BOOTTIME`—Like `Monotonic`, but advances while suspended. - /// - /// This clock is similar to `Monotonic`, but does advance while the system - /// is suspended. - #[doc(alias = "CLOCK_BOOTTIME")] - Boottime = bitcast!(c::CLOCK_BOOTTIME), - - /// `CLOCK_REALTIME_ALARM`—Like `Realtime`, but wakes a suspended system. - /// - /// This clock is like `Realtime`, but can wake up a suspended system. - /// - /// Use of this clock requires the `CAP_WAKE_ALARM` Linux capability. - #[doc(alias = "CLOCK_REALTIME_ALARM")] - RealtimeAlarm = bitcast!(c::CLOCK_REALTIME_ALARM), - - /// `CLOCK_BOOTTIME_ALARM`—Like `Boottime`, but wakes a suspended system. - /// - /// This clock is like `Boottime`, but can wake up a suspended system. - /// - /// Use of this clock requires the `CAP_WAKE_ALARM` Linux capability. - #[doc(alias = "CLOCK_BOOTTIME_ALARM")] - BoottimeAlarm = bitcast!(c::CLOCK_BOOTTIME_ALARM), -} - -#[cfg(any(linux_kernel, target_os = "fuchsia"))] -#[test] -fn test_types() { - assert_eq_size!(TimerfdFlags, c::c_int); - assert_eq_size!(TimerfdTimerFlags, c::c_int); -} diff --git a/vendor/rustix/src/backend/libc/ugid/mod.rs b/vendor/rustix/src/backend/libc/ugid/mod.rs deleted file mode 100644 index ef944f0..0000000 --- a/vendor/rustix/src/backend/libc/ugid/mod.rs +++ /dev/null @@ -1 +0,0 @@ -pub(crate) mod syscalls; diff --git a/vendor/rustix/src/backend/libc/ugid/syscalls.rs b/vendor/rustix/src/backend/libc/ugid/syscalls.rs deleted file mode 100644 index 0d3f622..0000000 --- a/vendor/rustix/src/backend/libc/ugid/syscalls.rs +++ /dev/null @@ -1,42 +0,0 @@ -use crate::backend::c; -use crate::ugid::{Gid, Uid}; - -#[cfg(not(target_os = "wasi"))] -#[inline] -#[must_use] -pub(crate) fn getuid() -> Uid { - unsafe { - let uid = c::getuid(); - Uid::from_raw(uid) - } -} - -#[cfg(not(target_os = "wasi"))] -#[inline] -#[must_use] -pub(crate) fn geteuid() -> Uid { - unsafe { - let uid = c::geteuid(); - Uid::from_raw(uid) - } -} - -#[cfg(not(target_os = "wasi"))] -#[inline] -#[must_use] -pub(crate) fn getgid() -> Gid { - unsafe { - let gid = c::getgid(); - Gid::from_raw(gid) - } -} - -#[cfg(not(target_os = "wasi"))] -#[inline] -#[must_use] -pub(crate) fn getegid() -> Gid { - unsafe { - let gid = c::getegid(); - Gid::from_raw(gid) - } -} diff --git a/vendor/rustix/src/backend/libc/winsock_c.rs b/vendor/rustix/src/backend/libc/winsock_c.rs deleted file mode 100644 index ee2704a..0000000 --- a/vendor/rustix/src/backend/libc/winsock_c.rs +++ /dev/null @@ -1,59 +0,0 @@ -//! Adapt the Winsock API to resemble a POSIX-style libc API. - -#![allow(unused_imports)] -#![allow(non_camel_case_types)] -#![allow(dead_code)] - -use windows_sys::Win32::Networking::WinSock; - -// Define the basic C types. With Rust 1.64, we can use these from `core::ffi`. -pub(crate) type c_schar = i8; -pub(crate) type c_uchar = u8; -pub(crate) type c_short = i16; -pub(crate) type c_ushort = u16; -pub(crate) type c_int = i32; -pub(crate) type c_uint = u32; -pub(crate) type c_longlong = i64; -pub(crate) type c_ulonglong = u64; -pub(crate) type ssize_t = isize; -pub(crate) type c_char = i8; -pub(crate) type c_long = i32; -pub(crate) type c_ulong = u32; -pub(crate) use core::ffi::c_void; - -// windows-sys declares these constants as u16. For better compatibility -// with Unix-family APIs, redeclare them as u32. -pub(crate) const AF_INET: i32 = WinSock::AF_INET as _; -pub(crate) const AF_INET6: i32 = WinSock::AF_INET6 as _; -pub(crate) const AF_UNSPEC: i32 = WinSock::AF_UNSPEC as _; - -// Include the contents of `WinSock`, renaming as needed to match POSIX. -// -// Use `WSA_E_CANCELLED` for `ECANCELED` instead of `WSAECANCELLED`, because -// `WSAECANCELLED` will be removed in the future. -// <https://docs.microsoft.com/en-us/windows/win32/api/ws2spi/nc-ws2spi-lpnsplookupserviceend#remarks> -pub(crate) use WinSock::{ - closesocket as close, ioctlsocket as ioctl, WSAPoll as poll, ADDRESS_FAMILY as sa_family_t, - ADDRINFOA as addrinfo, IN6_ADDR as in6_addr, IN_ADDR as in_addr, IPV6_MREQ as ipv6_mreq, - IP_MREQ as ip_mreq, LINGER as linger, SD_BOTH as SHUT_RDWR, SD_RECEIVE as SHUT_RD, - SD_SEND as SHUT_WR, SOCKADDR as sockaddr, SOCKADDR_IN as sockaddr_in, - SOCKADDR_IN6 as sockaddr_in6, SOCKADDR_STORAGE as sockaddr_storage, WSAEACCES as EACCES, - WSAEADDRINUSE as EADDRINUSE, WSAEADDRNOTAVAIL as EADDRNOTAVAIL, - WSAEAFNOSUPPORT as EAFNOSUPPORT, WSAEALREADY as EALREADY, WSAEBADF as EBADF, - WSAECONNABORTED as ECONNABORTED, WSAECONNREFUSED as ECONNREFUSED, WSAECONNRESET as ECONNRESET, - WSAEDESTADDRREQ as EDESTADDRREQ, WSAEDISCON as EDISCON, WSAEDQUOT as EDQUOT, - WSAEFAULT as EFAULT, WSAEHOSTDOWN as EHOSTDOWN, WSAEHOSTUNREACH as EHOSTUNREACH, - WSAEINPROGRESS as EINPROGRESS, WSAEINTR as EINTR, WSAEINVAL as EINVAL, - WSAEINVALIDPROCTABLE as EINVALIDPROCTABLE, WSAEINVALIDPROVIDER as EINVALIDPROVIDER, - WSAEISCONN as EISCONN, WSAELOOP as ELOOP, WSAEMFILE as EMFILE, WSAEMSGSIZE as EMSGSIZE, - WSAENAMETOOLONG as ENAMETOOLONG, WSAENETDOWN as ENETDOWN, WSAENETRESET as ENETRESET, - WSAENETUNREACH as ENETUNREACH, WSAENOBUFS as ENOBUFS, WSAENOMORE as ENOMORE, - WSAENOPROTOOPT as ENOPROTOOPT, WSAENOTCONN as ENOTCONN, WSAENOTEMPTY as ENOTEMPTY, - WSAENOTSOCK as ENOTSOCK, WSAEOPNOTSUPP as EOPNOTSUPP, WSAEPFNOSUPPORT as EPFNOSUPPORT, - WSAEPROCLIM as EPROCLIM, WSAEPROTONOSUPPORT as EPROTONOSUPPORT, WSAEPROTOTYPE as EPROTOTYPE, - WSAEPROVIDERFAILEDINIT as EPROVIDERFAILEDINIT, WSAEREFUSED as EREFUSED, WSAEREMOTE as EREMOTE, - WSAESHUTDOWN as ESHUTDOWN, WSAESOCKTNOSUPPORT as ESOCKTNOSUPPORT, WSAESTALE as ESTALE, - WSAETIMEDOUT as ETIMEDOUT, WSAETOOMANYREFS as ETOOMANYREFS, WSAEUSERS as EUSERS, - WSAEWOULDBLOCK as EWOULDBLOCK, WSAEWOULDBLOCK as EAGAIN, WSAPOLLFD as pollfd, - WSA_E_CANCELLED as ECANCELED, *, -}; diff --git a/vendor/rustix/src/backend/linux_raw/arch/aarch64.rs b/vendor/rustix/src/backend/linux_raw/arch/aarch64.rs deleted file mode 100644 index d4cf247..0000000 --- a/vendor/rustix/src/backend/linux_raw/arch/aarch64.rs +++ /dev/null @@ -1,268 +0,0 @@ -//! aarch64 Linux system calls. - -use crate::backend::reg::{ - ArgReg, FromAsm, RetReg, SyscallNumber, ToAsm, A0, A1, A2, A3, A4, A5, R0, -}; -use core::arch::asm; - -#[cfg(target_pointer_width = "32")] -compile_error!("arm64-ilp32 is not supported yet"); - -#[inline] -pub(in crate::backend) unsafe fn syscall0_readonly(nr: SyscallNumber<'_>) -> RetReg<R0> { - let r0; - asm!( - "svc 0", - in("x8") nr.to_asm(), - lateout("x0") r0, - options(nostack, preserves_flags, readonly) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall1(nr: SyscallNumber<'_>, a0: ArgReg<'_, A0>) -> RetReg<R0> { - let r0; - asm!( - "svc 0", - in("x8") nr.to_asm(), - inlateout("x0") a0.to_asm() => r0, - options(nostack, preserves_flags) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall1_readonly( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, -) -> RetReg<R0> { - let r0; - asm!( - "svc 0", - in("x8") nr.to_asm(), - inlateout("x0") a0.to_asm() => r0, - options(nostack, preserves_flags, readonly) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall1_noreturn(nr: SyscallNumber<'_>, a0: ArgReg<'_, A0>) -> ! { - asm!( - "svc 0", - in("x8") nr.to_asm(), - in("x0") a0.to_asm(), - options(nostack, noreturn) - ) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall2( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, -) -> RetReg<R0> { - let r0; - asm!( - "svc 0", - in("x8") nr.to_asm(), - inlateout("x0") a0.to_asm() => r0, - in("x1") a1.to_asm(), - options(nostack, preserves_flags) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall2_readonly( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, -) -> RetReg<R0> { - let r0; - asm!( - "svc 0", - in("x8") nr.to_asm(), - inlateout("x0") a0.to_asm() => r0, - in("x1") a1.to_asm(), - options(nostack, preserves_flags, readonly) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall3( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, -) -> RetReg<R0> { - let r0; - asm!( - "svc 0", - in("x8") nr.to_asm(), - inlateout("x0") a0.to_asm() => r0, - in("x1") a1.to_asm(), - in("x2") a2.to_asm(), - options(nostack, preserves_flags) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall3_readonly( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, -) -> RetReg<R0> { - let r0; - asm!( - "svc 0", - in("x8") nr.to_asm(), - inlateout("x0") a0.to_asm() => r0, - in("x1") a1.to_asm(), - in("x2") a2.to_asm(), - options(nostack, preserves_flags, readonly) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall4( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, - a3: ArgReg<'_, A3>, -) -> RetReg<R0> { - let r0; - asm!( - "svc 0", - in("x8") nr.to_asm(), - inlateout("x0") a0.to_asm() => r0, - in("x1") a1.to_asm(), - in("x2") a2.to_asm(), - in("x3") a3.to_asm(), - options(nostack, preserves_flags) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall4_readonly( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, - a3: ArgReg<'_, A3>, -) -> RetReg<R0> { - let r0; - asm!( - "svc 0", - in("x8") nr.to_asm(), - inlateout("x0") a0.to_asm() => r0, - in("x1") a1.to_asm(), - in("x2") a2.to_asm(), - in("x3") a3.to_asm(), - options(nostack, preserves_flags, readonly) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall5( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, - a3: ArgReg<'_, A3>, - a4: ArgReg<'_, A4>, -) -> RetReg<R0> { - let r0; - asm!( - "svc 0", - in("x8") nr.to_asm(), - inlateout("x0") a0.to_asm() => r0, - in("x1") a1.to_asm(), - in("x2") a2.to_asm(), - in("x3") a3.to_asm(), - in("x4") a4.to_asm(), - options(nostack, preserves_flags) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall5_readonly( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, - a3: ArgReg<'_, A3>, - a4: ArgReg<'_, A4>, -) -> RetReg<R0> { - let r0; - asm!( - "svc 0", - in("x8") nr.to_asm(), - inlateout("x0") a0.to_asm() => r0, - in("x1") a1.to_asm(), - in("x2") a2.to_asm(), - in("x3") a3.to_asm(), - in("x4") a4.to_asm(), - options(nostack, preserves_flags, readonly) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall6( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, - a3: ArgReg<'_, A3>, - a4: ArgReg<'_, A4>, - a5: ArgReg<'_, A5>, -) -> RetReg<R0> { - let r0; - asm!( - "svc 0", - in("x8") nr.to_asm(), - inlateout("x0") a0.to_asm() => r0, - in("x1") a1.to_asm(), - in("x2") a2.to_asm(), - in("x3") a3.to_asm(), - in("x4") a4.to_asm(), - in("x5") a5.to_asm(), - options(nostack, preserves_flags) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall6_readonly( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, - a3: ArgReg<'_, A3>, - a4: ArgReg<'_, A4>, - a5: ArgReg<'_, A5>, -) -> RetReg<R0> { - let r0; - asm!( - "svc 0", - in("x8") nr.to_asm(), - inlateout("x0") a0.to_asm() => r0, - in("x1") a1.to_asm(), - in("x2") a2.to_asm(), - in("x3") a3.to_asm(), - in("x4") a4.to_asm(), - in("x5") a5.to_asm(), - options(nostack, preserves_flags, readonly) - ); - FromAsm::from_asm(r0) -} diff --git a/vendor/rustix/src/backend/linux_raw/arch/arm.rs b/vendor/rustix/src/backend/linux_raw/arch/arm.rs deleted file mode 100644 index 77c1f82..0000000 --- a/vendor/rustix/src/backend/linux_raw/arch/arm.rs +++ /dev/null @@ -1,265 +0,0 @@ -//! arm Linux system calls. - -use crate::backend::reg::{ - ArgReg, FromAsm, RetReg, SyscallNumber, ToAsm, A0, A1, A2, A3, A4, A5, R0, -}; -use core::arch::asm; - -#[inline] -pub(in crate::backend) unsafe fn syscall0_readonly(nr: SyscallNumber<'_>) -> RetReg<R0> { - let r0; - asm!( - "svc 0", - in("r7") nr.to_asm(), - lateout("r0") r0, - options(nostack, preserves_flags, readonly) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall1(nr: SyscallNumber<'_>, a0: ArgReg<'_, A0>) -> RetReg<R0> { - let r0; - asm!( - "svc 0", - in("r7") nr.to_asm(), - inlateout("r0") a0.to_asm() => r0, - options(nostack, preserves_flags) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall1_readonly( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, -) -> RetReg<R0> { - let r0; - asm!( - "svc 0", - in("r7") nr.to_asm(), - inlateout("r0") a0.to_asm() => r0, - options(nostack, preserves_flags, readonly) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall1_noreturn(nr: SyscallNumber<'_>, a0: ArgReg<'_, A0>) -> ! { - asm!( - "svc 0", - in("r7") nr.to_asm(), - in("r0") a0.to_asm(), - options(nostack, noreturn) - ) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall2( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, -) -> RetReg<R0> { - let r0; - asm!( - "svc 0", - in("r7") nr.to_asm(), - inlateout("r0") a0.to_asm() => r0, - in("r1") a1.to_asm(), - options(nostack, preserves_flags) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall2_readonly( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, -) -> RetReg<R0> { - let r0; - asm!( - "svc 0", - in("r7") nr.to_asm(), - inlateout("r0") a0.to_asm() => r0, - in("r1") a1.to_asm(), - options(nostack, preserves_flags, readonly) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall3( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, -) -> RetReg<R0> { - let r0; - asm!( - "svc 0", - in("r7") nr.to_asm(), - inlateout("r0") a0.to_asm() => r0, - in("r1") a1.to_asm(), - in("r2") a2.to_asm(), - options(nostack, preserves_flags) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall3_readonly( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, -) -> RetReg<R0> { - let r0; - asm!( - "svc 0", - in("r7") nr.to_asm(), - inlateout("r0") a0.to_asm() => r0, - in("r1") a1.to_asm(), - in("r2") a2.to_asm(), - options(nostack, preserves_flags, readonly) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall4( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, - a3: ArgReg<'_, A3>, -) -> RetReg<R0> { - let r0; - asm!( - "svc 0", - in("r7") nr.to_asm(), - inlateout("r0") a0.to_asm() => r0, - in("r1") a1.to_asm(), - in("r2") a2.to_asm(), - in("r3") a3.to_asm(), - options(nostack, preserves_flags) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall4_readonly( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, - a3: ArgReg<'_, A3>, -) -> RetReg<R0> { - let r0; - asm!( - "svc 0", - in("r7") nr.to_asm(), - inlateout("r0") a0.to_asm() => r0, - in("r1") a1.to_asm(), - in("r2") a2.to_asm(), - in("r3") a3.to_asm(), - options(nostack, preserves_flags, readonly) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall5( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, - a3: ArgReg<'_, A3>, - a4: ArgReg<'_, A4>, -) -> RetReg<R0> { - let r0; - asm!( - "svc 0", - in("r7") nr.to_asm(), - inlateout("r0") a0.to_asm() => r0, - in("r1") a1.to_asm(), - in("r2") a2.to_asm(), - in("r3") a3.to_asm(), - in("r4") a4.to_asm(), - options(nostack, preserves_flags) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall5_readonly( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, - a3: ArgReg<'_, A3>, - a4: ArgReg<'_, A4>, -) -> RetReg<R0> { - let r0; - asm!( - "svc 0", - in("r7") nr.to_asm(), - inlateout("r0") a0.to_asm() => r0, - in("r1") a1.to_asm(), - in("r2") a2.to_asm(), - in("r3") a3.to_asm(), - in("r4") a4.to_asm(), - options(nostack, preserves_flags, readonly) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall6( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, - a3: ArgReg<'_, A3>, - a4: ArgReg<'_, A4>, - a5: ArgReg<'_, A5>, -) -> RetReg<R0> { - let r0; - asm!( - "svc 0", - in("r7") nr.to_asm(), - inlateout("r0") a0.to_asm() => r0, - in("r1") a1.to_asm(), - in("r2") a2.to_asm(), - in("r3") a3.to_asm(), - in("r4") a4.to_asm(), - in("r5") a5.to_asm(), - options(nostack, preserves_flags) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall6_readonly( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, - a3: ArgReg<'_, A3>, - a4: ArgReg<'_, A4>, - a5: ArgReg<'_, A5>, -) -> RetReg<R0> { - let r0; - asm!( - "svc 0", - in("r7") nr.to_asm(), - inlateout("r0") a0.to_asm() => r0, - in("r1") a1.to_asm(), - in("r2") a2.to_asm(), - in("r3") a3.to_asm(), - in("r4") a4.to_asm(), - in("r5") a5.to_asm(), - options(nostack, preserves_flags, readonly) - ); - FromAsm::from_asm(r0) -} diff --git a/vendor/rustix/src/backend/linux_raw/arch/mips.rs b/vendor/rustix/src/backend/linux_raw/arch/mips.rs deleted file mode 100644 index 37932e0..0000000 --- a/vendor/rustix/src/backend/linux_raw/arch/mips.rs +++ /dev/null @@ -1,543 +0,0 @@ -//! mipsel Linux system calls. -//! -//! On mipsel, Linux indicates success or failure using `$a3` rather -//! than by returning a negative error code as most other architectures do. -//! -//! Mips-family platforms have a special calling convention for `__NR_pipe`, -//! however we use `__NR_pipe2` instead to avoid having to implement it. - -use crate::backend::reg::{ - ArgReg, FromAsm, RetReg, SyscallNumber, ToAsm, A0, A1, A2, A3, A4, A5, A6, R0, -}; -use core::arch::asm; - -#[inline] -pub(in crate::backend) unsafe fn syscall0_readonly(nr: SyscallNumber) -> RetReg<R0> { - let x0; - let err: usize; - asm!( - "syscall", - inlateout("$2" /*$v0*/) nr.to_asm() => x0, - lateout("$7" /*$a3*/) err, - lateout("$8" /*$t0*/) _, - lateout("$9" /*$t1*/) _, - lateout("$10" /*$t2*/) _, - lateout("$11" /*$t3*/) _, - lateout("$12" /*$t4*/) _, - lateout("$13" /*$t5*/) _, - lateout("$14" /*$t6*/) _, - lateout("$15" /*$t7*/) _, - lateout("$24" /*$t8*/) _, - lateout("$25" /*$t9*/) _, - options(nostack, preserves_flags, readonly) - ); - FromAsm::from_asm(if err != 0 { - (x0 as usize).wrapping_neg() as *mut _ - } else { - x0 - }) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall1(nr: SyscallNumber<'_>, a0: ArgReg<'_, A0>) -> RetReg<R0> { - let x0; - let err: usize; - asm!( - "syscall", - inlateout("$2" /*$v0*/) nr.to_asm() => x0, - in("$4" /*$a0*/) a0.to_asm(), - lateout("$7" /*$a3*/) err, - lateout("$8" /*$t0*/) _, - lateout("$9" /*$t1*/) _, - lateout("$10" /*$t2*/) _, - lateout("$11" /*$t3*/) _, - lateout("$12" /*$t4*/) _, - lateout("$13" /*$t5*/) _, - lateout("$14" /*$t6*/) _, - lateout("$15" /*$t7*/) _, - lateout("$24" /*$t8*/) _, - lateout("$25" /*$t9*/) _, - options(nostack, preserves_flags) - ); - FromAsm::from_asm(if err != 0 { - (x0 as usize).wrapping_neg() as *mut _ - } else { - x0 - }) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall1_readonly( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, -) -> RetReg<R0> { - let x0; - let err: usize; - asm!( - "syscall", - inlateout("$2" /*$v0*/) nr.to_asm() => x0, - in("$4" /*$a0*/) a0.to_asm(), - lateout("$7" /*$a3*/) err, - lateout("$8" /*$t0*/) _, - lateout("$9" /*$t1*/) _, - lateout("$10" /*$t2*/) _, - lateout("$11" /*$t3*/) _, - lateout("$12" /*$t4*/) _, - lateout("$13" /*$t5*/) _, - lateout("$14" /*$t6*/) _, - lateout("$15" /*$t7*/) _, - lateout("$24" /*$t8*/) _, - lateout("$25" /*$t9*/) _, - options(nostack, preserves_flags, readonly) - ); - FromAsm::from_asm(if err != 0 { - (x0 as usize).wrapping_neg() as *mut _ - } else { - x0 - }) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall1_noreturn(nr: SyscallNumber<'_>, a0: ArgReg<'_, A0>) -> ! { - asm!( - "syscall", - in("$2" /*$v0*/) nr.to_asm(), - in("$4" /*$a0*/) a0.to_asm(), - options(nostack, noreturn) - ) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall2( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, -) -> RetReg<R0> { - let x0; - let err: usize; - asm!( - "syscall", - inlateout("$2" /*$v0*/) nr.to_asm() => x0, - in("$4" /*$a0*/) a0.to_asm(), - in("$5" /*$a1*/) a1.to_asm(), - lateout("$7" /*$a3*/) err, - lateout("$8" /*$t0*/) _, - lateout("$9" /*$t1*/) _, - lateout("$10" /*$t2*/) _, - lateout("$11" /*$t3*/) _, - lateout("$12" /*$t4*/) _, - lateout("$13" /*$t5*/) _, - lateout("$14" /*$t6*/) _, - lateout("$15" /*$t7*/) _, - lateout("$24" /*$t8*/) _, - lateout("$25" /*$t9*/) _, - options(nostack, preserves_flags) - ); - FromAsm::from_asm(if err != 0 { - (x0 as usize).wrapping_neg() as *mut _ - } else { - x0 - }) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall2_readonly( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, -) -> RetReg<R0> { - let x0; - let err: usize; - asm!( - "syscall", - inlateout("$2" /*$v0*/) nr.to_asm() => x0, - in("$4" /*$a0*/) a0.to_asm(), - in("$5" /*$a1*/) a1.to_asm(), - lateout("$7" /*$a3*/) err, - lateout("$8" /*$t0*/) _, - lateout("$9" /*$t1*/) _, - lateout("$10" /*$t2*/) _, - lateout("$11" /*$t3*/) _, - lateout("$12" /*$t4*/) _, - lateout("$13" /*$t5*/) _, - lateout("$14" /*$t6*/) _, - lateout("$15" /*$t7*/) _, - lateout("$24" /*$t8*/) _, - lateout("$25" /*$t9*/) _, - options(nostack, preserves_flags, readonly) - ); - FromAsm::from_asm(if err != 0 { - (x0 as usize).wrapping_neg() as *mut _ - } else { - x0 - }) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall3( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, -) -> RetReg<R0> { - let x0; - let err: usize; - asm!( - "syscall", - inlateout("$2" /*$v0*/) nr.to_asm() => x0, - in("$4" /*$a0*/) a0.to_asm(), - in("$5" /*$a1*/) a1.to_asm(), - in("$6" /*$a2*/) a2.to_asm(), - lateout("$7" /*$a3*/) err, - lateout("$8" /*$t0*/) _, - lateout("$9" /*$t1*/) _, - lateout("$10" /*$t2*/) _, - lateout("$11" /*$t3*/) _, - lateout("$12" /*$t4*/) _, - lateout("$13" /*$t5*/) _, - lateout("$14" /*$t6*/) _, - lateout("$15" /*$t7*/) _, - lateout("$24" /*$t8*/) _, - lateout("$25" /*$t9*/) _, - options(nostack, preserves_flags) - ); - FromAsm::from_asm(if err != 0 { - (x0 as usize).wrapping_neg() as *mut _ - } else { - x0 - }) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall3_readonly( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, -) -> RetReg<R0> { - let x0; - let err: usize; - asm!( - "syscall", - inlateout("$2" /*$v0*/) nr.to_asm() => x0, - in("$4" /*$a0*/) a0.to_asm(), - in("$5" /*$a1*/) a1.to_asm(), - in("$6" /*$a2*/) a2.to_asm(), - lateout("$7" /*$a3*/) err, - lateout("$8" /*$t0*/) _, - lateout("$9" /*$t1*/) _, - lateout("$10" /*$t2*/) _, - lateout("$11" /*$t3*/) _, - lateout("$12" /*$t4*/) _, - lateout("$13" /*$t5*/) _, - lateout("$14" /*$t6*/) _, - lateout("$15" /*$t7*/) _, - lateout("$24" /*$t8*/) _, - lateout("$25" /*$t9*/) _, - options(nostack, preserves_flags, readonly) - ); - FromAsm::from_asm(if err != 0 { - (x0 as usize).wrapping_neg() as *mut _ - } else { - x0 - }) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall4( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, - a3: ArgReg<'_, A3>, -) -> RetReg<R0> { - let x0; - let err: usize; - asm!( - "syscall", - inlateout("$2" /*$v0*/) nr.to_asm() => x0, - in("$4" /*$a0*/) a0.to_asm(), - in("$5" /*$a1*/) a1.to_asm(), - in("$6" /*$a2*/) a2.to_asm(), - inlateout("$7" /*$a3*/) a3.to_asm() => err, - lateout("$8" /*$t0*/) _, - lateout("$9" /*$t1*/) _, - lateout("$10" /*$t2*/) _, - lateout("$11" /*$t3*/) _, - lateout("$12" /*$t4*/) _, - lateout("$13" /*$t5*/) _, - lateout("$14" /*$t6*/) _, - lateout("$15" /*$t7*/) _, - lateout("$24" /*$t8*/) _, - lateout("$25" /*$t9*/) _, - options(nostack, preserves_flags) - ); - FromAsm::from_asm(if err != 0 { - (x0 as usize).wrapping_neg() as *mut _ - } else { - x0 - }) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall4_readonly( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, - a3: ArgReg<'_, A3>, -) -> RetReg<R0> { - let x0; - let err: usize; - asm!( - "syscall", - inlateout("$2" /*$v0*/) nr.to_asm() => x0, - in("$4" /*$a0*/) a0.to_asm(), - in("$5" /*$a1*/) a1.to_asm(), - in("$6" /*$a2*/) a2.to_asm(), - inlateout("$7" /*$a3*/) a3.to_asm() => err, - lateout("$8" /*$t0*/) _, - lateout("$9" /*$t1*/) _, - lateout("$10" /*$t2*/) _, - lateout("$11" /*$t3*/) _, - lateout("$12" /*$t4*/) _, - lateout("$13" /*$t5*/) _, - lateout("$14" /*$t6*/) _, - lateout("$15" /*$t7*/) _, - lateout("$24" /*$t8*/) _, - lateout("$25" /*$t9*/) _, - options(nostack, preserves_flags, readonly) - ); - FromAsm::from_asm(if err != 0 { - (x0 as usize).wrapping_neg() as *mut _ - } else { - x0 - }) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall5( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, - a3: ArgReg<'_, A3>, - a4: ArgReg<'_, A4>, -) -> RetReg<R0> { - let x0; - let err: usize; - asm!( - ".set noat", - "subu $sp, 32", - "sw {}, 16($sp)", - "syscall", - "addu $sp, 32", - ".set at", - in(reg) a4.to_asm(), - inlateout("$2" /*$v0*/) nr.to_asm() => x0, - in("$4" /*$a0*/) a0.to_asm(), - in("$5" /*$a1*/) a1.to_asm(), - in("$6" /*$a2*/) a2.to_asm(), - inlateout("$7" /*$a3*/) a3.to_asm() => err, - lateout("$8" /*$t0*/) _, - lateout("$9" /*$t1*/) _, - lateout("$10" /*$t2*/) _, - lateout("$11" /*$t3*/) _, - lateout("$12" /*$t4*/) _, - lateout("$13" /*$t5*/) _, - lateout("$14" /*$t6*/) _, - lateout("$15" /*$t7*/) _, - lateout("$24" /*$t8*/) _, - lateout("$25" /*$t9*/) _, - options(preserves_flags) - ); - FromAsm::from_asm(if err != 0 { - (x0 as usize).wrapping_neg() as *mut _ - } else { - x0 - }) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall5_readonly( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, - a3: ArgReg<'_, A3>, - a4: ArgReg<'_, A4>, -) -> RetReg<R0> { - let x0; - let err: usize; - asm!( - ".set noat", - "subu $sp, 32", - "sw {}, 16($sp)", - "syscall", - "addu $sp, 32", - ".set at", - in(reg) a4.to_asm(), - inlateout("$2" /*$v0*/) nr.to_asm() => x0, - in("$4" /*$a0*/) a0.to_asm(), - in("$5" /*$a1*/) a1.to_asm(), - in("$6" /*$a2*/) a2.to_asm(), - inlateout("$7" /*$a3*/) a3.to_asm() => err, - lateout("$8" /*$t0*/) _, - lateout("$9" /*$t1*/) _, - lateout("$10" /*$t2*/) _, - lateout("$11" /*$t3*/) _, - lateout("$12" /*$t4*/) _, - lateout("$13" /*$t5*/) _, - lateout("$14" /*$t6*/) _, - lateout("$15" /*$t7*/) _, - lateout("$24" /*$t8*/) _, - lateout("$25" /*$t9*/) _, - options(preserves_flags, readonly) - ); - FromAsm::from_asm(if err != 0 { - (x0 as usize).wrapping_neg() as *mut _ - } else { - x0 - }) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall6( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, - a3: ArgReg<'_, A3>, - a4: ArgReg<'_, A4>, - a5: ArgReg<'_, A5>, -) -> RetReg<R0> { - let x0; - let err: usize; - asm!( - ".set noat", - "subu $sp, 32", - "sw {}, 16($sp)", - "sw {}, 20($sp)", - "syscall", - "addu $sp, 32", - ".set at", - in(reg) a4.to_asm(), - in(reg) a5.to_asm(), - inlateout("$2" /*$v0*/) nr.to_asm() => x0, - in("$4" /*$a0*/) a0.to_asm(), - in("$5" /*$a1*/) a1.to_asm(), - in("$6" /*$a2*/) a2.to_asm(), - inlateout("$7" /*$a3*/) a3.to_asm() => err, - lateout("$8" /*$t0*/) _, - lateout("$9" /*$t1*/) _, - lateout("$10" /*$t2*/) _, - lateout("$11" /*$t3*/) _, - lateout("$12" /*$t4*/) _, - lateout("$13" /*$t5*/) _, - lateout("$14" /*$t6*/) _, - lateout("$15" /*$t7*/) _, - lateout("$24" /*$t8*/) _, - lateout("$25" /*$t9*/) _, - options(preserves_flags) - ); - FromAsm::from_asm(if err != 0 { - (x0 as usize).wrapping_neg() as *mut _ - } else { - x0 - }) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall6_readonly( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, - a3: ArgReg<'_, A3>, - a4: ArgReg<'_, A4>, - a5: ArgReg<'_, A5>, -) -> RetReg<R0> { - let x0; - let err: usize; - asm!( - ".set noat", - "subu $sp, 32", - "sw {}, 16($sp)", - "sw {}, 20($sp)", - "syscall", - "addu $sp, 32", - ".set at", - in(reg) a4.to_asm(), - in(reg) a5.to_asm(), - inlateout("$2" /*$v0*/) nr.to_asm() => x0, - in("$4" /*$a0*/) a0.to_asm(), - in("$5" /*$a1*/) a1.to_asm(), - in("$6" /*$a2*/) a2.to_asm(), - inlateout("$7" /*$a3*/) a3.to_asm() => err, - lateout("$8" /*$t0*/) _, - lateout("$9" /*$t1*/) _, - lateout("$10" /*$t2*/) _, - lateout("$11" /*$t3*/) _, - lateout("$12" /*$t4*/) _, - lateout("$13" /*$t5*/) _, - lateout("$14" /*$t6*/) _, - lateout("$15" /*$t7*/) _, - lateout("$24" /*$t8*/) _, - lateout("$25" /*$t9*/) _, - options(preserves_flags, readonly) - ); - FromAsm::from_asm(if err != 0 { - (x0 as usize).wrapping_neg() as *mut _ - } else { - x0 - }) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall7_readonly( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, - a3: ArgReg<'_, A3>, - a4: ArgReg<'_, A4>, - a5: ArgReg<'_, A5>, - a6: ArgReg<'_, A6>, -) -> RetReg<R0> { - let x0; - let err: usize; - asm!( - ".set noat", - "subu $sp, 32", - "sw {}, 16($sp)", - "sw {}, 20($sp)", - "sw {}, 24($sp)", - "syscall", - "addu $sp, 32", - ".set at", - in(reg) a4.to_asm(), - in(reg) a5.to_asm(), - in(reg) a6.to_asm(), - inlateout("$2" /*$v0*/) nr.to_asm() => x0, - in("$4" /*$a0*/) a0.to_asm(), - in("$5" /*$a1*/) a1.to_asm(), - in("$6" /*$a2*/) a2.to_asm(), - inlateout("$7" /*$a3*/) a3.to_asm() => err, - lateout("$8" /*$t0*/) _, - lateout("$9" /*$t1*/) _, - lateout("$10" /*$t2*/) _, - lateout("$11" /*$t3*/) _, - lateout("$12" /*$t4*/) _, - lateout("$13" /*$t5*/) _, - lateout("$14" /*$t6*/) _, - lateout("$15" /*$t7*/) _, - lateout("$24" /*$t8*/) _, - lateout("$25" /*$t9*/) _, - options(preserves_flags, readonly) - ); - FromAsm::from_asm(if err != 0 { - (x0 as usize).wrapping_neg() as *mut _ - } else { - x0 - }) -} diff --git a/vendor/rustix/src/backend/linux_raw/arch/mips32r6.rs b/vendor/rustix/src/backend/linux_raw/arch/mips32r6.rs deleted file mode 100644 index c2d9244..0000000 --- a/vendor/rustix/src/backend/linux_raw/arch/mips32r6.rs +++ /dev/null @@ -1,543 +0,0 @@ -//! mipsisa32r6el Linux system calls. -//! -//! On mipsisa32r6el, Linux indicates success or failure using `$a3` rather -//! than by returning a negative error code as most other architectures do. -//! -//! Mips-family platforms have a special calling convention for `__NR_pipe`, -//! however we use `__NR_pipe2` instead to avoid having to implement it. - -use crate::backend::reg::{ - ArgReg, FromAsm, RetReg, SyscallNumber, ToAsm, A0, A1, A2, A3, A4, A5, A6, R0, -}; -use core::arch::asm; - -#[inline] -pub(in crate::backend) unsafe fn syscall0_readonly(nr: SyscallNumber) -> RetReg<R0> { - let x0; - let err: usize; - asm!( - "syscall", - inlateout("$2" /*$v0*/) nr.to_asm() => x0, - lateout("$7" /*$a3*/) err, - lateout("$8" /*$t0*/) _, - lateout("$9" /*$t1*/) _, - lateout("$10" /*$t2*/) _, - lateout("$11" /*$t3*/) _, - lateout("$12" /*$t4*/) _, - lateout("$13" /*$t5*/) _, - lateout("$14" /*$t6*/) _, - lateout("$15" /*$t7*/) _, - lateout("$24" /*$t8*/) _, - lateout("$25" /*$t9*/) _, - options(nostack, preserves_flags, readonly) - ); - FromAsm::from_asm(if err != 0 { - (x0 as usize).wrapping_neg() as *mut _ - } else { - x0 - }) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall1(nr: SyscallNumber<'_>, a0: ArgReg<'_, A0>) -> RetReg<R0> { - let x0; - let err: usize; - asm!( - "syscall", - inlateout("$2" /*$v0*/) nr.to_asm() => x0, - in("$4" /*$a0*/) a0.to_asm(), - lateout("$7" /*$a3*/) err, - lateout("$8" /*$t0*/) _, - lateout("$9" /*$t1*/) _, - lateout("$10" /*$t2*/) _, - lateout("$11" /*$t3*/) _, - lateout("$12" /*$t4*/) _, - lateout("$13" /*$t5*/) _, - lateout("$14" /*$t6*/) _, - lateout("$15" /*$t7*/) _, - lateout("$24" /*$t8*/) _, - lateout("$25" /*$t9*/) _, - options(nostack, preserves_flags) - ); - FromAsm::from_asm(if err != 0 { - (x0 as usize).wrapping_neg() as *mut _ - } else { - x0 - }) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall1_readonly( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, -) -> RetReg<R0> { - let x0; - let err: usize; - asm!( - "syscall", - inlateout("$2" /*$v0*/) nr.to_asm() => x0, - in("$4" /*$a0*/) a0.to_asm(), - lateout("$7" /*$a3*/) err, - lateout("$8" /*$t0*/) _, - lateout("$9" /*$t1*/) _, - lateout("$10" /*$t2*/) _, - lateout("$11" /*$t3*/) _, - lateout("$12" /*$t4*/) _, - lateout("$13" /*$t5*/) _, - lateout("$14" /*$t6*/) _, - lateout("$15" /*$t7*/) _, - lateout("$24" /*$t8*/) _, - lateout("$25" /*$t9*/) _, - options(nostack, preserves_flags, readonly) - ); - FromAsm::from_asm(if err != 0 { - (x0 as usize).wrapping_neg() as *mut _ - } else { - x0 - }) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall1_noreturn(nr: SyscallNumber<'_>, a0: ArgReg<'_, A0>) -> ! { - asm!( - "syscall", - in("$2" /*$v0*/) nr.to_asm(), - in("$4" /*$a0*/) a0.to_asm(), - options(nostack, noreturn) - ) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall2( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, -) -> RetReg<R0> { - let x0; - let err: usize; - asm!( - "syscall", - inlateout("$2" /*$v0*/) nr.to_asm() => x0, - in("$4" /*$a0*/) a0.to_asm(), - in("$5" /*$a1*/) a1.to_asm(), - lateout("$7" /*$a3*/) err, - lateout("$8" /*$t0*/) _, - lateout("$9" /*$t1*/) _, - lateout("$10" /*$t2*/) _, - lateout("$11" /*$t3*/) _, - lateout("$12" /*$t4*/) _, - lateout("$13" /*$t5*/) _, - lateout("$14" /*$t6*/) _, - lateout("$15" /*$t7*/) _, - lateout("$24" /*$t8*/) _, - lateout("$25" /*$t9*/) _, - options(nostack, preserves_flags) - ); - FromAsm::from_asm(if err != 0 { - (x0 as usize).wrapping_neg() as *mut _ - } else { - x0 - }) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall2_readonly( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, -) -> RetReg<R0> { - let x0; - let err: usize; - asm!( - "syscall", - inlateout("$2" /*$v0*/) nr.to_asm() => x0, - in("$4" /*$a0*/) a0.to_asm(), - in("$5" /*$a1*/) a1.to_asm(), - lateout("$7" /*$a3*/) err, - lateout("$8" /*$t0*/) _, - lateout("$9" /*$t1*/) _, - lateout("$10" /*$t2*/) _, - lateout("$11" /*$t3*/) _, - lateout("$12" /*$t4*/) _, - lateout("$13" /*$t5*/) _, - lateout("$14" /*$t6*/) _, - lateout("$15" /*$t7*/) _, - lateout("$24" /*$t8*/) _, - lateout("$25" /*$t9*/) _, - options(nostack, preserves_flags, readonly) - ); - FromAsm::from_asm(if err != 0 { - (x0 as usize).wrapping_neg() as *mut _ - } else { - x0 - }) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall3( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, -) -> RetReg<R0> { - let x0; - let err: usize; - asm!( - "syscall", - inlateout("$2" /*$v0*/) nr.to_asm() => x0, - in("$4" /*$a0*/) a0.to_asm(), - in("$5" /*$a1*/) a1.to_asm(), - in("$6" /*$a2*/) a2.to_asm(), - lateout("$7" /*$a3*/) err, - lateout("$8" /*$t0*/) _, - lateout("$9" /*$t1*/) _, - lateout("$10" /*$t2*/) _, - lateout("$11" /*$t3*/) _, - lateout("$12" /*$t4*/) _, - lateout("$13" /*$t5*/) _, - lateout("$14" /*$t6*/) _, - lateout("$15" /*$t7*/) _, - lateout("$24" /*$t8*/) _, - lateout("$25" /*$t9*/) _, - options(nostack, preserves_flags) - ); - FromAsm::from_asm(if err != 0 { - (x0 as usize).wrapping_neg() as *mut _ - } else { - x0 - }) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall3_readonly( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, -) -> RetReg<R0> { - let x0; - let err: usize; - asm!( - "syscall", - inlateout("$2" /*$v0*/) nr.to_asm() => x0, - in("$4" /*$a0*/) a0.to_asm(), - in("$5" /*$a1*/) a1.to_asm(), - in("$6" /*$a2*/) a2.to_asm(), - lateout("$7" /*$a3*/) err, - lateout("$8" /*$t0*/) _, - lateout("$9" /*$t1*/) _, - lateout("$10" /*$t2*/) _, - lateout("$11" /*$t3*/) _, - lateout("$12" /*$t4*/) _, - lateout("$13" /*$t5*/) _, - lateout("$14" /*$t6*/) _, - lateout("$15" /*$t7*/) _, - lateout("$24" /*$t8*/) _, - lateout("$25" /*$t9*/) _, - options(nostack, preserves_flags, readonly) - ); - FromAsm::from_asm(if err != 0 { - (x0 as usize).wrapping_neg() as *mut _ - } else { - x0 - }) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall4( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, - a3: ArgReg<'_, A3>, -) -> RetReg<R0> { - let x0; - let err: usize; - asm!( - "syscall", - inlateout("$2" /*$v0*/) nr.to_asm() => x0, - in("$4" /*$a0*/) a0.to_asm(), - in("$5" /*$a1*/) a1.to_asm(), - in("$6" /*$a2*/) a2.to_asm(), - inlateout("$7" /*$a3*/) a3.to_asm() => err, - lateout("$8" /*$t0*/) _, - lateout("$9" /*$t1*/) _, - lateout("$10" /*$t2*/) _, - lateout("$11" /*$t3*/) _, - lateout("$12" /*$t4*/) _, - lateout("$13" /*$t5*/) _, - lateout("$14" /*$t6*/) _, - lateout("$15" /*$t7*/) _, - lateout("$24" /*$t8*/) _, - lateout("$25" /*$t9*/) _, - options(nostack, preserves_flags) - ); - FromAsm::from_asm(if err != 0 { - (x0 as usize).wrapping_neg() as *mut _ - } else { - x0 - }) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall4_readonly( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, - a3: ArgReg<'_, A3>, -) -> RetReg<R0> { - let x0; - let err: usize; - asm!( - "syscall", - inlateout("$2" /*$v0*/) nr.to_asm() => x0, - in("$4" /*$a0*/) a0.to_asm(), - in("$5" /*$a1*/) a1.to_asm(), - in("$6" /*$a2*/) a2.to_asm(), - inlateout("$7" /*$a3*/) a3.to_asm() => err, - lateout("$8" /*$t0*/) _, - lateout("$9" /*$t1*/) _, - lateout("$10" /*$t2*/) _, - lateout("$11" /*$t3*/) _, - lateout("$12" /*$t4*/) _, - lateout("$13" /*$t5*/) _, - lateout("$14" /*$t6*/) _, - lateout("$15" /*$t7*/) _, - lateout("$24" /*$t8*/) _, - lateout("$25" /*$t9*/) _, - options(nostack, preserves_flags, readonly) - ); - FromAsm::from_asm(if err != 0 { - (x0 as usize).wrapping_neg() as *mut _ - } else { - x0 - }) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall5( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, - a3: ArgReg<'_, A3>, - a4: ArgReg<'_, A4>, -) -> RetReg<R0> { - let x0; - let err: usize; - asm!( - ".set noat", - "subu $sp, 32", - "sw {}, 16($sp)", - "syscall", - "addu $sp, 32", - ".set at", - in(reg) a4.to_asm(), - inlateout("$2" /*$v0*/) nr.to_asm() => x0, - in("$4" /*$a0*/) a0.to_asm(), - in("$5" /*$a1*/) a1.to_asm(), - in("$6" /*$a2*/) a2.to_asm(), - inlateout("$7" /*$a3*/) a3.to_asm() => err, - lateout("$8" /*$t0*/) _, - lateout("$9" /*$t1*/) _, - lateout("$10" /*$t2*/) _, - lateout("$11" /*$t3*/) _, - lateout("$12" /*$t4*/) _, - lateout("$13" /*$t5*/) _, - lateout("$14" /*$t6*/) _, - lateout("$15" /*$t7*/) _, - lateout("$24" /*$t8*/) _, - lateout("$25" /*$t9*/) _, - options(preserves_flags) - ); - FromAsm::from_asm(if err != 0 { - (x0 as usize).wrapping_neg() as *mut _ - } else { - x0 - }) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall5_readonly( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, - a3: ArgReg<'_, A3>, - a4: ArgReg<'_, A4>, -) -> RetReg<R0> { - let x0; - let err: usize; - asm!( - ".set noat", - "subu $sp, 32", - "sw {}, 16($sp)", - "syscall", - "addu $sp, 32", - ".set at", - in(reg) a4.to_asm(), - inlateout("$2" /*$v0*/) nr.to_asm() => x0, - in("$4" /*$a0*/) a0.to_asm(), - in("$5" /*$a1*/) a1.to_asm(), - in("$6" /*$a2*/) a2.to_asm(), - inlateout("$7" /*$a3*/) a3.to_asm() => err, - lateout("$8" /*$t0*/) _, - lateout("$9" /*$t1*/) _, - lateout("$10" /*$t2*/) _, - lateout("$11" /*$t3*/) _, - lateout("$12" /*$t4*/) _, - lateout("$13" /*$t5*/) _, - lateout("$14" /*$t6*/) _, - lateout("$15" /*$t7*/) _, - lateout("$24" /*$t8*/) _, - lateout("$25" /*$t9*/) _, - options(preserves_flags, readonly) - ); - FromAsm::from_asm(if err != 0 { - (x0 as usize).wrapping_neg() as *mut _ - } else { - x0 - }) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall6( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, - a3: ArgReg<'_, A3>, - a4: ArgReg<'_, A4>, - a5: ArgReg<'_, A5>, -) -> RetReg<R0> { - let x0; - let err: usize; - asm!( - ".set noat", - "subu $sp, 32", - "sw {}, 16($sp)", - "sw {}, 20($sp)", - "syscall", - "addu $sp, 32", - ".set at", - in(reg) a4.to_asm(), - in(reg) a5.to_asm(), - inlateout("$2" /*$v0*/) nr.to_asm() => x0, - in("$4" /*$a0*/) a0.to_asm(), - in("$5" /*$a1*/) a1.to_asm(), - in("$6" /*$a2*/) a2.to_asm(), - inlateout("$7" /*$a3*/) a3.to_asm() => err, - lateout("$8" /*$t0*/) _, - lateout("$9" /*$t1*/) _, - lateout("$10" /*$t2*/) _, - lateout("$11" /*$t3*/) _, - lateout("$12" /*$t4*/) _, - lateout("$13" /*$t5*/) _, - lateout("$14" /*$t6*/) _, - lateout("$15" /*$t7*/) _, - lateout("$24" /*$t8*/) _, - lateout("$25" /*$t9*/) _, - options(preserves_flags) - ); - FromAsm::from_asm(if err != 0 { - (x0 as usize).wrapping_neg() as *mut _ - } else { - x0 - }) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall6_readonly( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, - a3: ArgReg<'_, A3>, - a4: ArgReg<'_, A4>, - a5: ArgReg<'_, A5>, -) -> RetReg<R0> { - let x0; - let err: usize; - asm!( - ".set noat", - "subu $sp, 32", - "sw {}, 16($sp)", - "sw {}, 20($sp)", - "syscall", - "addu $sp, 32", - ".set at", - in(reg) a4.to_asm(), - in(reg) a5.to_asm(), - inlateout("$2" /*$v0*/) nr.to_asm() => x0, - in("$4" /*$a0*/) a0.to_asm(), - in("$5" /*$a1*/) a1.to_asm(), - in("$6" /*$a2*/) a2.to_asm(), - inlateout("$7" /*$a3*/) a3.to_asm() => err, - lateout("$8" /*$t0*/) _, - lateout("$9" /*$t1*/) _, - lateout("$10" /*$t2*/) _, - lateout("$11" /*$t3*/) _, - lateout("$12" /*$t4*/) _, - lateout("$13" /*$t5*/) _, - lateout("$14" /*$t6*/) _, - lateout("$15" /*$t7*/) _, - lateout("$24" /*$t8*/) _, - lateout("$25" /*$t9*/) _, - options(preserves_flags, readonly) - ); - FromAsm::from_asm(if err != 0 { - (x0 as usize).wrapping_neg() as *mut _ - } else { - x0 - }) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall7_readonly( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, - a3: ArgReg<'_, A3>, - a4: ArgReg<'_, A4>, - a5: ArgReg<'_, A5>, - a6: ArgReg<'_, A6>, -) -> RetReg<R0> { - let x0; - let err: usize; - asm!( - ".set noat", - "subu $sp, 32", - "sw {}, 16($sp)", - "sw {}, 20($sp)", - "sw {}, 24($sp)", - "syscall", - "addu $sp, 32", - ".set at", - in(reg) a4.to_asm(), - in(reg) a5.to_asm(), - in(reg) a6.to_asm(), - inlateout("$2" /*$v0*/) nr.to_asm() => x0, - in("$4" /*$a0*/) a0.to_asm(), - in("$5" /*$a1*/) a1.to_asm(), - in("$6" /*$a2*/) a2.to_asm(), - inlateout("$7" /*$a3*/) a3.to_asm() => err, - lateout("$8" /*$t0*/) _, - lateout("$9" /*$t1*/) _, - lateout("$10" /*$t2*/) _, - lateout("$11" /*$t3*/) _, - lateout("$12" /*$t4*/) _, - lateout("$13" /*$t5*/) _, - lateout("$14" /*$t6*/) _, - lateout("$15" /*$t7*/) _, - lateout("$24" /*$t8*/) _, - lateout("$25" /*$t9*/) _, - options(preserves_flags, readonly) - ); - FromAsm::from_asm(if err != 0 { - (x0 as usize).wrapping_neg() as *mut _ - } else { - x0 - }) -} diff --git a/vendor/rustix/src/backend/linux_raw/arch/mips64.rs b/vendor/rustix/src/backend/linux_raw/arch/mips64.rs deleted file mode 100644 index 244daf3..0000000 --- a/vendor/rustix/src/backend/linux_raw/arch/mips64.rs +++ /dev/null @@ -1,466 +0,0 @@ -//! mips64el Linux system calls. -//! -//! On mips64el, Linux indicates success or failure using `$a3` (`$7`) rather -//! than by returning a negative error code as most other architectures do. -//! -//! Mips-family platforms have a special calling convention for `__NR_pipe`, -//! however we use `__NR_pipe2` instead to avoid having to implement it. - -use crate::backend::reg::{ - ArgReg, FromAsm, RetReg, SyscallNumber, ToAsm, A0, A1, A2, A3, A4, A5, R0, -}; -use core::arch::asm; - -#[inline] -pub(in crate::backend) unsafe fn syscall0_readonly(nr: SyscallNumber) -> RetReg<R0> { - let x0; - let err: usize; - asm!( - "syscall", - inlateout("$2" /*$v0*/) nr.to_asm() => x0, - lateout("$7" /*$a3*/) err, - lateout("$8" /*$a4*/) _, - lateout("$9" /*$a5*/) _, - lateout("$10" /*$a6*/) _, - lateout("$11" /*$a7*/) _, - lateout("$12" /*$t0*/) _, - lateout("$13" /*$t1*/) _, - lateout("$14" /*$t2*/) _, - lateout("$15" /*$t3*/) _, - lateout("$24" /*$t8*/) _, - lateout("$25" /*$t9*/) _, - options(nostack, preserves_flags, readonly) - ); - FromAsm::from_asm(if err != 0 { - (x0 as usize).wrapping_neg() as *mut _ - } else { - x0 - }) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall1(nr: SyscallNumber<'_>, a0: ArgReg<'_, A0>) -> RetReg<R0> { - let x0; - let err: usize; - asm!( - "syscall", - inlateout("$2" /*$v0*/) nr.to_asm() => x0, - in("$4" /*$a0*/) a0.to_asm(), - lateout("$7" /*$a3*/) err, - lateout("$8" /*$a4*/) _, - lateout("$9" /*$a5*/) _, - lateout("$10" /*$a6*/) _, - lateout("$11" /*$a7*/) _, - lateout("$12" /*$t0*/) _, - lateout("$13" /*$t1*/) _, - lateout("$14" /*$t2*/) _, - lateout("$15" /*$t3*/) _, - lateout("$24" /*$t8*/) _, - lateout("$25" /*$t9*/) _, - options(nostack, preserves_flags) - ); - FromAsm::from_asm(if err != 0 { - (x0 as usize).wrapping_neg() as *mut _ - } else { - x0 - }) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall1_readonly( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, -) -> RetReg<R0> { - let x0; - let err: usize; - asm!( - "syscall", - inlateout("$2" /*$v0*/) nr.to_asm() => x0, - in("$4" /*$a0*/) a0.to_asm(), - lateout("$7" /*$a3*/) err, - lateout("$8" /*$a4*/) _, - lateout("$9" /*$a5*/) _, - lateout("$10" /*$a6*/) _, - lateout("$11" /*$a7*/) _, - lateout("$12" /*$t0*/) _, - lateout("$13" /*$t1*/) _, - lateout("$14" /*$t2*/) _, - lateout("$15" /*$t3*/) _, - lateout("$24" /*$t8*/) _, - lateout("$25" /*$t9*/) _, - options(nostack, preserves_flags, readonly) - ); - FromAsm::from_asm(if err != 0 { - (x0 as usize).wrapping_neg() as *mut _ - } else { - x0 - }) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall1_noreturn(nr: SyscallNumber<'_>, a0: ArgReg<'_, A0>) -> ! { - asm!( - "syscall", - in("$2" /*$v0*/) nr.to_asm(), - in("$4" /*$a0*/) a0.to_asm(), - options(nostack, noreturn) - ) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall2( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, -) -> RetReg<R0> { - let x0; - let err: usize; - asm!( - "syscall", - inlateout("$2" /*$v0*/) nr.to_asm() => x0, - in("$4" /*$a0*/) a0.to_asm(), - in("$5" /*$a1*/) a1.to_asm(), - lateout("$7" /*$a3*/) err, - lateout("$8" /*$a4*/) _, - lateout("$9" /*$a5*/) _, - lateout("$10" /*$a6*/) _, - lateout("$11" /*$a7*/) _, - lateout("$12" /*$t0*/) _, - lateout("$13" /*$t1*/) _, - lateout("$14" /*$t2*/) _, - lateout("$15" /*$t3*/) _, - lateout("$24" /*$t8*/) _, - lateout("$25" /*$t9*/) _, - options(nostack, preserves_flags) - ); - FromAsm::from_asm(if err != 0 { - (x0 as usize).wrapping_neg() as *mut _ - } else { - x0 - }) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall2_readonly( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, -) -> RetReg<R0> { - let x0; - let err: usize; - asm!( - "syscall", - inlateout("$2" /*$v0*/) nr.to_asm() => x0, - in("$4" /*$a0*/) a0.to_asm(), - in("$5" /*$a1*/) a1.to_asm(), - lateout("$7" /*$a3*/) err, - lateout("$8" /*$a4*/) _, - lateout("$9" /*$a5*/) _, - lateout("$10" /*$a6*/) _, - lateout("$11" /*$a7*/) _, - lateout("$12" /*$t0*/) _, - lateout("$13" /*$t1*/) _, - lateout("$14" /*$t2*/) _, - lateout("$15" /*$t3*/) _, - lateout("$24" /*$t8*/) _, - lateout("$25" /*$t9*/) _, - options(nostack, preserves_flags, readonly) - ); - FromAsm::from_asm(if err != 0 { - (x0 as usize).wrapping_neg() as *mut _ - } else { - x0 - }) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall3( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, -) -> RetReg<R0> { - let x0; - let err: usize; - asm!( - "syscall", - inlateout("$2" /*$v0*/) nr.to_asm() => x0, - in("$4" /*$a0*/) a0.to_asm(), - in("$5" /*$a1*/) a1.to_asm(), - in("$6" /*$a2*/) a2.to_asm(), - lateout("$7" /*$a3*/) err, - lateout("$8" /*$a4*/) _, - lateout("$9" /*$a5*/) _, - lateout("$10" /*$a6*/) _, - lateout("$11" /*$a7*/) _, - lateout("$12" /*$t0*/) _, - lateout("$13" /*$t1*/) _, - lateout("$14" /*$t2*/) _, - lateout("$15" /*$t3*/) _, - lateout("$24" /*$t8*/) _, - lateout("$25" /*$t9*/) _, - options(nostack, preserves_flags) - ); - FromAsm::from_asm(if err != 0 { - (x0 as usize).wrapping_neg() as *mut _ - } else { - x0 - }) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall3_readonly( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, -) -> RetReg<R0> { - let x0; - let err: usize; - asm!( - "syscall", - inlateout("$2" /*$v0*/) nr.to_asm() => x0, - in("$4" /*$a0*/) a0.to_asm(), - in("$5" /*$a1*/) a1.to_asm(), - in("$6" /*$a2*/) a2.to_asm(), - lateout("$7" /*$a3*/) err, - lateout("$8" /*$a4*/) _, - lateout("$9" /*$a5*/) _, - lateout("$10" /*$a6*/) _, - lateout("$11" /*$a7*/) _, - lateout("$12" /*$t0*/) _, - lateout("$13" /*$t1*/) _, - lateout("$14" /*$t2*/) _, - lateout("$15" /*$t3*/) _, - lateout("$24" /*$t8*/) _, - lateout("$25" /*$t9*/) _, - options(nostack, preserves_flags, readonly) - ); - FromAsm::from_asm(if err != 0 { - (x0 as usize).wrapping_neg() as *mut _ - } else { - x0 - }) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall4( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, - a3: ArgReg<'_, A3>, -) -> RetReg<R0> { - let x0; - let err: usize; - asm!( - "syscall", - inlateout("$2" /*$v0*/) nr.to_asm() => x0, - in("$4" /*$a0*/) a0.to_asm(), - in("$5" /*$a1*/) a1.to_asm(), - in("$6" /*$a2*/) a2.to_asm(), - inlateout("$7" /*$a3*/) a3.to_asm() => err, - lateout("$8" /*$a4*/) _, - lateout("$9" /*$a5*/) _, - lateout("$10" /*$a6*/) _, - lateout("$11" /*$a7*/) _, - lateout("$12" /*$t0*/) _, - lateout("$13" /*$t1*/) _, - lateout("$14" /*$t2*/) _, - lateout("$15" /*$t3*/) _, - lateout("$24" /*$t8*/) _, - lateout("$25" /*$t9*/) _, - options(nostack, preserves_flags) - ); - FromAsm::from_asm(if err != 0 { - (x0 as usize).wrapping_neg() as *mut _ - } else { - x0 - }) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall4_readonly( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, - a3: ArgReg<'_, A3>, -) -> RetReg<R0> { - let x0; - let err: usize; - asm!( - "syscall", - inlateout("$2" /*$v0*/) nr.to_asm() => x0, - in("$4" /*$a0*/) a0.to_asm(), - in("$5" /*$a1*/) a1.to_asm(), - in("$6" /*$a2*/) a2.to_asm(), - inlateout("$7" /*$a3*/) a3.to_asm() => err, - lateout("$8" /*$a4*/) _, - lateout("$9" /*$a5*/) _, - lateout("$10" /*$a6*/) _, - lateout("$11" /*$a7*/) _, - lateout("$12" /*$t0*/) _, - lateout("$13" /*$t1*/) _, - lateout("$14" /*$t2*/) _, - lateout("$15" /*$t3*/) _, - lateout("$24" /*$t8*/) _, - lateout("$25" /*$t9*/) _, - options(nostack, preserves_flags, readonly) - ); - FromAsm::from_asm(if err != 0 { - (x0 as usize).wrapping_neg() as *mut _ - } else { - x0 - }) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall5( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, - a3: ArgReg<'_, A3>, - a4: ArgReg<'_, A4>, -) -> RetReg<R0> { - let x0; - let err: usize; - asm!( - "syscall", - inlateout("$2" /*$v0*/) nr.to_asm() => x0, - in("$4" /*$a0*/) a0.to_asm(), - in("$5" /*$a1*/) a1.to_asm(), - in("$6" /*$a2*/) a2.to_asm(), - inlateout("$7" /*$a3*/) a3.to_asm() => err, - inlateout("$8" /*$a4*/) a4.to_asm() => _, - lateout("$9" /*$a5*/) _, - lateout("$10" /*$a6*/) _, - lateout("$11" /*$a7*/) _, - lateout("$12" /*$t0*/) _, - lateout("$13" /*$t1*/) _, - lateout("$14" /*$t2*/) _, - lateout("$15" /*$t3*/) _, - lateout("$24" /*$t8*/) _, - lateout("$25" /*$t9*/) _, - options(nostack, preserves_flags) - ); - FromAsm::from_asm(if err != 0 { - (x0 as usize).wrapping_neg() as *mut _ - } else { - x0 - }) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall5_readonly( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, - a3: ArgReg<'_, A3>, - a4: ArgReg<'_, A4>, -) -> RetReg<R0> { - let x0; - let err: usize; - asm!( - "syscall", - inlateout("$2" /*$v0*/) nr.to_asm() => x0, - in("$4" /*$a0*/) a0.to_asm(), - in("$5" /*$a1*/) a1.to_asm(), - in("$6" /*$a2*/) a2.to_asm(), - inlateout("$7" /*$a3*/) a3.to_asm() => err, - inlateout("$8" /*$a4*/) a4.to_asm() => _, - lateout("$9" /*$a5*/) _, - lateout("$10" /*$a6*/) _, - lateout("$11" /*$a7*/) _, - lateout("$12" /*$t0*/) _, - lateout("$13" /*$t1*/) _, - lateout("$14" /*$t2*/) _, - lateout("$15" /*$t3*/) _, - lateout("$24" /*$t8*/) _, - lateout("$25" /*$t9*/) _, - options(nostack, preserves_flags, readonly) - ); - FromAsm::from_asm(if err != 0 { - (x0 as usize).wrapping_neg() as *mut _ - } else { - x0 - }) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall6( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, - a3: ArgReg<'_, A3>, - a4: ArgReg<'_, A4>, - a5: ArgReg<'_, A5>, -) -> RetReg<R0> { - let x0; - let err: usize; - asm!( - "syscall", - inlateout("$2" /*$v0*/) nr.to_asm() => x0, - in("$4" /*$a0*/) a0.to_asm(), - in("$5" /*$a1*/) a1.to_asm(), - in("$6" /*$a2*/) a2.to_asm(), - inlateout("$7" /*$a3*/) a3.to_asm() => err, - inlateout("$8" /*$a4*/) a4.to_asm() => _, - inlateout("$9" /*$a5*/) a5.to_asm() => _, - lateout("$10" /*$a6*/) _, - lateout("$11" /*$a7*/) _, - lateout("$12" /*$t0*/) _, - lateout("$13" /*$t1*/) _, - lateout("$14" /*$t2*/) _, - lateout("$15" /*$t3*/) _, - lateout("$24" /*$t8*/) _, - lateout("$25" /*$t9*/) _, - options(nostack, preserves_flags) - ); - FromAsm::from_asm(if err != 0 { - (x0 as usize).wrapping_neg() as *mut _ - } else { - x0 - }) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall6_readonly( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, - a3: ArgReg<'_, A3>, - a4: ArgReg<'_, A4>, - a5: ArgReg<'_, A5>, -) -> RetReg<R0> { - let x0; - let err: usize; - asm!( - "syscall", - inlateout("$2" /*$v0*/) nr.to_asm() => x0, - in("$4" /*$a0*/) a0.to_asm(), - in("$5" /*$a1*/) a1.to_asm(), - in("$6" /*$a2*/) a2.to_asm(), - inlateout("$7" /*$a3*/) a3.to_asm() => err, - inlateout("$8" /*$a4*/) a4.to_asm() => _, - inlateout("$9" /*$a5*/) a5.to_asm() => _, - lateout("$10" /*$a6*/) _, - lateout("$11" /*$a7*/) _, - lateout("$12" /*$t0*/) _, - lateout("$13" /*$t1*/) _, - lateout("$14" /*$t2*/) _, - lateout("$15" /*$t3*/) _, - lateout("$24" /*$t8*/) _, - lateout("$25" /*$t9*/) _, - options(nostack, preserves_flags, readonly) - ); - FromAsm::from_asm(if err != 0 { - (x0 as usize).wrapping_neg() as *mut _ - } else { - x0 - }) -} diff --git a/vendor/rustix/src/backend/linux_raw/arch/mips64r6.rs b/vendor/rustix/src/backend/linux_raw/arch/mips64r6.rs deleted file mode 100644 index 8c06d9e..0000000 --- a/vendor/rustix/src/backend/linux_raw/arch/mips64r6.rs +++ /dev/null @@ -1,470 +0,0 @@ -//! mipsisa64r6el Linux system calls. -//! -//! On mipsisa64r6el, Linux indicates success or failure using `$a3` (`$7`) -//! rather than by returning a negative error code as most other architectures -//! do. -//! -//! Mips-family platforms have a special calling convention for `__NR_pipe`, -//! however we use `__NR_pipe2` instead to avoid having to implement it. -//! -//! Note that MIPS R6 inline assembly currently doesn't differ from MIPS, -//! because no explicit call of R6-only or R2-only instructions exist here. - -use crate::backend::reg::{ - ArgReg, FromAsm, RetReg, SyscallNumber, ToAsm, A0, A1, A2, A3, A4, A5, R0, -}; -use core::arch::asm; - -#[inline] -pub(in crate::backend) unsafe fn syscall0_readonly(nr: SyscallNumber) -> RetReg<R0> { - let x0; - let err: usize; - asm!( - "syscall", - inlateout("$2" /*$v0*/) nr.to_asm() => x0, - lateout("$7" /*$a3*/) err, - lateout("$8" /*$a4*/) _, - lateout("$9" /*$a5*/) _, - lateout("$10" /*$a6*/) _, - lateout("$11" /*$a7*/) _, - lateout("$12" /*$t0*/) _, - lateout("$13" /*$t1*/) _, - lateout("$14" /*$t2*/) _, - lateout("$15" /*$t3*/) _, - lateout("$24" /*$t8*/) _, - lateout("$25" /*$t9*/) _, - options(nostack, preserves_flags, readonly) - ); - FromAsm::from_asm(if err != 0 { - (x0 as usize).wrapping_neg() as *mut _ - } else { - x0 - }) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall1(nr: SyscallNumber<'_>, a0: ArgReg<'_, A0>) -> RetReg<R0> { - let x0; - let err: usize; - asm!( - "syscall", - inlateout("$2" /*$v0*/) nr.to_asm() => x0, - in("$4" /*$a0*/) a0.to_asm(), - lateout("$7" /*$a3*/) err, - lateout("$8" /*$a4*/) _, - lateout("$9" /*$a5*/) _, - lateout("$10" /*$a6*/) _, - lateout("$11" /*$a7*/) _, - lateout("$12" /*$t0*/) _, - lateout("$13" /*$t1*/) _, - lateout("$14" /*$t2*/) _, - lateout("$15" /*$t3*/) _, - lateout("$24" /*$t8*/) _, - lateout("$25" /*$t9*/) _, - options(nostack, preserves_flags) - ); - FromAsm::from_asm(if err != 0 { - (x0 as usize).wrapping_neg() as *mut _ - } else { - x0 - }) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall1_readonly( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, -) -> RetReg<R0> { - let x0; - let err: usize; - asm!( - "syscall", - inlateout("$2" /*$v0*/) nr.to_asm() => x0, - in("$4" /*$a0*/) a0.to_asm(), - lateout("$7" /*$a3*/) err, - lateout("$8" /*$a4*/) _, - lateout("$9" /*$a5*/) _, - lateout("$10" /*$a6*/) _, - lateout("$11" /*$a7*/) _, - lateout("$12" /*$t0*/) _, - lateout("$13" /*$t1*/) _, - lateout("$14" /*$t2*/) _, - lateout("$15" /*$t3*/) _, - lateout("$24" /*$t8*/) _, - lateout("$25" /*$t9*/) _, - options(nostack, preserves_flags, readonly) - ); - FromAsm::from_asm(if err != 0 { - (x0 as usize).wrapping_neg() as *mut _ - } else { - x0 - }) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall1_noreturn(nr: SyscallNumber<'_>, a0: ArgReg<'_, A0>) -> ! { - asm!( - "syscall", - in("$2" /*$v0*/) nr.to_asm(), - in("$4" /*$a0*/) a0.to_asm(), - options(nostack, noreturn) - ) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall2( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, -) -> RetReg<R0> { - let x0; - let err: usize; - asm!( - "syscall", - inlateout("$2" /*$v0*/) nr.to_asm() => x0, - in("$4" /*$a0*/) a0.to_asm(), - in("$5" /*$a1*/) a1.to_asm(), - lateout("$7" /*$a3*/) err, - lateout("$8" /*$a4*/) _, - lateout("$9" /*$a5*/) _, - lateout("$10" /*$a6*/) _, - lateout("$11" /*$a7*/) _, - lateout("$12" /*$t0*/) _, - lateout("$13" /*$t1*/) _, - lateout("$14" /*$t2*/) _, - lateout("$15" /*$t3*/) _, - lateout("$24" /*$t8*/) _, - lateout("$25" /*$t9*/) _, - options(nostack, preserves_flags) - ); - FromAsm::from_asm(if err != 0 { - (x0 as usize).wrapping_neg() as *mut _ - } else { - x0 - }) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall2_readonly( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, -) -> RetReg<R0> { - let x0; - let err: usize; - asm!( - "syscall", - inlateout("$2" /*$v0*/) nr.to_asm() => x0, - in("$4" /*$a0*/) a0.to_asm(), - in("$5" /*$a1*/) a1.to_asm(), - lateout("$7" /*$a3*/) err, - lateout("$8" /*$a4*/) _, - lateout("$9" /*$a5*/) _, - lateout("$10" /*$a6*/) _, - lateout("$11" /*$a7*/) _, - lateout("$12" /*$t0*/) _, - lateout("$13" /*$t1*/) _, - lateout("$14" /*$t2*/) _, - lateout("$15" /*$t3*/) _, - lateout("$24" /*$t8*/) _, - lateout("$25" /*$t9*/) _, - options(nostack, preserves_flags, readonly) - ); - FromAsm::from_asm(if err != 0 { - (x0 as usize).wrapping_neg() as *mut _ - } else { - x0 - }) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall3( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, -) -> RetReg<R0> { - let x0; - let err: usize; - asm!( - "syscall", - inlateout("$2" /*$v0*/) nr.to_asm() => x0, - in("$4" /*$a0*/) a0.to_asm(), - in("$5" /*$a1*/) a1.to_asm(), - in("$6" /*$a2*/) a2.to_asm(), - lateout("$7" /*$a3*/) err, - lateout("$8" /*$a4*/) _, - lateout("$9" /*$a5*/) _, - lateout("$10" /*$a6*/) _, - lateout("$11" /*$a7*/) _, - lateout("$12" /*$t0*/) _, - lateout("$13" /*$t1*/) _, - lateout("$14" /*$t2*/) _, - lateout("$15" /*$t3*/) _, - lateout("$24" /*$t8*/) _, - lateout("$25" /*$t9*/) _, - options(nostack, preserves_flags) - ); - FromAsm::from_asm(if err != 0 { - (x0 as usize).wrapping_neg() as *mut _ - } else { - x0 - }) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall3_readonly( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, -) -> RetReg<R0> { - let x0; - let err: usize; - asm!( - "syscall", - inlateout("$2" /*$v0*/) nr.to_asm() => x0, - in("$4" /*$a0*/) a0.to_asm(), - in("$5" /*$a1*/) a1.to_asm(), - in("$6" /*$a2*/) a2.to_asm(), - lateout("$7" /*$a3*/) err, - lateout("$8" /*$a4*/) _, - lateout("$9" /*$a5*/) _, - lateout("$10" /*$a6*/) _, - lateout("$11" /*$a7*/) _, - lateout("$12" /*$t0*/) _, - lateout("$13" /*$t1*/) _, - lateout("$14" /*$t2*/) _, - lateout("$15" /*$t3*/) _, - lateout("$24" /*$t8*/) _, - lateout("$25" /*$t9*/) _, - options(nostack, preserves_flags, readonly) - ); - FromAsm::from_asm(if err != 0 { - (x0 as usize).wrapping_neg() as *mut _ - } else { - x0 - }) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall4( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, - a3: ArgReg<'_, A3>, -) -> RetReg<R0> { - let x0; - let err: usize; - asm!( - "syscall", - inlateout("$2" /*$v0*/) nr.to_asm() => x0, - in("$4" /*$a0*/) a0.to_asm(), - in("$5" /*$a1*/) a1.to_asm(), - in("$6" /*$a2*/) a2.to_asm(), - inlateout("$7" /*$a3*/) a3.to_asm() => err, - lateout("$8" /*$a4*/) _, - lateout("$9" /*$a5*/) _, - lateout("$10" /*$a6*/) _, - lateout("$11" /*$a7*/) _, - lateout("$12" /*$t0*/) _, - lateout("$13" /*$t1*/) _, - lateout("$14" /*$t2*/) _, - lateout("$15" /*$t3*/) _, - lateout("$24" /*$t8*/) _, - lateout("$25" /*$t9*/) _, - options(nostack, preserves_flags) - ); - FromAsm::from_asm(if err != 0 { - (x0 as usize).wrapping_neg() as *mut _ - } else { - x0 - }) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall4_readonly( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, - a3: ArgReg<'_, A3>, -) -> RetReg<R0> { - let x0; - let err: usize; - asm!( - "syscall", - inlateout("$2" /*$v0*/) nr.to_asm() => x0, - in("$4" /*$a0*/) a0.to_asm(), - in("$5" /*$a1*/) a1.to_asm(), - in("$6" /*$a2*/) a2.to_asm(), - inlateout("$7" /*$a3*/) a3.to_asm() => err, - lateout("$8" /*$a4*/) _, - lateout("$9" /*$a5*/) _, - lateout("$10" /*$a6*/) _, - lateout("$11" /*$a7*/) _, - lateout("$12" /*$t0*/) _, - lateout("$13" /*$t1*/) _, - lateout("$14" /*$t2*/) _, - lateout("$15" /*$t3*/) _, - lateout("$24" /*$t8*/) _, - lateout("$25" /*$t9*/) _, - options(nostack, preserves_flags, readonly) - ); - FromAsm::from_asm(if err != 0 { - (x0 as usize).wrapping_neg() as *mut _ - } else { - x0 - }) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall5( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, - a3: ArgReg<'_, A3>, - a4: ArgReg<'_, A4>, -) -> RetReg<R0> { - let x0; - let err: usize; - asm!( - "syscall", - inlateout("$2" /*$v0*/) nr.to_asm() => x0, - in("$4" /*$a0*/) a0.to_asm(), - in("$5" /*$a1*/) a1.to_asm(), - in("$6" /*$a2*/) a2.to_asm(), - inlateout("$7" /*$a3*/) a3.to_asm() => err, - inlateout("$8" /*$a4*/) a4.to_asm() => _, - lateout("$9" /*$a5*/) _, - lateout("$10" /*$a6*/) _, - lateout("$11" /*$a7*/) _, - lateout("$12" /*$t0*/) _, - lateout("$13" /*$t1*/) _, - lateout("$14" /*$t2*/) _, - lateout("$15" /*$t3*/) _, - lateout("$24" /*$t8*/) _, - lateout("$25" /*$t9*/) _, - options(nostack, preserves_flags) - ); - FromAsm::from_asm(if err != 0 { - (x0 as usize).wrapping_neg() as *mut _ - } else { - x0 - }) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall5_readonly( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, - a3: ArgReg<'_, A3>, - a4: ArgReg<'_, A4>, -) -> RetReg<R0> { - let x0; - let err: usize; - asm!( - "syscall", - inlateout("$2" /*$v0*/) nr.to_asm() => x0, - in("$4" /*$a0*/) a0.to_asm(), - in("$5" /*$a1*/) a1.to_asm(), - in("$6" /*$a2*/) a2.to_asm(), - inlateout("$7" /*$a3*/) a3.to_asm() => err, - inlateout("$8" /*$a4*/) a4.to_asm() => _, - lateout("$9" /*$a5*/) _, - lateout("$10" /*$a6*/) _, - lateout("$11" /*$a7*/) _, - lateout("$12" /*$t0*/) _, - lateout("$13" /*$t1*/) _, - lateout("$14" /*$t2*/) _, - lateout("$15" /*$t3*/) _, - lateout("$24" /*$t8*/) _, - lateout("$25" /*$t9*/) _, - options(nostack, preserves_flags, readonly) - ); - FromAsm::from_asm(if err != 0 { - (x0 as usize).wrapping_neg() as *mut _ - } else { - x0 - }) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall6( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, - a3: ArgReg<'_, A3>, - a4: ArgReg<'_, A4>, - a5: ArgReg<'_, A5>, -) -> RetReg<R0> { - let x0; - let err: usize; - asm!( - "syscall", - inlateout("$2" /*$v0*/) nr.to_asm() => x0, - in("$4" /*$a0*/) a0.to_asm(), - in("$5" /*$a1*/) a1.to_asm(), - in("$6" /*$a2*/) a2.to_asm(), - inlateout("$7" /*$a3*/) a3.to_asm() => err, - inlateout("$8" /*$a4*/) a4.to_asm() => _, - inlateout("$9" /*$a5*/) a5.to_asm() => _, - lateout("$10" /*$a6*/) _, - lateout("$11" /*$a7*/) _, - lateout("$12" /*$t0*/) _, - lateout("$13" /*$t1*/) _, - lateout("$14" /*$t2*/) _, - lateout("$15" /*$t3*/) _, - lateout("$24" /*$t8*/) _, - lateout("$25" /*$t9*/) _, - options(nostack, preserves_flags) - ); - FromAsm::from_asm(if err != 0 { - (x0 as usize).wrapping_neg() as *mut _ - } else { - x0 - }) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall6_readonly( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, - a3: ArgReg<'_, A3>, - a4: ArgReg<'_, A4>, - a5: ArgReg<'_, A5>, -) -> RetReg<R0> { - let x0; - let err: usize; - asm!( - "syscall", - inlateout("$2" /*$v0*/) nr.to_asm() => x0, - in("$4" /*$a0*/) a0.to_asm(), - in("$5" /*$a1*/) a1.to_asm(), - in("$6" /*$a2*/) a2.to_asm(), - inlateout("$7" /*$a3*/) a3.to_asm() => err, - inlateout("$8" /*$a4*/) a4.to_asm() => _, - inlateout("$9" /*$a5*/) a5.to_asm() => _, - lateout("$10" /*$a6*/) _, - lateout("$11" /*$a7*/) _, - lateout("$12" /*$t0*/) _, - lateout("$13" /*$t1*/) _, - lateout("$14" /*$t2*/) _, - lateout("$15" /*$t3*/) _, - lateout("$24" /*$t8*/) _, - lateout("$25" /*$t9*/) _, - options(nostack, preserves_flags, readonly) - ); - FromAsm::from_asm(if err != 0 { - (x0 as usize).wrapping_neg() as *mut _ - } else { - x0 - }) -} diff --git a/vendor/rustix/src/backend/linux_raw/arch/mod.rs b/vendor/rustix/src/backend/linux_raw/arch/mod.rs deleted file mode 100644 index ac9e25f..0000000 --- a/vendor/rustix/src/backend/linux_raw/arch/mod.rs +++ /dev/null @@ -1,317 +0,0 @@ -//! Architecture-specific syscall code. -//! -//! This module also has a `choose` submodule which chooses a scheme and is -//! what most of the `rustix` syscalls use. -//! -//! Compilers should really have intrinsics for making system calls. They're -//! much like regular calls, with custom calling conventions, and calling -//! conventions are otherwise the compiler's job. But for now, use inline asm. -//! -//! The calling conventions for Linux syscalls are [documented here]. -//! -//! [documented here]: https://man7.org/linux/man-pages/man2/syscall.2.html -//! -//! # Safety -//! -//! This contains the inline `asm` statements performing the syscall -//! instructions. - -#![allow(unsafe_code)] -#![cfg_attr(not(feature = "all-apis"), allow(unused_imports))] -// We'll use as many arguments as syscalls need. -#![allow(clippy::too_many_arguments)] - -// These functions always use the machine's syscall instruction, even when it -// isn't the fastest option available. -#[cfg_attr(target_arch = "aarch64", path = "aarch64.rs")] -#[cfg_attr(all(target_arch = "arm", not(thumb_mode)), path = "arm.rs")] -#[cfg_attr(all(target_arch = "arm", thumb_mode), path = "thumb.rs")] -#[cfg_attr(target_arch = "mips", path = "mips.rs")] -#[cfg_attr(target_arch = "mips32r6", path = "mips32r6.rs")] -#[cfg_attr(target_arch = "mips64", path = "mips64.rs")] -#[cfg_attr(target_arch = "mips64r6", path = "mips64r6.rs")] -#[cfg_attr(target_arch = "powerpc64", path = "powerpc64.rs")] -#[cfg_attr(target_arch = "riscv64", path = "riscv64.rs")] -#[cfg_attr(target_arch = "x86", path = "x86.rs")] -#[cfg_attr(target_arch = "x86_64", path = "x86_64.rs")] -pub(in crate::backend) mod asm; - -// On most architectures, the architecture syscall instruction is fast, so use -// it directly. -#[cfg(any( - target_arch = "arm", - target_arch = "aarch64", - target_arch = "mips", - target_arch = "mips32r6", - target_arch = "mips64", - target_arch = "mips64r6", - target_arch = "powerpc64", - target_arch = "riscv64", - target_arch = "x86_64", -))] -pub(in crate::backend) use self::asm as choose; - -// On 32-bit x86, use vDSO wrappers for all syscalls. We could use the -// architecture syscall instruction (`int 0x80`), but the vDSO kernel_vsyscall -// mechanism is much faster. -#[cfg(target_arch = "x86")] -pub(in crate::backend) use super::vdso_wrappers::x86_via_vdso as choose; - -// This would be the code for always using `int 0x80` on 32-bit x86. -//#[cfg(target_arch = "x86")] -//pub(in crate::backend) use self::asm as choose; - -// Macros for invoking system calls. -// -// These factor out: -// - Calling `nr` on the syscall number to convert it into `SyscallNumber`. -// - Calling `.into()` on each of the arguments to convert them into `ArgReg`. -// - Qualifying the `syscall*` and `__NR_*` identifiers. -// - Counting the number of arguments. -macro_rules! syscall { - ($nr:ident) => { - $crate::backend::arch::choose::syscall0($crate::backend::reg::nr( - linux_raw_sys::general::$nr, - )) - }; - - ($nr:ident, $a0:expr) => { - $crate::backend::arch::choose::syscall1( - $crate::backend::reg::nr(linux_raw_sys::general::$nr), - $a0.into(), - ) - }; - - ($nr:ident, $a0:expr, $a1:expr) => { - $crate::backend::arch::choose::syscall2( - $crate::backend::reg::nr(linux_raw_sys::general::$nr), - $a0.into(), - $a1.into(), - ) - }; - - ($nr:ident, $a0:expr, $a1:expr, $a2:expr) => { - $crate::backend::arch::choose::syscall3( - $crate::backend::reg::nr(linux_raw_sys::general::$nr), - $a0.into(), - $a1.into(), - $a2.into(), - ) - }; - - ($nr:ident, $a0:expr, $a1:expr, $a2:expr, $a3:expr) => { - $crate::backend::arch::choose::syscall4( - $crate::backend::reg::nr(linux_raw_sys::general::$nr), - $a0.into(), - $a1.into(), - $a2.into(), - $a3.into(), - ) - }; - - ($nr:ident, $a0:expr, $a1:expr, $a2:expr, $a3:expr, $a4:expr) => { - $crate::backend::arch::choose::syscall5( - $crate::backend::reg::nr(linux_raw_sys::general::$nr), - $a0.into(), - $a1.into(), - $a2.into(), - $a3.into(), - $a4.into(), - ) - }; - - ($nr:ident, $a0:expr, $a1:expr, $a2:expr, $a3:expr, $a4:expr, $a5:expr) => { - $crate::backend::arch::choose::syscall6( - $crate::backend::reg::nr(linux_raw_sys::general::$nr), - $a0.into(), - $a1.into(), - $a2.into(), - $a3.into(), - $a4.into(), - $a5.into(), - ) - }; - - ($nr:ident, $a0:expr, $a1:expr, $a2:expr, $a3:expr, $a4:expr, $a5:expr, $a6:expr) => { - $crate::backend::arch::choose::syscall7( - $crate::backend::reg::nr(linux_raw_sys::general::$nr), - $a0.into(), - $a1.into(), - $a2.into(), - $a3.into(), - $a4.into(), - $a5.into(), - $a6.into(), - ) - }; -} - -// Macro to invoke a syscall that always uses direct assembly, rather than the -// vDSO. Useful when still finding the vDSO. -#[allow(unused_macros)] -macro_rules! syscall_always_asm { - ($nr:ident) => { - $crate::backend::arch::asm::syscall0($crate::backend::reg::nr(linux_raw_sys::general::$nr)) - }; - - ($nr:ident, $a0:expr) => { - $crate::backend::arch::asm::syscall1( - $crate::backend::reg::nr(linux_raw_sys::general::$nr), - $a0.into(), - ) - }; - - ($nr:ident, $a0:expr, $a1:expr) => { - $crate::backend::arch::asm::syscall2( - $crate::backend::reg::nr(linux_raw_sys::general::$nr), - $a0.into(), - $a1.into(), - ) - }; - - ($nr:ident, $a0:expr, $a1:expr, $a2:expr) => { - $crate::backend::arch::asm::syscall3( - $crate::backend::reg::nr(linux_raw_sys::general::$nr), - $a0.into(), - $a1.into(), - $a2.into(), - ) - }; - - ($nr:ident, $a0:expr, $a1:expr, $a2:expr, $a3:expr) => { - $crate::backend::arch::asm::syscall4( - $crate::backend::reg::nr(linux_raw_sys::general::$nr), - $a0.into(), - $a1.into(), - $a2.into(), - $a3.into(), - ) - }; - - ($nr:ident, $a0:expr, $a1:expr, $a2:expr, $a3:expr, $a4:expr) => { - $crate::backend::arch::asm::syscall5( - $crate::backend::reg::nr(linux_raw_sys::general::$nr), - $a0.into(), - $a1.into(), - $a2.into(), - $a3.into(), - $a4.into(), - ) - }; - - ($nr:ident, $a0:expr, $a1:expr, $a2:expr, $a3:expr, $a4:expr, $a5:expr) => { - $crate::backend::arch::asm::syscall6( - $crate::backend::reg::nr(linux_raw_sys::general::$nr), - $a0.into(), - $a1.into(), - $a2.into(), - $a3.into(), - $a4.into(), - $a5.into(), - ) - }; - - ($nr:ident, $a0:expr, $a1:expr, $a2:expr, $a3:expr, $a4:expr, $a5:expr, $a6:expr) => { - $crate::backend::arch::asm::syscall7( - $crate::backend::reg::nr(linux_raw_sys::general::$nr), - $a0.into(), - $a1.into(), - $a2.into(), - $a3.into(), - $a4.into(), - $a5.into(), - $a6.into(), - ) - }; -} - -/// Like `syscall`, but adds the `readonly` attribute to the inline asm, which -/// indicates that the syscall does not mutate any memory. -macro_rules! syscall_readonly { - ($nr:ident) => { - $crate::backend::arch::choose::syscall0_readonly($crate::backend::reg::nr( - linux_raw_sys::general::$nr, - )) - }; - - ($nr:ident, $a0:expr) => { - $crate::backend::arch::choose::syscall1_readonly( - $crate::backend::reg::nr(linux_raw_sys::general::$nr), - $a0.into(), - ) - }; - - ($nr:ident, $a0:expr, $a1:expr) => { - $crate::backend::arch::choose::syscall2_readonly( - $crate::backend::reg::nr(linux_raw_sys::general::$nr), - $a0.into(), - $a1.into(), - ) - }; - - ($nr:ident, $a0:expr, $a1:expr, $a2:expr) => { - $crate::backend::arch::choose::syscall3_readonly( - $crate::backend::reg::nr(linux_raw_sys::general::$nr), - $a0.into(), - $a1.into(), - $a2.into(), - ) - }; - - ($nr:ident, $a0:expr, $a1:expr, $a2:expr, $a3:expr) => { - $crate::backend::arch::choose::syscall4_readonly( - $crate::backend::reg::nr(linux_raw_sys::general::$nr), - $a0.into(), - $a1.into(), - $a2.into(), - $a3.into(), - ) - }; - - ($nr:ident, $a0:expr, $a1:expr, $a2:expr, $a3:expr, $a4:expr) => { - $crate::backend::arch::choose::syscall5_readonly( - $crate::backend::reg::nr(linux_raw_sys::general::$nr), - $a0.into(), - $a1.into(), - $a2.into(), - $a3.into(), - $a4.into(), - ) - }; - - ($nr:ident, $a0:expr, $a1:expr, $a2:expr, $a3:expr, $a4:expr, $a5:expr) => { - $crate::backend::arch::choose::syscall6_readonly( - $crate::backend::reg::nr(linux_raw_sys::general::$nr), - $a0.into(), - $a1.into(), - $a2.into(), - $a3.into(), - $a4.into(), - $a5.into(), - ) - }; - - ($nr:ident, $a0:expr, $a1:expr, $a2:expr, $a3:expr, $a4:expr, $a5:expr, $a6:expr) => { - $crate::backend::arch::choose::syscall7_readonly( - $crate::backend::reg::nr(linux_raw_sys::general::$nr), - $a0.into(), - $a1.into(), - $a2.into(), - $a3.into(), - $a4.into(), - $a5.into(), - $a6.into(), - ) - }; -} - -/// Like `syscall`, but indicates that the syscall does not return. -#[cfg(feature = "runtime")] -macro_rules! syscall_noreturn { - ($nr:ident, $a0:expr) => { - $crate::backend::arch::choose::syscall1_noreturn( - $crate::backend::reg::nr(linux_raw_sys::general::$nr), - $a0.into(), - ) - }; -} diff --git a/vendor/rustix/src/backend/linux_raw/arch/powerpc64.rs b/vendor/rustix/src/backend/linux_raw/arch/powerpc64.rs deleted file mode 100644 index 14866c2..0000000 --- a/vendor/rustix/src/backend/linux_raw/arch/powerpc64.rs +++ /dev/null @@ -1,413 +0,0 @@ -//! powerpc64le Linux system calls. -//! -//! On powerpc64le, Linux indicates success or failure using `cr0.SO` rather -//! than by returning a negative error code as most other architectures do. In -//! theory we could immediately translate this into a `Result`, and it'd save a -//! few branches. And in theory we could have specialized sequences for use -//! with syscalls that are known to never fail. However, those would require -//! more extensive changes in rustix's platform-independent code. For now, we -//! check the flag and negate the error value to make PowerPC64 look like other -//! architectures. - -use crate::backend::reg::{ - ArgReg, FromAsm, RetReg, SyscallNumber, ToAsm, A0, A1, A2, A3, A4, A5, R0, -}; -use core::arch::asm; - -#[inline] -pub(in crate::backend) unsafe fn syscall0_readonly(nr: SyscallNumber<'_>) -> RetReg<R0> { - let r0; - asm!( - "sc", - "bns 0f", - "neg 3, 3", - "0:", - inlateout("r0") nr.to_asm() => _, - lateout("r3") r0, - lateout("r4") _, - lateout("r5") _, - lateout("r6") _, - lateout("r7") _, - lateout("r8") _, - lateout("r9") _, - lateout("r10") _, - lateout("r11") _, - lateout("r12") _, - lateout("cr0") _, - options(nostack, preserves_flags, readonly) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall1(nr: SyscallNumber<'_>, a0: ArgReg<'_, A0>) -> RetReg<R0> { - let r0; - asm!( - "sc", - "bns 0f", - "neg 3, 3", - "0:", - inlateout("r0") nr.to_asm() => _, - inlateout("r3") a0.to_asm() => r0, - lateout("r4") _, - lateout("r5") _, - lateout("r6") _, - lateout("r7") _, - lateout("r8") _, - lateout("r9") _, - lateout("r10") _, - lateout("r11") _, - lateout("r12") _, - lateout("cr0") _, - options(nostack, preserves_flags) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall1_readonly( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, -) -> RetReg<R0> { - let r0; - asm!( - "sc", - "bns 0f", - "neg 3, 3", - "0:", - inlateout("r0") nr.to_asm() => _, - inlateout("r3") a0.to_asm() => r0, - lateout("r4") _, - lateout("r5") _, - lateout("r6") _, - lateout("r7") _, - lateout("r8") _, - lateout("r9") _, - lateout("r10") _, - lateout("r11") _, - lateout("r12") _, - lateout("cr0") _, - options(nostack, preserves_flags, readonly) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall1_noreturn(nr: SyscallNumber<'_>, a0: ArgReg<'_, A0>) -> ! { - asm!( - "sc", - in("r0") nr.to_asm(), - in("r3") a0.to_asm(), - options(nostack, noreturn) - ) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall2( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, -) -> RetReg<R0> { - let r0; - asm!( - "sc", - "bns 0f", - "neg 3, 3", - "0:", - inlateout("r0") nr.to_asm() => _, - inlateout("r3") a0.to_asm() => r0, - inlateout("r4") a1.to_asm() => _, - lateout("r5") _, - lateout("r6") _, - lateout("r7") _, - lateout("r8") _, - lateout("r9") _, - lateout("r10") _, - lateout("r11") _, - lateout("r12") _, - lateout("cr0") _, - options(nostack, preserves_flags) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall2_readonly( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, -) -> RetReg<R0> { - let r0; - asm!( - "sc", - "bns 0f", - "neg 3, 3", - "0:", - inlateout("r0") nr.to_asm() => _, - inlateout("r3") a0.to_asm() => r0, - inlateout("r4") a1.to_asm() => _, - lateout("r5") _, - lateout("r6") _, - lateout("r7") _, - lateout("r8") _, - lateout("r9") _, - lateout("r10") _, - lateout("r11") _, - lateout("r12") _, - lateout("cr0") _, - options(nostack, preserves_flags, readonly) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall3( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, -) -> RetReg<R0> { - let r0; - asm!( - "sc", - "bns 0f", - "neg 3, 3", - "0:", - inlateout("r0") nr.to_asm() => _, - inlateout("r3") a0.to_asm() => r0, - inlateout("r4") a1.to_asm() => _, - inlateout("r5") a2.to_asm() => _, - lateout("r6") _, - lateout("r7") _, - lateout("r8") _, - lateout("r9") _, - lateout("r10") _, - lateout("r11") _, - lateout("r12") _, - lateout("cr0") _, - options(nostack, preserves_flags) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall3_readonly( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, -) -> RetReg<R0> { - let r0; - asm!( - "sc", - "bns 0f", - "neg 3, 3", - "0:", - inlateout("r0") nr.to_asm() => _, - inlateout("r3") a0.to_asm() => r0, - inlateout("r4") a1.to_asm() => _, - inlateout("r5") a2.to_asm() => _, - lateout("r6") _, - lateout("r7") _, - lateout("r8") _, - lateout("r9") _, - lateout("r10") _, - lateout("r11") _, - lateout("r12") _, - lateout("cr0") _, - options(nostack, preserves_flags, readonly) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall4( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, - a3: ArgReg<'_, A3>, -) -> RetReg<R0> { - let r0; - asm!( - "sc", - "bns 0f", - "neg 3, 3", - "0:", - inlateout("r0") nr.to_asm() => _, - inlateout("r3") a0.to_asm() => r0, - inlateout("r4") a1.to_asm() => _, - inlateout("r5") a2.to_asm() => _, - inlateout("r6") a3.to_asm() => _, - lateout("r7") _, - lateout("r8") _, - lateout("r9") _, - lateout("r10") _, - lateout("r11") _, - lateout("r12") _, - lateout("cr0") _, - options(nostack, preserves_flags) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall4_readonly( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, - a3: ArgReg<'_, A3>, -) -> RetReg<R0> { - let r0; - asm!( - "sc", - "bns 0f", - "neg 3, 3", - "0:", - inlateout("r0") nr.to_asm() => _, - inlateout("r3") a0.to_asm() => r0, - inlateout("r4") a1.to_asm() => _, - inlateout("r5") a2.to_asm() => _, - inlateout("r6") a3.to_asm() => _, - lateout("r7") _, - lateout("r8") _, - lateout("r9") _, - lateout("r10") _, - lateout("r11") _, - lateout("r12") _, - lateout("cr0") _, - options(nostack, preserves_flags, readonly) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall5( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, - a3: ArgReg<'_, A3>, - a4: ArgReg<'_, A4>, -) -> RetReg<R0> { - let r0; - asm!( - "sc", - "bns 0f", - "neg 3, 3", - "0:", - inlateout("r0") nr.to_asm() => _, - inlateout("r3") a0.to_asm() => r0, - inlateout("r4") a1.to_asm() => _, - inlateout("r5") a2.to_asm() => _, - inlateout("r6") a3.to_asm() => _, - inlateout("r7") a4.to_asm() => _, - lateout("r8") _, - lateout("r9") _, - lateout("r10") _, - lateout("r11") _, - lateout("r12") _, - lateout("cr0") _, - options(nostack, preserves_flags) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall5_readonly( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, - a3: ArgReg<'_, A3>, - a4: ArgReg<'_, A4>, -) -> RetReg<R0> { - let r0; - asm!( - "sc", - "bns 0f", - "neg 3, 3", - "0:", - inlateout("r0") nr.to_asm() => _, - inlateout("r3") a0.to_asm() => r0, - inlateout("r4") a1.to_asm() => _, - inlateout("r5") a2.to_asm() => _, - inlateout("r6") a3.to_asm() => _, - inlateout("r7") a4.to_asm() => _, - lateout("r8") _, - lateout("r9") _, - lateout("r10") _, - lateout("r11") _, - lateout("r12") _, - lateout("cr0") _, - options(nostack, preserves_flags, readonly) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall6( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, - a3: ArgReg<'_, A3>, - a4: ArgReg<'_, A4>, - a5: ArgReg<'_, A5>, -) -> RetReg<R0> { - let r0; - asm!( - "sc", - "bns 0f", - "neg 3, 3", - "0:", - inlateout("r0") nr.to_asm() => _, - inlateout("r3") a0.to_asm() => r0, - inlateout("r4") a1.to_asm() => _, - inlateout("r5") a2.to_asm() => _, - inlateout("r6") a3.to_asm() => _, - inlateout("r7") a4.to_asm() => _, - inlateout("r8") a5.to_asm() => _, - lateout("r9") _, - lateout("r10") _, - lateout("r11") _, - lateout("r12") _, - lateout("cr0") _, - options(nostack, preserves_flags) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall6_readonly( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, - a3: ArgReg<'_, A3>, - a4: ArgReg<'_, A4>, - a5: ArgReg<'_, A5>, -) -> RetReg<R0> { - let r0; - asm!( - "sc", - "bns 0f", - "neg 3, 3", - "0:", - inlateout("r0") nr.to_asm() => _, - inlateout("r3") a0.to_asm() => r0, - inlateout("r4") a1.to_asm() => _, - inlateout("r5") a2.to_asm() => _, - inlateout("r6") a3.to_asm() => _, - inlateout("r7") a4.to_asm() => _, - inlateout("r8") a5.to_asm() => _, - lateout("r9") _, - lateout("r10") _, - lateout("r11") _, - lateout("r12") _, - lateout("cr0") _, - options(nostack, preserves_flags, readonly) - ); - FromAsm::from_asm(r0) -} diff --git a/vendor/rustix/src/backend/linux_raw/arch/riscv64.rs b/vendor/rustix/src/backend/linux_raw/arch/riscv64.rs deleted file mode 100644 index 7b8533d..0000000 --- a/vendor/rustix/src/backend/linux_raw/arch/riscv64.rs +++ /dev/null @@ -1,265 +0,0 @@ -//! riscv64 Linux system calls. - -use crate::backend::reg::{ - ArgReg, FromAsm, RetReg, SyscallNumber, ToAsm, A0, A1, A2, A3, A4, A5, R0, -}; -use core::arch::asm; - -#[inline] -pub(in crate::backend) unsafe fn syscall0_readonly(nr: SyscallNumber<'_>) -> RetReg<R0> { - let r0; - asm!( - "ecall", - in("a7") nr.to_asm(), - lateout("a0") r0, - options(nostack, preserves_flags, readonly) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall1(nr: SyscallNumber<'_>, a0: ArgReg<'_, A0>) -> RetReg<R0> { - let r0; - asm!( - "ecall", - in("a7") nr.to_asm(), - inlateout("a0") a0.to_asm() => r0, - options(nostack, preserves_flags) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall1_readonly( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, -) -> RetReg<R0> { - let r0; - asm!( - "ecall", - in("a7") nr.to_asm(), - inlateout("a0") a0.to_asm() => r0, - options(nostack, preserves_flags, readonly) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall1_noreturn(nr: SyscallNumber<'_>, a0: ArgReg<'_, A0>) -> ! { - asm!( - "ecall", - in("a7") nr.to_asm(), - in("a0") a0.to_asm(), - options(nostack, noreturn) - ); -} - -#[inline] -pub(in crate::backend) unsafe fn syscall2( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, -) -> RetReg<R0> { - let r0; - asm!( - "ecall", - in("a7") nr.to_asm(), - inlateout("a0") a0.to_asm() => r0, - in("a1") a1.to_asm(), - options(nostack, preserves_flags) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall2_readonly( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, -) -> RetReg<R0> { - let r0; - asm!( - "ecall", - in("a7") nr.to_asm(), - inlateout("a0") a0.to_asm() => r0, - in("a1") a1.to_asm(), - options(nostack, preserves_flags, readonly) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall3( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, -) -> RetReg<R0> { - let r0; - asm!( - "ecall", - in("a7") nr.to_asm(), - inlateout("a0") a0.to_asm() => r0, - in("a1") a1.to_asm(), - in("a2") a2.to_asm(), - options(nostack, preserves_flags) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall3_readonly( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, -) -> RetReg<R0> { - let r0; - asm!( - "ecall", - in("a7") nr.to_asm(), - inlateout("a0") a0.to_asm() => r0, - in("a1") a1.to_asm(), - in("a2") a2.to_asm(), - options(nostack, preserves_flags, readonly) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall4( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, - a3: ArgReg<'_, A3>, -) -> RetReg<R0> { - let r0; - asm!( - "ecall", - in("a7") nr.to_asm(), - inlateout("a0") a0.to_asm() => r0, - in("a1") a1.to_asm(), - in("a2") a2.to_asm(), - in("a3") a3.to_asm(), - options(nostack, preserves_flags) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall4_readonly( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, - a3: ArgReg<'_, A3>, -) -> RetReg<R0> { - let r0; - asm!( - "ecall", - in("a7") nr.to_asm(), - inlateout("a0") a0.to_asm() => r0, - in("a1") a1.to_asm(), - in("a2") a2.to_asm(), - in("a3") a3.to_asm(), - options(nostack, preserves_flags, readonly) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall5( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, - a3: ArgReg<'_, A3>, - a4: ArgReg<'_, A4>, -) -> RetReg<R0> { - let r0; - asm!( - "ecall", - in("a7") nr.to_asm(), - inlateout("a0") a0.to_asm() => r0, - in("a1") a1.to_asm(), - in("a2") a2.to_asm(), - in("a3") a3.to_asm(), - in("a4") a4.to_asm(), - options(nostack, preserves_flags) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall5_readonly( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, - a3: ArgReg<'_, A3>, - a4: ArgReg<'_, A4>, -) -> RetReg<R0> { - let r0; - asm!( - "ecall", - in("a7") nr.to_asm(), - inlateout("a0") a0.to_asm() => r0, - in("a1") a1.to_asm(), - in("a2") a2.to_asm(), - in("a3") a3.to_asm(), - in("a4") a4.to_asm(), - options(nostack, preserves_flags, readonly) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall6( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, - a3: ArgReg<'_, A3>, - a4: ArgReg<'_, A4>, - a5: ArgReg<'_, A5>, -) -> RetReg<R0> { - let r0; - asm!( - "ecall", - in("a7") nr.to_asm(), - inlateout("a0") a0.to_asm() => r0, - in("a1") a1.to_asm(), - in("a2") a2.to_asm(), - in("a3") a3.to_asm(), - in("a4") a4.to_asm(), - in("a5") a5.to_asm(), - options(nostack, preserves_flags) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall6_readonly( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, - a3: ArgReg<'_, A3>, - a4: ArgReg<'_, A4>, - a5: ArgReg<'_, A5>, -) -> RetReg<R0> { - let r0; - asm!( - "ecall", - in("a7") nr.to_asm(), - inlateout("a0") a0.to_asm() => r0, - in("a1") a1.to_asm(), - in("a2") a2.to_asm(), - in("a3") a3.to_asm(), - in("a4") a4.to_asm(), - in("a5") a5.to_asm(), - options(nostack, preserves_flags, readonly) - ); - FromAsm::from_asm(r0) -} diff --git a/vendor/rustix/src/backend/linux_raw/arch/thumb.rs b/vendor/rustix/src/backend/linux_raw/arch/thumb.rs deleted file mode 100644 index 73f9c1c..0000000 --- a/vendor/rustix/src/backend/linux_raw/arch/thumb.rs +++ /dev/null @@ -1,322 +0,0 @@ -//! arm Linux system calls, using thumb-mode. -//! -//! In thumb-mode, r7 is the frame pointer and is not permitted to be used in -//! an inline asm operand, so we have to use a different register and copy it -//! into r7 inside the inline asm. - -use crate::backend::reg::{ - ArgReg, FromAsm, RetReg, SyscallNumber, ToAsm, A0, A1, A2, A3, A4, A5, R0, -}; -use core::arch::asm; - -#[inline] -pub(in crate::backend) unsafe fn syscall0_readonly(nr: SyscallNumber<'_>) -> RetReg<R0> { - let r0; - asm!( - "mov {tmp}, r7", - "mov r7, {nr}", - "svc 0", - "mov r7, {tmp}", - nr = in(reg) nr.to_asm(), - tmp = out(reg) _, - lateout("r0") r0, - options(nostack, preserves_flags, readonly) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall1(nr: SyscallNumber<'_>, a0: ArgReg<'_, A0>) -> RetReg<R0> { - let r0; - asm!( - "mov {tmp}, r7", - "mov r7, {nr}", - "svc 0", - "mov r7, {tmp}", - nr = in(reg) nr.to_asm(), - tmp = out(reg) _, - inlateout("r0") a0.to_asm() => r0, - options(nostack, preserves_flags) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall1_readonly( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, -) -> RetReg<R0> { - let r0; - asm!( - "mov {tmp}, r7", - "mov r7, {nr}", - "svc 0", - "mov r7, {tmp}", - nr = in(reg) nr.to_asm(), - tmp = out(reg) _, - inlateout("r0") a0.to_asm() => r0, - options(nostack, preserves_flags, readonly) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall1_noreturn(nr: SyscallNumber<'_>, a0: ArgReg<'_, A0>) -> ! { - asm!( - "mov r7, {nr}", - "svc 0", - nr = in(reg) nr.to_asm(), - in("r0") a0.to_asm(), - options(nostack, noreturn) - ) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall2( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, -) -> RetReg<R0> { - let r0; - asm!( - "mov {tmp}, r7", - "mov r7, {nr}", - "svc 0", - "mov r7, {tmp}", - nr = in(reg) nr.to_asm(), - tmp = out(reg) _, - inlateout("r0") a0.to_asm() => r0, - in("r1") a1.to_asm(), - options(nostack, preserves_flags) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall2_readonly( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, -) -> RetReg<R0> { - let r0; - asm!( - "mov {tmp}, r7", - "mov r7, {nr}", - "svc 0", - "mov r7, {tmp}", - nr = in(reg) nr.to_asm(), - tmp = out(reg) _, - inlateout("r0") a0.to_asm() => r0, - in("r1") a1.to_asm(), - options(nostack, preserves_flags, readonly) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall3( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, -) -> RetReg<R0> { - let r0; - asm!( - "mov {tmp}, r7", - "mov r7, {nr}", - "svc 0", - "mov r7, {tmp}", - nr = in(reg) nr.to_asm(), - tmp = out(reg) _, - inlateout("r0") a0.to_asm() => r0, - in("r1") a1.to_asm(), - in("r2") a2.to_asm(), - options(nostack, preserves_flags) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall3_readonly( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, -) -> RetReg<R0> { - let r0; - asm!( - "mov {tmp}, r7", - "mov r7, {nr}", - "svc 0", - "mov r7, {tmp}", - nr = in(reg) nr.to_asm(), - tmp = out(reg) _, - inlateout("r0") a0.to_asm() => r0, - in("r1") a1.to_asm(), - in("r2") a2.to_asm(), - options(nostack, preserves_flags, readonly) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall4( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, - a3: ArgReg<'_, A3>, -) -> RetReg<R0> { - let r0; - asm!( - "mov {tmp}, r7", - "mov r7, {nr}", - "svc 0", - "mov r7, {tmp}", - nr = in(reg) nr.to_asm(), - tmp = out(reg) _, - inlateout("r0") a0.to_asm() => r0, - in("r1") a1.to_asm(), - in("r2") a2.to_asm(), - in("r3") a3.to_asm(), - options(nostack, preserves_flags) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall4_readonly( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, - a3: ArgReg<'_, A3>, -) -> RetReg<R0> { - let r0; - asm!( - "mov {tmp}, r7", - "mov r7, {nr}", - "svc 0", - "mov r7, {tmp}", - nr = in(reg) nr.to_asm(), - tmp = out(reg) _, - inlateout("r0") a0.to_asm() => r0, - in("r1") a1.to_asm(), - in("r2") a2.to_asm(), - in("r3") a3.to_asm(), - options(nostack, preserves_flags, readonly) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall5( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, - a3: ArgReg<'_, A3>, - a4: ArgReg<'_, A4>, -) -> RetReg<R0> { - let r0; - asm!( - "mov {tmp}, r7", - "mov r7, {nr}", - "svc 0", - "mov r7, {tmp}", - nr = in(reg) nr.to_asm(), - tmp = out(reg) _, - inlateout("r0") a0.to_asm() => r0, - in("r1") a1.to_asm(), - in("r2") a2.to_asm(), - in("r3") a3.to_asm(), - in("r4") a4.to_asm(), - options(nostack, preserves_flags) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall5_readonly( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, - a3: ArgReg<'_, A3>, - a4: ArgReg<'_, A4>, -) -> RetReg<R0> { - let r0; - asm!( - "mov {tmp}, r7", - "mov r7, {nr}", - "svc 0", - "mov r7, {tmp}", - nr = in(reg) nr.to_asm(), - tmp = out(reg) _, - inlateout("r0") a0.to_asm() => r0, - in("r1") a1.to_asm(), - in("r2") a2.to_asm(), - in("r3") a3.to_asm(), - in("r4") a4.to_asm(), - options(nostack, preserves_flags, readonly) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall6( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, - a3: ArgReg<'_, A3>, - a4: ArgReg<'_, A4>, - a5: ArgReg<'_, A5>, -) -> RetReg<R0> { - let r0; - asm!( - "mov {tmp}, r7", - "mov r7, {nr}", - "svc 0", - "mov r7, {tmp}", - nr = in(reg) nr.to_asm(), - tmp = out(reg) _, - inlateout("r0") a0.to_asm() => r0, - in("r1") a1.to_asm(), - in("r2") a2.to_asm(), - in("r3") a3.to_asm(), - in("r4") a4.to_asm(), - in("r5") a5.to_asm(), - options(nostack, preserves_flags) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall6_readonly( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, - a3: ArgReg<'_, A3>, - a4: ArgReg<'_, A4>, - a5: ArgReg<'_, A5>, -) -> RetReg<R0> { - let r0; - asm!( - "mov {tmp}, r7", - "mov r7, {nr}", - "svc 0", - "mov r7, {tmp}", - nr = in(reg) nr.to_asm(), - tmp = out(reg) _, - inlateout("r0") a0.to_asm() => r0, - in("r1") a1.to_asm(), - in("r2") a2.to_asm(), - in("r3") a3.to_asm(), - in("r4") a4.to_asm(), - in("r5") a5.to_asm(), - options(nostack, preserves_flags, readonly) - ); - FromAsm::from_asm(r0) -} diff --git a/vendor/rustix/src/backend/linux_raw/arch/x86.rs b/vendor/rustix/src/backend/linux_raw/arch/x86.rs deleted file mode 100644 index e789181..0000000 --- a/vendor/rustix/src/backend/linux_raw/arch/x86.rs +++ /dev/null @@ -1,489 +0,0 @@ -//! 32-bit x86 Linux system calls. -//! -//! There are two forms; `indirect_*` which take a callee, which allow calling -//! through the vDSO when possible, and plain forms, which use the `int 0x80` -//! instruction. -//! -//! Most `rustix` syscalls use the vsyscall mechanism rather than going using -//! `int 0x80` sequences, as vsyscall is much faster. -//! -//! Syscalls made with `int 0x80` preserve the flags register, while syscalls -//! made using vsyscall do not. - -#![allow(dead_code)] - -use crate::backend::reg::{ - ArgReg, FromAsm, RetReg, SyscallNumber, ToAsm, A0, A1, A2, A3, A4, A5, R0, -}; -use crate::backend::vdso_wrappers::SyscallType; -use core::arch::asm; - -#[inline] -pub(in crate::backend) unsafe fn indirect_syscall0( - callee: SyscallType, - nr: SyscallNumber<'_>, -) -> RetReg<R0> { - let r0; - asm!( - "call {callee}", - callee = in(reg) callee, - inlateout("eax") nr.to_asm() => r0, - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn indirect_syscall1( - callee: SyscallType, - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, -) -> RetReg<R0> { - let r0; - asm!( - "call {callee}", - callee = in(reg) callee, - inlateout("eax") nr.to_asm() => r0, - in("ebx") a0.to_asm(), - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn indirect_syscall1_noreturn( - callee: SyscallType, - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, -) -> ! { - asm!( - "call {callee}", - callee = in(reg) callee, - in("eax") nr.to_asm(), - in("ebx") a0.to_asm(), - options(noreturn) - ) -} - -#[inline] -pub(in crate::backend) unsafe fn indirect_syscall2( - callee: SyscallType, - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, -) -> RetReg<R0> { - let r0; - asm!( - "call {callee}", - callee = in(reg) callee, - inlateout("eax") nr.to_asm() => r0, - in("ebx") a0.to_asm(), - in("ecx") a1.to_asm(), - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn indirect_syscall3( - callee: SyscallType, - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, -) -> RetReg<R0> { - let r0; - asm!( - "call {callee}", - callee = in(reg) callee, - inlateout("eax") nr.to_asm() => r0, - in("ebx") a0.to_asm(), - in("ecx") a1.to_asm(), - in("edx") a2.to_asm(), - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn indirect_syscall4( - callee: SyscallType, - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, - a3: ArgReg<'_, A3>, -) -> RetReg<R0> { - let r0; - // a3 should go in esi, but `asm!` won't let us use it as an operand. - // Temporarily swap it into place, and then swap it back afterward. - // - // We hard-code the callee operand to use edi instead of `in(reg)` because - // even though we can't name esi as an operand, the compiler can use esi to - // satisfy `in(reg)`. - asm!( - "xchg esi, {a3}", - "call edi", - "xchg esi, {a3}", - a3 = in(reg) a3.to_asm(), - in("edi") callee, - inlateout("eax") nr.to_asm() => r0, - in("ebx") a0.to_asm(), - in("ecx") a1.to_asm(), - in("edx") a2.to_asm(), - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn indirect_syscall5( - callee: SyscallType, - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, - a3: ArgReg<'_, A3>, - a4: ArgReg<'_, A4>, -) -> RetReg<R0> { - let r0; - // Oof. a3 should go in esi, and `asm!` won't let us use that register as - // an operand. And we can't request stack slots. And there are no other - // registers free. Use eax as a temporary pointer to a slice, since it gets - // clobbered as the return value anyway. - asm!( - "push esi", - "push [eax + 0]", - "mov esi, [eax + 4]", - "mov eax, [eax + 8]", - "call [esp]", - "pop esi", - "pop esi", - inout("eax") &[callee as _, a3.to_asm(), nr.to_asm()] => r0, - in("ebx") a0.to_asm(), - in("ecx") a1.to_asm(), - in("edx") a2.to_asm(), - in("edi") a4.to_asm(), - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn indirect_syscall6( - callee: SyscallType, - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, - a3: ArgReg<'_, A3>, - a4: ArgReg<'_, A4>, - a5: ArgReg<'_, A5>, -) -> RetReg<R0> { - let r0; - // Oof again. a3 should go in esi, and a5 should go in ebp, and `asm!` - // won't let us use either of those registers as operands. And we can't - // request stack slots. And there are no other registers free. Use eax as a - // temporary pointer to a slice, since it gets clobbered as the return - // value anyway. - // - // This is another reason that syscalls should be compiler intrinsics - // rather than inline asm. - asm!( - "push ebp", - "push esi", - "push [eax + 0]", - "mov esi, [eax + 4]", - "mov ebp, [eax + 8]", - "mov eax, [eax + 12]", - "call [esp]", - "pop esi", - "pop esi", - "pop ebp", - inout("eax") &[callee as _, a3.to_asm(), a5.to_asm(), nr.to_asm()] => r0, - in("ebx") a0.to_asm(), - in("ecx") a1.to_asm(), - in("edx") a2.to_asm(), - in("edi") a4.to_asm(), - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall0_readonly(nr: SyscallNumber<'_>) -> RetReg<R0> { - let r0; - asm!( - "int $$0x80", - inlateout("eax") nr.to_asm() => r0, - options(nostack, preserves_flags, readonly) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall1(nr: SyscallNumber<'_>, a0: ArgReg<'_, A0>) -> RetReg<R0> { - let r0; - asm!( - "int $$0x80", - inlateout("eax") nr.to_asm() => r0, - in("ebx") a0.to_asm(), - options(nostack, preserves_flags) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall1_readonly( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, -) -> RetReg<R0> { - let r0; - asm!( - "int $$0x80", - inlateout("eax") nr.to_asm() => r0, - in("ebx") a0.to_asm(), - options(nostack, preserves_flags, readonly) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall1_noreturn(nr: SyscallNumber<'_>, a0: ArgReg<'_, A0>) -> ! { - asm!( - "int $$0x80", - in("eax") nr.to_asm(), - in("ebx") a0.to_asm(), - options(nostack, noreturn) - ) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall2( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, -) -> RetReg<R0> { - let r0; - asm!( - "int $$0x80", - inlateout("eax") nr.to_asm() => r0, - in("ebx") a0.to_asm(), - in("ecx") a1.to_asm(), - options(nostack, preserves_flags) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall2_readonly( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, -) -> RetReg<R0> { - let r0; - asm!( - "int $$0x80", - inlateout("eax") nr.to_asm() => r0, - in("ebx") a0.to_asm(), - in("ecx") a1.to_asm(), - options(nostack, preserves_flags, readonly) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall3( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, -) -> RetReg<R0> { - let r0; - asm!( - "int $$0x80", - inlateout("eax") nr.to_asm() => r0, - in("ebx") a0.to_asm(), - in("ecx") a1.to_asm(), - in("edx") a2.to_asm(), - options(nostack, preserves_flags) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall3_readonly( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, -) -> RetReg<R0> { - let r0; - asm!( - "int $$0x80", - inlateout("eax") nr.to_asm() => r0, - in("ebx") a0.to_asm(), - in("ecx") a1.to_asm(), - in("edx") a2.to_asm(), - options(nostack, preserves_flags, readonly) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall4( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, - a3: ArgReg<'_, A3>, -) -> RetReg<R0> { - let r0; - // a3 should go in esi, but `asm!` won't let us use it as an operand. - // Temporarily swap it into place, and then swap it back afterward. - asm!( - "xchg esi, {a3}", - "int $$0x80", - "xchg esi, {a3}", - a3 = in(reg) a3.to_asm(), - inlateout("eax") nr.to_asm() => r0, - in("ebx") a0.to_asm(), - in("ecx") a1.to_asm(), - in("edx") a2.to_asm(), - options(nostack, preserves_flags) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall4_readonly( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, - a3: ArgReg<'_, A3>, -) -> RetReg<R0> { - let r0; - asm!( - "xchg esi, {a3}", - "int $$0x80", - "xchg esi, {a3}", - a3 = in(reg) a3.to_asm(), - inlateout("eax") nr.to_asm() => r0, - in("ebx") a0.to_asm(), - in("ecx") a1.to_asm(), - in("edx") a2.to_asm(), - options(nostack, preserves_flags, readonly) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall5( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, - a3: ArgReg<'_, A3>, - a4: ArgReg<'_, A4>, -) -> RetReg<R0> { - let r0; - // As in `syscall4`, use xchg to handle a3. a4 should go in edi, and we can - // use that register as an operand. Unlike in `indirect_syscall5`, we don't - // have a `callee` operand taking up a register, so we have enough - // registers and don't need to use a slice. - asm!( - "xchg esi, {a3}", - "int $$0x80", - "xchg esi, {a3}", - a3 = in(reg) a3.to_asm(), - inlateout("eax") nr.to_asm() => r0, - in("ebx") a0.to_asm(), - in("ecx") a1.to_asm(), - in("edx") a2.to_asm(), - in("edi") a4.to_asm(), - options(nostack, preserves_flags) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall5_readonly( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, - a3: ArgReg<'_, A3>, - a4: ArgReg<'_, A4>, -) -> RetReg<R0> { - let r0; - // See the comments in `syscall5`. - asm!( - "xchg esi, {a3}", - "int $$0x80", - "xchg esi, {a3}", - a3 = in(reg) a3.to_asm(), - inlateout("eax") nr.to_asm() => r0, - in("ebx") a0.to_asm(), - in("ecx") a1.to_asm(), - in("edx") a2.to_asm(), - in("edi") a4.to_asm(), - options(nostack, preserves_flags, readonly) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall6( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, - a3: ArgReg<'_, A3>, - a4: ArgReg<'_, A4>, - a5: ArgReg<'_, A5>, -) -> RetReg<R0> { - let r0; - // See the comments in `indirect_syscall6`. - asm!( - "push ebp", - "push esi", - "mov esi, [eax + 0]", - "mov ebp, [eax + 4]", - "mov eax, [eax + 8]", - "int $$0x80", - "pop esi", - "pop ebp", - inout("eax") &[a3.to_asm(), a5.to_asm(), nr.to_asm()] => r0, - in("ebx") a0.to_asm(), - in("ecx") a1.to_asm(), - in("edx") a2.to_asm(), - in("edi") a4.to_asm(), - options(preserves_flags) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall6_readonly( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, - a3: ArgReg<'_, A3>, - a4: ArgReg<'_, A4>, - a5: ArgReg<'_, A5>, -) -> RetReg<R0> { - let r0; - // See the comments in `indirect_syscall6`. - asm!( - "push ebp", - "push esi", - "mov esi, [eax + 0]", - "mov ebp, [eax + 4]", - "mov eax, [eax + 8]", - "int $$0x80", - "pop esi", - "pop ebp", - inout("eax") &[a3.to_asm(), a5.to_asm(), nr.to_asm()] => r0, - in("ebx") a0.to_asm(), - in("ecx") a1.to_asm(), - in("edx") a2.to_asm(), - in("edi") a4.to_asm(), - options(preserves_flags, readonly) - ); - FromAsm::from_asm(r0) -} diff --git a/vendor/rustix/src/backend/linux_raw/arch/x86_64.rs b/vendor/rustix/src/backend/linux_raw/arch/x86_64.rs deleted file mode 100644 index 62f35d9..0000000 --- a/vendor/rustix/src/backend/linux_raw/arch/x86_64.rs +++ /dev/null @@ -1,293 +0,0 @@ -//! x86-64 Linux system calls. - -use crate::backend::reg::{ - ArgReg, FromAsm, RetReg, SyscallNumber, ToAsm, A0, A1, A2, A3, A4, A5, R0, -}; -use core::arch::asm; - -#[cfg(target_pointer_width = "32")] -compile_error!("x32 is not yet supported"); - -#[inline] -pub(in crate::backend) unsafe fn syscall0_readonly(nr: SyscallNumber<'_>) -> RetReg<R0> { - let r0; - asm!( - "syscall", - inlateout("rax") nr.to_asm() => r0, - lateout("rcx") _, - lateout("r11") _, - options(nostack, preserves_flags, readonly) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall1(nr: SyscallNumber<'_>, a0: ArgReg<'_, A0>) -> RetReg<R0> { - let r0; - asm!( - "syscall", - inlateout("rax") nr.to_asm() => r0, - in("rdi") a0.to_asm(), - lateout("rcx") _, - lateout("r11") _, - options(nostack, preserves_flags) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall1_readonly( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, -) -> RetReg<R0> { - let r0; - asm!( - "syscall", - inlateout("rax") nr.to_asm() => r0, - in("rdi") a0.to_asm(), - lateout("rcx") _, - lateout("r11") _, - options(nostack, preserves_flags, readonly) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall1_noreturn(nr: SyscallNumber<'_>, a0: ArgReg<'_, A0>) -> ! { - asm!( - "syscall", - in("rax") nr.to_asm(), - in("rdi") a0.to_asm(), - options(nostack, noreturn) - ) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall2( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, -) -> RetReg<R0> { - let r0; - asm!( - "syscall", - inlateout("rax") nr.to_asm() => r0, - in("rdi") a0.to_asm(), - in("rsi") a1.to_asm(), - lateout("rcx") _, - lateout("r11") _, - options(nostack, preserves_flags) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall2_readonly( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, -) -> RetReg<R0> { - let r0; - asm!( - "syscall", - inlateout("rax") nr.to_asm() => r0, - in("rdi") a0.to_asm(), - in("rsi") a1.to_asm(), - lateout("rcx") _, - lateout("r11") _, - options(nostack, preserves_flags, readonly) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall3( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, -) -> RetReg<R0> { - let r0; - asm!( - "syscall", - inlateout("rax") nr.to_asm() => r0, - in("rdi") a0.to_asm(), - in("rsi") a1.to_asm(), - in("rdx") a2.to_asm(), - lateout("rcx") _, - lateout("r11") _, - options(nostack, preserves_flags) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall3_readonly( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, -) -> RetReg<R0> { - let r0; - asm!( - "syscall", - inlateout("rax") nr.to_asm() => r0, - in("rdi") a0.to_asm(), - in("rsi") a1.to_asm(), - in("rdx") a2.to_asm(), - lateout("rcx") _, - lateout("r11") _, - options(nostack, preserves_flags, readonly) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall4( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, - a3: ArgReg<'_, A3>, -) -> RetReg<R0> { - let r0; - asm!( - "syscall", - inlateout("rax") nr.to_asm() => r0, - in("rdi") a0.to_asm(), - in("rsi") a1.to_asm(), - in("rdx") a2.to_asm(), - in("r10") a3.to_asm(), - lateout("rcx") _, - lateout("r11") _, - options(nostack, preserves_flags) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall4_readonly( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, - a3: ArgReg<'_, A3>, -) -> RetReg<R0> { - let r0; - asm!( - "syscall", - inlateout("rax") nr.to_asm() => r0, - in("rdi") a0.to_asm(), - in("rsi") a1.to_asm(), - in("rdx") a2.to_asm(), - in("r10") a3.to_asm(), - lateout("rcx") _, - lateout("r11") _, - options(nostack, preserves_flags, readonly) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall5( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, - a3: ArgReg<'_, A3>, - a4: ArgReg<'_, A4>, -) -> RetReg<R0> { - let r0; - asm!( - "syscall", - inlateout("rax") nr.to_asm() => r0, - in("rdi") a0.to_asm(), - in("rsi") a1.to_asm(), - in("rdx") a2.to_asm(), - in("r10") a3.to_asm(), - in("r8") a4.to_asm(), - lateout("rcx") _, - lateout("r11") _, - options(nostack, preserves_flags) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall5_readonly( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, - a3: ArgReg<'_, A3>, - a4: ArgReg<'_, A4>, -) -> RetReg<R0> { - let r0; - asm!( - "syscall", - inlateout("rax") nr.to_asm() => r0, - in("rdi") a0.to_asm(), - in("rsi") a1.to_asm(), - in("rdx") a2.to_asm(), - in("r10") a3.to_asm(), - in("r8") a4.to_asm(), - lateout("rcx") _, - lateout("r11") _, - options(nostack, preserves_flags, readonly) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall6( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, - a3: ArgReg<'_, A3>, - a4: ArgReg<'_, A4>, - a5: ArgReg<'_, A5>, -) -> RetReg<R0> { - let r0; - asm!( - "syscall", - inlateout("rax") nr.to_asm() => r0, - in("rdi") a0.to_asm(), - in("rsi") a1.to_asm(), - in("rdx") a2.to_asm(), - in("r10") a3.to_asm(), - in("r8") a4.to_asm(), - in("r9") a5.to_asm(), - lateout("rcx") _, - lateout("r11") _, - options(nostack, preserves_flags) - ); - FromAsm::from_asm(r0) -} - -#[inline] -pub(in crate::backend) unsafe fn syscall6_readonly( - nr: SyscallNumber<'_>, - a0: ArgReg<'_, A0>, - a1: ArgReg<'_, A1>, - a2: ArgReg<'_, A2>, - a3: ArgReg<'_, A3>, - a4: ArgReg<'_, A4>, - a5: ArgReg<'_, A5>, -) -> RetReg<R0> { - let r0; - asm!( - "syscall", - inlateout("rax") nr.to_asm() => r0, - in("rdi") a0.to_asm(), - in("rsi") a1.to_asm(), - in("rdx") a2.to_asm(), - in("r10") a3.to_asm(), - in("r8") a4.to_asm(), - in("r9") a5.to_asm(), - lateout("rcx") _, - lateout("r11") _, - options(nostack, preserves_flags, readonly) - ); - FromAsm::from_asm(r0) -} diff --git a/vendor/rustix/src/backend/linux_raw/c.rs b/vendor/rustix/src/backend/linux_raw/c.rs deleted file mode 100644 index edc9eb8..0000000 --- a/vendor/rustix/src/backend/linux_raw/c.rs +++ /dev/null @@ -1,304 +0,0 @@ -//! Adapt the Linux API to resemble a POSIX-style libc API. -//! -//! The linux_raw backend doesn't use actual libc; this just defines certain -//! types that are convenient to have defined. - -#![allow(unused_imports)] -#![allow(non_camel_case_types)] - -pub(crate) type size_t = usize; -pub(crate) use linux_raw_sys::ctypes::*; -pub(crate) use linux_raw_sys::errno::EINVAL; -pub(crate) use linux_raw_sys::ioctl::{FIONBIO, FIONREAD}; -// Import the kernel's `uid_t` and `gid_t` if they're 32-bit. -#[cfg(not(any(target_arch = "arm", target_arch = "sparc", target_arch = "x86")))] -pub(crate) use linux_raw_sys::general::{__kernel_gid_t as gid_t, __kernel_uid_t as uid_t}; -pub(crate) use linux_raw_sys::general::{ - __kernel_pid_t as pid_t, __kernel_time64_t as time_t, __kernel_timespec as timespec, iovec, - O_CLOEXEC, O_NOCTTY, O_NONBLOCK, O_RDWR, -}; - -#[cfg(feature = "event")] -#[cfg(test)] -pub(crate) use linux_raw_sys::general::epoll_event; - -#[cfg(any( - feature = "fs", - all( - not(feature = "use-libc-auxv"), - not(feature = "use-explicitly-provided-auxv"), - any( - feature = "param", - feature = "process", - feature = "runtime", - feature = "time", - target_arch = "x86", - ) - ) -))] -pub(crate) use linux_raw_sys::general::{ - AT_FDCWD, NFS_SUPER_MAGIC, O_LARGEFILE, PROC_SUPER_MAGIC, UTIME_NOW, UTIME_OMIT, XATTR_CREATE, - XATTR_REPLACE, -}; - -pub(crate) use linux_raw_sys::ioctl::{BLKPBSZGET, BLKSSZGET, FICLONE}; - -#[cfg(feature = "io_uring")] -pub(crate) use linux_raw_sys::{general::open_how, io_uring::*}; - -#[cfg(feature = "net")] -pub(crate) use linux_raw_sys::{ - cmsg_macros::*, - general::{O_CLOEXEC as SOCK_CLOEXEC, O_NONBLOCK as SOCK_NONBLOCK}, - if_ether::*, - net::{ - linger, msghdr, sockaddr, sockaddr_in, sockaddr_in6, sockaddr_un, socklen_t, AF_DECnet, - __kernel_sa_family_t as sa_family_t, __kernel_sockaddr_storage as sockaddr_storage, - cmsghdr, in6_addr, in_addr, ip_mreq, ip_mreq_source, ip_mreqn, ipv6_mreq, AF_APPLETALK, - AF_ASH, AF_ATMPVC, AF_ATMSVC, AF_AX25, AF_BLUETOOTH, AF_BRIDGE, AF_CAN, AF_ECONET, - AF_IEEE802154, AF_INET, AF_INET6, AF_IPX, AF_IRDA, AF_ISDN, AF_IUCV, AF_KEY, AF_LLC, - AF_NETBEUI, AF_NETLINK, AF_NETROM, AF_PACKET, AF_PHONET, AF_PPPOX, AF_RDS, AF_ROSE, - AF_RXRPC, AF_SECURITY, AF_SNA, AF_TIPC, AF_UNIX, AF_UNSPEC, AF_WANPIPE, AF_X25, - IP6T_SO_ORIGINAL_DST, IPPROTO_FRAGMENT, IPPROTO_ICMPV6, IPPROTO_MH, IPPROTO_ROUTING, - IPV6_ADD_MEMBERSHIP, IPV6_DROP_MEMBERSHIP, IPV6_FREEBIND, IPV6_MULTICAST_HOPS, - IPV6_MULTICAST_LOOP, IPV6_RECVTCLASS, IPV6_TCLASS, IPV6_UNICAST_HOPS, IPV6_V6ONLY, - IP_ADD_MEMBERSHIP, IP_ADD_SOURCE_MEMBERSHIP, IP_DROP_MEMBERSHIP, IP_DROP_SOURCE_MEMBERSHIP, - IP_FREEBIND, IP_MULTICAST_LOOP, IP_MULTICAST_TTL, IP_RECVTOS, IP_TOS, IP_TTL, - MSG_CMSG_CLOEXEC, MSG_CONFIRM, MSG_DONTROUTE, MSG_DONTWAIT, MSG_EOR, MSG_ERRQUEUE, - MSG_MORE, MSG_NOSIGNAL, MSG_OOB, MSG_PEEK, MSG_TRUNC, MSG_WAITALL, SCM_CREDENTIALS, - SCM_RIGHTS, SHUT_RD, SHUT_RDWR, SHUT_WR, SOCK_DGRAM, SOCK_RAW, SOCK_RDM, SOCK_SEQPACKET, - SOCK_STREAM, SOL_SOCKET, SO_ACCEPTCONN, SO_BROADCAST, SO_COOKIE, SO_DOMAIN, SO_ERROR, - SO_INCOMING_CPU, SO_KEEPALIVE, SO_LINGER, SO_OOBINLINE, SO_ORIGINAL_DST, SO_PASSCRED, - SO_PROTOCOL, SO_RCVBUF, SO_RCVTIMEO_NEW, SO_RCVTIMEO_NEW as SO_RCVTIMEO, SO_RCVTIMEO_OLD, - SO_REUSEADDR, SO_REUSEPORT, SO_SNDBUF, SO_SNDTIMEO_NEW, SO_SNDTIMEO_NEW as SO_SNDTIMEO, - SO_SNDTIMEO_OLD, SO_TYPE, TCP_CONGESTION, TCP_CORK, TCP_KEEPCNT, TCP_KEEPIDLE, - TCP_KEEPINTVL, TCP_NODELAY, TCP_QUICKACK, TCP_THIN_LINEAR_TIMEOUTS, TCP_USER_TIMEOUT, - }, - netlink::*, -}; - -// Cast away bindgen's `enum` type to make these consistent with the other -// `setsockopt`/`getsockopt` level values. -#[cfg(feature = "net")] -pub(crate) const IPPROTO_IP: u32 = linux_raw_sys::net::IPPROTO_IP as _; -#[cfg(feature = "net")] -pub(crate) const IPPROTO_ICMP: u32 = linux_raw_sys::net::IPPROTO_ICMP as _; -#[cfg(feature = "net")] -pub(crate) const IPPROTO_IGMP: u32 = linux_raw_sys::net::IPPROTO_IGMP as _; -#[cfg(feature = "net")] -pub(crate) const IPPROTO_IPIP: u32 = linux_raw_sys::net::IPPROTO_IPIP as _; -#[cfg(feature = "net")] -pub(crate) const IPPROTO_TCP: u32 = linux_raw_sys::net::IPPROTO_TCP as _; -#[cfg(feature = "net")] -pub(crate) const IPPROTO_EGP: u32 = linux_raw_sys::net::IPPROTO_EGP as _; -#[cfg(feature = "net")] -pub(crate) const IPPROTO_PUP: u32 = linux_raw_sys::net::IPPROTO_PUP as _; -#[cfg(feature = "net")] -pub(crate) const IPPROTO_UDP: u32 = linux_raw_sys::net::IPPROTO_UDP as _; -#[cfg(feature = "net")] -pub(crate) const IPPROTO_IDP: u32 = linux_raw_sys::net::IPPROTO_IDP as _; -#[cfg(feature = "net")] -pub(crate) const IPPROTO_TP: u32 = linux_raw_sys::net::IPPROTO_TP as _; -#[cfg(feature = "net")] -pub(crate) const IPPROTO_DCCP: u32 = linux_raw_sys::net::IPPROTO_DCCP as _; -#[cfg(feature = "net")] -pub(crate) const IPPROTO_IPV6: u32 = linux_raw_sys::net::IPPROTO_IPV6 as _; -#[cfg(feature = "net")] -pub(crate) const IPPROTO_RSVP: u32 = linux_raw_sys::net::IPPROTO_RSVP as _; -#[cfg(feature = "net")] -pub(crate) const IPPROTO_GRE: u32 = linux_raw_sys::net::IPPROTO_GRE as _; -#[cfg(feature = "net")] -pub(crate) const IPPROTO_ESP: u32 = linux_raw_sys::net::IPPROTO_ESP as _; -#[cfg(feature = "net")] -pub(crate) const IPPROTO_AH: u32 = linux_raw_sys::net::IPPROTO_AH as _; -#[cfg(feature = "net")] -pub(crate) const IPPROTO_MTP: u32 = linux_raw_sys::net::IPPROTO_MTP as _; -#[cfg(feature = "net")] -pub(crate) const IPPROTO_BEETPH: u32 = linux_raw_sys::net::IPPROTO_BEETPH as _; -#[cfg(feature = "net")] -pub(crate) const IPPROTO_ENCAP: u32 = linux_raw_sys::net::IPPROTO_ENCAP as _; -#[cfg(feature = "net")] -pub(crate) const IPPROTO_PIM: u32 = linux_raw_sys::net::IPPROTO_PIM as _; -#[cfg(feature = "net")] -pub(crate) const IPPROTO_COMP: u32 = linux_raw_sys::net::IPPROTO_COMP as _; -#[cfg(feature = "net")] -pub(crate) const IPPROTO_SCTP: u32 = linux_raw_sys::net::IPPROTO_SCTP as _; -#[cfg(feature = "net")] -pub(crate) const IPPROTO_UDPLITE: u32 = linux_raw_sys::net::IPPROTO_UDPLITE as _; -#[cfg(feature = "net")] -pub(crate) const IPPROTO_MPLS: u32 = linux_raw_sys::net::IPPROTO_MPLS as _; -#[cfg(feature = "net")] -pub(crate) const IPPROTO_ETHERNET: u32 = linux_raw_sys::net::IPPROTO_ETHERNET as _; -#[cfg(feature = "net")] -pub(crate) const IPPROTO_RAW: u32 = linux_raw_sys::net::IPPROTO_RAW as _; -#[cfg(feature = "net")] -pub(crate) const IPPROTO_MPTCP: u32 = linux_raw_sys::net::IPPROTO_MPTCP as _; - -#[cfg(any(feature = "process", feature = "runtime"))] -pub(crate) use linux_raw_sys::general::siginfo_t; - -#[cfg(any(feature = "process", feature = "runtime"))] -pub(crate) const EXIT_SUCCESS: c_int = 0; -#[cfg(any(feature = "process", feature = "runtime"))] -pub(crate) const EXIT_FAILURE: c_int = 1; -#[cfg(feature = "process")] -pub(crate) const EXIT_SIGNALED_SIGABRT: c_int = 128 + linux_raw_sys::general::SIGABRT as c_int; -#[cfg(feature = "runtime")] -pub(crate) const CLONE_CHILD_SETTID: c_int = linux_raw_sys::general::CLONE_CHILD_SETTID as c_int; - -#[cfg(feature = "process")] -pub(crate) use linux_raw_sys::{ - general::{ - CLD_CONTINUED, CLD_DUMPED, CLD_EXITED, CLD_KILLED, CLD_STOPPED, CLD_TRAPPED, - O_NONBLOCK as PIDFD_NONBLOCK, P_ALL, P_PGID, P_PID, P_PIDFD, - }, - ioctl::TIOCSCTTY, -}; - -#[cfg(feature = "pty")] -pub(crate) use linux_raw_sys::ioctl::TIOCGPTPEER; - -#[cfg(feature = "termios")] -pub(crate) use linux_raw_sys::{ - general::{ - cc_t, speed_t, tcflag_t, termios, termios2, winsize, B0, B1000000, B110, B115200, B1152000, - B1200, B134, B150, B1500000, B1800, B19200, B200, B2000000, B230400, B2400, B2500000, B300, - B3000000, B3500000, B38400, B4000000, B460800, B4800, B50, B500000, B57600, B576000, B600, - B75, B921600, B9600, BOTHER, BRKINT, BS0, BS1, BSDLY, CBAUD, CBAUDEX, CIBAUD, CLOCAL, - CMSPAR, CR0, CR1, CR2, CR3, CRDLY, CREAD, CRTSCTS, CS5, CS6, CS7, CS8, CSIZE, CSTOPB, ECHO, - ECHOCTL, ECHOE, ECHOK, ECHOKE, ECHONL, ECHOPRT, EXTA, EXTB, EXTPROC, FF0, FF1, FFDLY, - FLUSHO, HUPCL, IBSHIFT, ICANON, ICRNL, IEXTEN, IGNBRK, IGNCR, IGNPAR, IMAXBEL, INLCR, - INPCK, ISIG, ISTRIP, IUCLC, IUTF8, IXANY, IXOFF, IXON, NCCS, NL0, NL1, NLDLY, NOFLSH, - OCRNL, OFDEL, OFILL, OLCUC, ONLCR, ONLRET, ONOCR, OPOST, PARENB, PARMRK, PARODD, PENDIN, - TAB0, TAB1, TAB2, TAB3, TABDLY, TCIFLUSH, TCIOFF, TCIOFLUSH, TCION, TCOFLUSH, TCOOFF, - TCOON, TCSADRAIN, TCSAFLUSH, TCSANOW, TOSTOP, VDISCARD, VEOF, VEOL, VEOL2, VERASE, VINTR, - VKILL, VLNEXT, VMIN, VQUIT, VREPRINT, VSTART, VSTOP, VSUSP, VSWTC, VT0, VT1, VTDLY, VTIME, - VWERASE, XCASE, XTABS, - }, - ioctl::{TCGETS2, TCSETS2, TCSETSF2, TCSETSW2, TIOCEXCL, TIOCNXCL}, -}; - -// On MIPS, `TCSANOW` et al have `TCSETS` added to them, so we need it to -// subtract it out. -#[cfg(all( - feature = "termios", - any( - target_arch = "mips", - target_arch = "mips32r6", - target_arch = "mips64", - target_arch = "mips64r6" - ) -))] -pub(crate) use linux_raw_sys::ioctl::TCSETS; - -// Define our own `uid_t` and `gid_t` if the kernel's versions are not 32-bit. -#[cfg(any(target_arch = "arm", target_arch = "sparc", target_arch = "x86"))] -pub(crate) type uid_t = u32; -#[cfg(any(target_arch = "arm", target_arch = "sparc", target_arch = "x86"))] -pub(crate) type gid_t = u32; - -// Bindgen infers `u32` for many of these macro types which meant to be -// used with `c_int` in the C APIs, so cast them to `c_int`. - -// Convert the signal constants from `u32` to `c_int`. -pub(crate) const SIGHUP: c_int = linux_raw_sys::general::SIGHUP as _; -pub(crate) const SIGINT: c_int = linux_raw_sys::general::SIGINT as _; -pub(crate) const SIGQUIT: c_int = linux_raw_sys::general::SIGQUIT as _; -pub(crate) const SIGILL: c_int = linux_raw_sys::general::SIGILL as _; -pub(crate) const SIGTRAP: c_int = linux_raw_sys::general::SIGTRAP as _; -pub(crate) const SIGABRT: c_int = linux_raw_sys::general::SIGABRT as _; -pub(crate) const SIGBUS: c_int = linux_raw_sys::general::SIGBUS as _; -pub(crate) const SIGFPE: c_int = linux_raw_sys::general::SIGFPE as _; -pub(crate) const SIGKILL: c_int = linux_raw_sys::general::SIGKILL as _; -pub(crate) const SIGUSR1: c_int = linux_raw_sys::general::SIGUSR1 as _; -pub(crate) const SIGSEGV: c_int = linux_raw_sys::general::SIGSEGV as _; -pub(crate) const SIGUSR2: c_int = linux_raw_sys::general::SIGUSR2 as _; -pub(crate) const SIGPIPE: c_int = linux_raw_sys::general::SIGPIPE as _; -pub(crate) const SIGALRM: c_int = linux_raw_sys::general::SIGALRM as _; -pub(crate) const SIGTERM: c_int = linux_raw_sys::general::SIGTERM as _; -#[cfg(not(any( - target_arch = "mips", - target_arch = "mips32r6", - target_arch = "mips64", - target_arch = "mips64r6", - target_arch = "sparc", - target_arch = "sparc64" -)))] -pub(crate) const SIGSTKFLT: c_int = linux_raw_sys::general::SIGSTKFLT as _; -pub(crate) const SIGCHLD: c_int = linux_raw_sys::general::SIGCHLD as _; -pub(crate) const SIGCONT: c_int = linux_raw_sys::general::SIGCONT as _; -pub(crate) const SIGSTOP: c_int = linux_raw_sys::general::SIGSTOP as _; -pub(crate) const SIGTSTP: c_int = linux_raw_sys::general::SIGTSTP as _; -pub(crate) const SIGTTIN: c_int = linux_raw_sys::general::SIGTTIN as _; -pub(crate) const SIGTTOU: c_int = linux_raw_sys::general::SIGTTOU as _; -pub(crate) const SIGURG: c_int = linux_raw_sys::general::SIGURG as _; -pub(crate) const SIGXCPU: c_int = linux_raw_sys::general::SIGXCPU as _; -pub(crate) const SIGXFSZ: c_int = linux_raw_sys::general::SIGXFSZ as _; -pub(crate) const SIGVTALRM: c_int = linux_raw_sys::general::SIGVTALRM as _; -pub(crate) const SIGPROF: c_int = linux_raw_sys::general::SIGPROF as _; -pub(crate) const SIGWINCH: c_int = linux_raw_sys::general::SIGWINCH as _; -pub(crate) const SIGIO: c_int = linux_raw_sys::general::SIGIO as _; -pub(crate) const SIGPWR: c_int = linux_raw_sys::general::SIGPWR as _; -pub(crate) const SIGSYS: c_int = linux_raw_sys::general::SIGSYS as _; -#[cfg(any( - target_arch = "mips", - target_arch = "mips32r6", - target_arch = "mips64", - target_arch = "mips64r6", - target_arch = "sparc", - target_arch = "sparc64" -))] -pub(crate) const SIGEMT: c_int = linux_raw_sys::general::SIGEMT as _; - -#[cfg(feature = "stdio")] -pub(crate) const STDIN_FILENO: c_int = linux_raw_sys::general::STDIN_FILENO as _; -#[cfg(feature = "stdio")] -pub(crate) const STDOUT_FILENO: c_int = linux_raw_sys::general::STDOUT_FILENO as _; -#[cfg(feature = "stdio")] -pub(crate) const STDERR_FILENO: c_int = linux_raw_sys::general::STDERR_FILENO as _; - -pub(crate) const PIPE_BUF: usize = linux_raw_sys::general::PIPE_BUF as _; - -pub(crate) const CLOCK_MONOTONIC: c_int = linux_raw_sys::general::CLOCK_MONOTONIC as _; -pub(crate) const CLOCK_REALTIME: c_int = linux_raw_sys::general::CLOCK_REALTIME as _; -pub(crate) const CLOCK_MONOTONIC_RAW: c_int = linux_raw_sys::general::CLOCK_MONOTONIC_RAW as _; -pub(crate) const CLOCK_MONOTONIC_COARSE: c_int = - linux_raw_sys::general::CLOCK_MONOTONIC_COARSE as _; -pub(crate) const CLOCK_REALTIME_COARSE: c_int = linux_raw_sys::general::CLOCK_REALTIME_COARSE as _; -pub(crate) const CLOCK_THREAD_CPUTIME_ID: c_int = - linux_raw_sys::general::CLOCK_THREAD_CPUTIME_ID as _; -pub(crate) const CLOCK_PROCESS_CPUTIME_ID: c_int = - linux_raw_sys::general::CLOCK_PROCESS_CPUTIME_ID as _; -#[cfg(any(feature = "thread", feature = "time", target_arch = "x86"))] -pub(crate) const CLOCK_BOOTTIME: c_int = linux_raw_sys::general::CLOCK_BOOTTIME as _; -#[cfg(any(feature = "thread", feature = "time", target_arch = "x86"))] -pub(crate) const CLOCK_BOOTTIME_ALARM: c_int = linux_raw_sys::general::CLOCK_BOOTTIME_ALARM as _; -#[cfg(any(feature = "thread", feature = "time", target_arch = "x86"))] -pub(crate) const CLOCK_TAI: c_int = linux_raw_sys::general::CLOCK_TAI as _; -#[cfg(any(feature = "thread", feature = "time", target_arch = "x86"))] -pub(crate) const CLOCK_REALTIME_ALARM: c_int = linux_raw_sys::general::CLOCK_REALTIME_ALARM as _; - -#[cfg(feature = "system")] -mod reboot_symbols { - use super::c_int; - - pub(crate) const LINUX_REBOOT_MAGIC1: c_int = linux_raw_sys::general::LINUX_REBOOT_MAGIC1 as _; - pub(crate) const LINUX_REBOOT_MAGIC2: c_int = linux_raw_sys::general::LINUX_REBOOT_MAGIC2 as _; - - pub(crate) const LINUX_REBOOT_CMD_RESTART: c_int = - linux_raw_sys::general::LINUX_REBOOT_CMD_RESTART as _; - pub(crate) const LINUX_REBOOT_CMD_HALT: c_int = - linux_raw_sys::general::LINUX_REBOOT_CMD_HALT as _; - pub(crate) const LINUX_REBOOT_CMD_CAD_ON: c_int = - linux_raw_sys::general::LINUX_REBOOT_CMD_CAD_ON as _; - pub(crate) const LINUX_REBOOT_CMD_CAD_OFF: c_int = - linux_raw_sys::general::LINUX_REBOOT_CMD_CAD_OFF as _; - pub(crate) const LINUX_REBOOT_CMD_POWER_OFF: c_int = - linux_raw_sys::general::LINUX_REBOOT_CMD_POWER_OFF as _; - pub(crate) const LINUX_REBOOT_CMD_SW_SUSPEND: c_int = - linux_raw_sys::general::LINUX_REBOOT_CMD_SW_SUSPEND as _; - pub(crate) const LINUX_REBOOT_CMD_KEXEC: c_int = - linux_raw_sys::general::LINUX_REBOOT_CMD_KEXEC as _; -} -#[cfg(feature = "system")] -pub(crate) use reboot_symbols::*; diff --git a/vendor/rustix/src/backend/linux_raw/conv.rs b/vendor/rustix/src/backend/linux_raw/conv.rs deleted file mode 100644 index f0de45a..0000000 --- a/vendor/rustix/src/backend/linux_raw/conv.rs +++ /dev/null @@ -1,1019 +0,0 @@ -//! Convert values to [`ArgReg`] and from [`RetReg`]. -//! -//! System call arguments and return values are all communicated with inline -//! asm and FFI as `*mut Opaque`. To protect these raw pointers from escaping -//! or being accidentally misused as they travel through the code, we wrap them -//! in [`ArgReg`] and [`RetReg`] structs. This file provides `From` -//! implementations and explicit conversion functions for converting values -//! into and out of these wrapper structs. -//! -//! # Safety -//! -//! Some of this code is `unsafe` in order to work with raw file descriptors, -//! and some is `unsafe` to interpret the values in a `RetReg`. -#![allow(unsafe_code)] - -use super::c; -use super::fd::{AsRawFd, BorrowedFd, FromRawFd, RawFd}; -#[cfg(any(feature = "event", feature = "runtime"))] -use super::io::errno::try_decode_error; -#[cfg(target_pointer_width = "64")] -use super::io::errno::try_decode_u64; -#[cfg(not(debug_assertions))] -use super::io::errno::{ - decode_c_int_infallible, decode_c_uint_infallible, decode_usize_infallible, -}; -use super::io::errno::{ - try_decode_c_int, try_decode_c_uint, try_decode_raw_fd, try_decode_usize, try_decode_void, - try_decode_void_star, -}; -use super::reg::{raw_arg, ArgNumber, ArgReg, RetReg, R0}; -#[cfg(feature = "time")] -use super::time::types::TimerfdClockId; -#[cfg(any(feature = "thread", feature = "time", target_arch = "x86"))] -use crate::clockid::ClockId; -use crate::fd::OwnedFd; -use crate::ffi::CStr; -use crate::io; -#[cfg(any(feature = "process", feature = "runtime", feature = "termios"))] -use crate::pid::Pid; -#[cfg(feature = "process")] -use crate::process::Resource; -#[cfg(any(feature = "process", feature = "runtime"))] -use crate::signal::Signal; -use crate::utils::{as_mut_ptr, as_ptr}; -use core::mem::MaybeUninit; -use core::ptr::null_mut; -#[cfg(any(feature = "thread", feature = "time", target_arch = "x86"))] -use linux_raw_sys::general::__kernel_clockid_t; -#[cfg(target_pointer_width = "64")] -use linux_raw_sys::general::__kernel_loff_t; -#[cfg(feature = "net")] -use linux_raw_sys::net::socklen_t; - -/// Convert `SYS_*` constants for socketcall. -#[cfg(target_arch = "x86")] -#[inline] -pub(super) fn x86_sys<'a, Num: ArgNumber>(sys: u32) -> ArgReg<'a, Num> { - pass_usize(sys as usize) -} - -/// Pass the "low" half of the endian-specific memory encoding of a `u64`, for -/// 32-bit architectures. -#[cfg(target_pointer_width = "32")] -#[inline] -pub(super) fn lo<'a, Num: ArgNumber>(x: u64) -> ArgReg<'a, Num> { - #[cfg(target_endian = "little")] - let x = x >> 32; - #[cfg(target_endian = "big")] - let x = x & 0xffff_ffff; - - pass_usize(x as usize) -} - -/// Pass the "high" half of the endian-specific memory encoding of a `u64`, for -/// 32-bit architectures. -#[cfg(target_pointer_width = "32")] -#[inline] -pub(super) fn hi<'a, Num: ArgNumber>(x: u64) -> ArgReg<'a, Num> { - #[cfg(target_endian = "little")] - let x = x & 0xffff_ffff; - #[cfg(target_endian = "big")] - let x = x >> 32; - - pass_usize(x as usize) -} - -/// Pass a zero, or null, argument. -#[inline] -pub(super) fn zero<'a, Num: ArgNumber>() -> ArgReg<'a, Num> { - raw_arg(null_mut()) -} - -/// Pass the `mem::size_of` of a type. -#[inline] -pub(super) fn size_of<'a, T: Sized, Num: ArgNumber>() -> ArgReg<'a, Num> { - pass_usize(core::mem::size_of::<T>()) -} - -/// Pass an arbitrary `usize` value. -/// -/// For passing pointers, use `void_star` or other functions which take a raw -/// pointer instead of casting to `usize`, so that provenance is preserved. -#[inline] -pub(super) fn pass_usize<'a, Num: ArgNumber>(t: usize) -> ArgReg<'a, Num> { - raw_arg(t as *mut _) -} - -impl<'a, Num: ArgNumber, T> From<*mut T> for ArgReg<'a, Num> { - #[inline] - fn from(c: *mut T) -> ArgReg<'a, Num> { - raw_arg(c.cast()) - } -} - -impl<'a, Num: ArgNumber, T> From<*const T> for ArgReg<'a, Num> { - #[inline] - fn from(c: *const T) -> ArgReg<'a, Num> { - let mut_ptr = c as *mut T; - raw_arg(mut_ptr.cast()) - } -} - -impl<'a, Num: ArgNumber> From<&'a CStr> for ArgReg<'a, Num> { - #[inline] - fn from(c: &'a CStr) -> Self { - let mut_ptr = c.as_ptr() as *mut u8; - raw_arg(mut_ptr.cast()) - } -} - -impl<'a, Num: ArgNumber> From<Option<&'a CStr>> for ArgReg<'a, Num> { - #[inline] - fn from(t: Option<&'a CStr>) -> Self { - raw_arg(match t { - Some(s) => { - let mut_ptr = s.as_ptr() as *mut u8; - mut_ptr.cast() - } - None => null_mut(), - }) - } -} - -/// Pass a borrowed file-descriptor argument. -impl<'a, Num: ArgNumber> From<BorrowedFd<'a>> for ArgReg<'a, Num> { - #[inline] - fn from(fd: BorrowedFd<'a>) -> Self { - // SAFETY: `BorrowedFd` ensures that the file descriptor is valid, and - // the lifetime parameter on the resulting `ArgReg` ensures that the - // result is bounded by the `BorrowedFd`'s lifetime. - unsafe { raw_fd(fd.as_raw_fd()) } - } -} - -/// Pass a raw file-descriptor argument. Most users should use [`ArgReg::from`] -/// instead, to preserve I/O safety as long as possible. -/// -/// # Safety -/// -/// `fd` must be a valid open file descriptor. -#[inline] -pub(super) unsafe fn raw_fd<'a, Num: ArgNumber>(fd: RawFd) -> ArgReg<'a, Num> { - // Use `no_fd` when passing `-1` is intended. - #[cfg(feature = "fs")] - debug_assert!(fd == crate::fs::CWD.as_raw_fd() || fd >= 0); - - // Don't pass the `io_uring_register_files_skip` sentry value this way. - #[cfg(feature = "io_uring")] - debug_assert_ne!( - fd, - crate::io_uring::io_uring_register_files_skip().as_raw_fd() - ); - - // Linux doesn't look at the high bits beyond the `c_int`, so use - // zero-extension rather than sign-extension because it's a smaller - // instruction. - let fd: c::c_int = fd; - pass_usize(fd as c::c_uint as usize) -} - -/// Deliberately pass `-1` to a file-descriptor argument, for system calls -/// like `mmap` where this indicates the argument is omitted. -#[inline] -pub(super) fn no_fd<'a, Num: ArgNumber>() -> ArgReg<'a, Num> { - pass_usize(!0_usize) -} - -#[inline] -pub(super) fn slice_just_addr<T: Sized, Num: ArgNumber>(v: &[T]) -> ArgReg<'_, Num> { - let mut_ptr = v.as_ptr() as *mut T; - raw_arg(mut_ptr.cast()) -} - -#[inline] -pub(super) fn slice_just_addr_mut<T: Sized, Num: ArgNumber>(v: &mut [T]) -> ArgReg<'_, Num> { - raw_arg(v.as_mut_ptr().cast()) -} - -#[inline] -pub(super) fn slice<T: Sized, Num0: ArgNumber, Num1: ArgNumber>( - v: &[T], -) -> (ArgReg<'_, Num0>, ArgReg<'_, Num1>) { - (slice_just_addr(v), pass_usize(v.len())) -} - -#[inline] -pub(super) fn slice_mut<T: Sized, Num0: ArgNumber, Num1: ArgNumber>( - v: &mut [T], -) -> (ArgReg<'_, Num0>, ArgReg<'_, Num1>) { - (raw_arg(v.as_mut_ptr().cast()), pass_usize(v.len())) -} - -#[inline] -pub(super) fn by_ref<T: Sized, Num: ArgNumber>(t: &T) -> ArgReg<'_, Num> { - let mut_ptr = as_ptr(t) as *mut T; - raw_arg(mut_ptr.cast()) -} - -#[inline] -pub(super) fn by_mut<T: Sized, Num: ArgNumber>(t: &mut T) -> ArgReg<'_, Num> { - raw_arg(as_mut_ptr(t).cast()) -} - -/// Convert an optional mutable reference into a `usize` for passing to a -/// syscall. -#[inline] -pub(super) fn opt_mut<T: Sized, Num: ArgNumber>(t: Option<&mut T>) -> ArgReg<'_, Num> { - // This optimizes into the equivalent of `transmute(t)`, and has the - // advantage of not requiring `unsafe`. - match t { - Some(t) => by_mut(t), - None => raw_arg(null_mut()), - } -} - -/// Convert an optional immutable reference into a `usize` for passing to a -/// syscall. -#[cfg(any(target_arch = "aarch64", target_arch = "riscv64"))] -#[inline] -pub(super) fn opt_ref<T: Sized, Num: ArgNumber>(t: Option<&T>) -> ArgReg<'_, Num> { - // This optimizes into the equivalent of `transmute(t)`, and has the - // advantage of not requiring `unsafe`. - match t { - Some(t) => by_ref(t), - None => raw_arg(null_mut()), - } -} - -/// Convert a `c_int` into an `ArgReg`. -/// -/// Be sure to use `raw_fd` to pass `RawFd` values. -#[inline] -pub(super) fn c_int<'a, Num: ArgNumber>(i: c::c_int) -> ArgReg<'a, Num> { - pass_usize(i as usize) -} - -/// Convert a `c_uint` into an `ArgReg`. -#[inline] -pub(super) fn c_uint<'a, Num: ArgNumber>(i: c::c_uint) -> ArgReg<'a, Num> { - pass_usize(i as usize) -} - -#[cfg(target_pointer_width = "64")] -#[inline] -pub(super) fn loff_t<'a, Num: ArgNumber>(i: __kernel_loff_t) -> ArgReg<'a, Num> { - pass_usize(i as usize) -} - -#[cfg(target_pointer_width = "64")] -#[inline] -pub(super) fn loff_t_from_u64<'a, Num: ArgNumber>(i: u64) -> ArgReg<'a, Num> { - // `loff_t` is signed, but syscalls which expect `loff_t` return `EINVAL` - // if it's outside the signed `i64` range, so we can silently cast. - pass_usize(i as usize) -} - -#[cfg(any(feature = "thread", feature = "time", target_arch = "x86"))] -impl<'a, Num: ArgNumber> From<ClockId> for ArgReg<'a, Num> { - #[inline] - fn from(i: ClockId) -> Self { - pass_usize(i as __kernel_clockid_t as usize) - } -} - -#[cfg(feature = "time")] -impl<'a, Num: ArgNumber> From<TimerfdClockId> for ArgReg<'a, Num> { - #[inline] - fn from(i: TimerfdClockId) -> Self { - pass_usize(i as __kernel_clockid_t as usize) - } -} - -#[cfg(feature = "net")] -#[inline] -pub(super) fn socklen_t<'a, Num: ArgNumber>(i: socklen_t) -> ArgReg<'a, Num> { - pass_usize(i as usize) -} - -#[cfg(any( - feature = "fs", - all( - not(feature = "use-libc-auxv"), - not(feature = "use-explicitly-provided-auxv"), - any( - feature = "param", - feature = "process", - feature = "runtime", - feature = "time", - target_arch = "x86", - ) - ) -))] -pub(crate) mod fs { - use super::*; - use crate::fs::{FileType, Mode, OFlags}; - #[cfg(target_pointer_width = "32")] - use linux_raw_sys::general::O_LARGEFILE; - - impl<'a, Num: ArgNumber> From<Mode> for ArgReg<'a, Num> { - #[inline] - fn from(mode: Mode) -> Self { - pass_usize(mode.bits() as usize) - } - } - - impl<'a, Num: ArgNumber> From<(Mode, FileType)> for ArgReg<'a, Num> { - #[inline] - fn from(pair: (Mode, FileType)) -> Self { - pass_usize(pair.0.as_raw_mode() as usize | pair.1.as_raw_mode() as usize) - } - } - - impl<'a, Num: ArgNumber> From<crate::fs::AtFlags> for ArgReg<'a, Num> { - #[inline] - fn from(flags: crate::fs::AtFlags) -> Self { - c_uint(flags.bits()) - } - } - - impl<'a, Num: ArgNumber> From<crate::fs::XattrFlags> for ArgReg<'a, Num> { - #[inline] - fn from(flags: crate::fs::XattrFlags) -> Self { - c_uint(flags.bits()) - } - } - - impl<'a, Num: ArgNumber> From<crate::fs::inotify::CreateFlags> for ArgReg<'a, Num> { - #[inline] - fn from(flags: crate::fs::inotify::CreateFlags) -> Self { - c_uint(flags.bits()) - } - } - - impl<'a, Num: ArgNumber> From<crate::fs::inotify::WatchFlags> for ArgReg<'a, Num> { - #[inline] - fn from(flags: crate::fs::inotify::WatchFlags) -> Self { - c_uint(flags.bits()) - } - } - - impl<'a, Num: ArgNumber> From<crate::fs::MemfdFlags> for ArgReg<'a, Num> { - #[inline] - fn from(flags: crate::fs::MemfdFlags) -> Self { - c_uint(flags.bits()) - } - } - - impl<'a, Num: ArgNumber> From<crate::fs::RenameFlags> for ArgReg<'a, Num> { - #[inline] - fn from(flags: crate::fs::RenameFlags) -> Self { - c_uint(flags.bits()) - } - } - - impl<'a, Num: ArgNumber> From<crate::fs::StatxFlags> for ArgReg<'a, Num> { - #[inline] - fn from(flags: crate::fs::StatxFlags) -> Self { - c_uint(flags.bits()) - } - } - - #[cfg(target_pointer_width = "32")] - #[inline] - fn oflags_bits(oflags: OFlags) -> c::c_uint { - let mut bits = oflags.bits(); - // Add `O_LARGEFILE`, unless `O_PATH` is set, as Linux returns `EINVAL` - // when both are set. - if !oflags.contains(OFlags::PATH) { - bits |= O_LARGEFILE; - } - bits - } - - #[cfg(target_pointer_width = "64")] - #[inline] - const fn oflags_bits(oflags: OFlags) -> c::c_uint { - oflags.bits() - } - - impl<'a, Num: ArgNumber> From<OFlags> for ArgReg<'a, Num> { - #[inline] - fn from(oflags: OFlags) -> Self { - pass_usize(oflags_bits(oflags) as usize) - } - } - - /// Convert an `OFlags` into a `u64` for use in the `open_how` struct. - #[inline] - pub(crate) fn oflags_for_open_how(oflags: OFlags) -> u64 { - u64::from(oflags_bits(oflags)) - } - - impl<'a, Num: ArgNumber> From<crate::fs::FallocateFlags> for ArgReg<'a, Num> { - #[inline] - fn from(flags: crate::fs::FallocateFlags) -> Self { - c_uint(flags.bits()) - } - } - - impl<'a, Num: ArgNumber> From<crate::fs::Advice> for ArgReg<'a, Num> { - #[inline] - fn from(advice: crate::fs::Advice) -> Self { - c_uint(advice as c::c_uint) - } - } - - impl<'a, Num: ArgNumber> From<crate::fs::SealFlags> for ArgReg<'a, Num> { - #[inline] - fn from(flags: crate::fs::SealFlags) -> Self { - c_uint(flags.bits()) - } - } - - impl<'a, Num: ArgNumber> From<crate::fs::Access> for ArgReg<'a, Num> { - #[inline] - fn from(access: crate::fs::Access) -> Self { - c_uint(access.bits()) - } - } -} - -#[cfg(any(feature = "fs", feature = "mount"))] -impl<'a, Num: ArgNumber> From<crate::backend::mount::types::MountFlagsArg> for ArgReg<'a, Num> { - #[inline] - fn from(flags: crate::backend::mount::types::MountFlagsArg) -> Self { - c_uint(flags.0) - } -} - -// When the deprecated "fs" aliases are removed, we can remove the "fs" -// here too. -#[cfg(any(feature = "fs", feature = "mount"))] -impl<'a, Num: ArgNumber> From<crate::backend::mount::types::UnmountFlags> for ArgReg<'a, Num> { - #[inline] - fn from(flags: crate::backend::mount::types::UnmountFlags) -> Self { - c_uint(flags.bits()) - } -} - -#[cfg(feature = "mount")] -impl<'a, Num: ArgNumber> From<crate::mount::FsConfigCmd> for ArgReg<'a, Num> { - #[inline] - fn from(cmd: crate::mount::FsConfigCmd) -> Self { - c_uint(cmd as c::c_uint) - } -} - -#[cfg(feature = "mount")] -impl<'a, Num: ArgNumber> From<crate::backend::mount::types::FsOpenFlags> for ArgReg<'a, Num> { - #[inline] - fn from(flags: crate::backend::mount::types::FsOpenFlags) -> Self { - c_uint(flags.bits()) - } -} - -#[cfg(feature = "mount")] -impl<'a, Num: ArgNumber> From<crate::backend::mount::types::FsMountFlags> for ArgReg<'a, Num> { - #[inline] - fn from(flags: crate::backend::mount::types::FsMountFlags) -> Self { - c_uint(flags.bits()) - } -} - -#[cfg(feature = "mount")] -impl<'a, Num: ArgNumber> From<crate::backend::mount::types::MountAttrFlags> for ArgReg<'a, Num> { - #[inline] - fn from(flags: crate::backend::mount::types::MountAttrFlags) -> Self { - c_uint(flags.bits()) - } -} - -#[cfg(feature = "mount")] -impl<'a, Num: ArgNumber> From<crate::backend::mount::types::OpenTreeFlags> for ArgReg<'a, Num> { - #[inline] - fn from(flags: crate::backend::mount::types::OpenTreeFlags) -> Self { - c_uint(flags.bits()) - } -} - -#[cfg(feature = "mount")] -impl<'a, Num: ArgNumber> From<crate::backend::mount::types::FsPickFlags> for ArgReg<'a, Num> { - #[inline] - fn from(flags: crate::backend::mount::types::FsPickFlags) -> Self { - c_uint(flags.bits()) - } -} - -#[cfg(feature = "mount")] -impl<'a, Num: ArgNumber> From<crate::backend::mount::types::MoveMountFlags> for ArgReg<'a, Num> { - #[inline] - fn from(flags: crate::backend::mount::types::MoveMountFlags) -> Self { - c_uint(flags.bits()) - } -} - -impl<'a, Num: ArgNumber> From<crate::io::FdFlags> for ArgReg<'a, Num> { - #[inline] - fn from(flags: crate::io::FdFlags) -> Self { - c_uint(flags.bits()) - } -} - -#[cfg(feature = "pipe")] -impl<'a, Num: ArgNumber> From<crate::pipe::PipeFlags> for ArgReg<'a, Num> { - #[inline] - fn from(flags: crate::pipe::PipeFlags) -> Self { - c_uint(flags.bits()) - } -} - -#[cfg(feature = "pipe")] -impl<'a, Num: ArgNumber> From<crate::pipe::SpliceFlags> for ArgReg<'a, Num> { - #[inline] - fn from(flags: crate::pipe::SpliceFlags) -> Self { - c_uint(flags.bits()) - } -} - -impl<'a, Num: ArgNumber> From<crate::io::DupFlags> for ArgReg<'a, Num> { - #[inline] - fn from(flags: crate::io::DupFlags) -> Self { - c_uint(flags.bits()) - } -} - -impl<'a, Num: ArgNumber> From<crate::io::ReadWriteFlags> for ArgReg<'a, Num> { - #[inline] - fn from(flags: crate::io::ReadWriteFlags) -> Self { - c_uint(flags.bits()) - } -} - -#[cfg(feature = "process")] -impl<'a, Num: ArgNumber> From<crate::process::PidfdFlags> for ArgReg<'a, Num> { - #[inline] - fn from(flags: crate::process::PidfdFlags) -> Self { - c_uint(flags.bits()) - } -} - -#[cfg(feature = "pty")] -impl<'a, Num: ArgNumber> From<crate::pty::OpenptFlags> for ArgReg<'a, Num> { - #[inline] - fn from(flags: crate::pty::OpenptFlags) -> Self { - c_uint(flags.bits()) - } -} - -#[cfg(feature = "thread")] -impl<'a, Num: ArgNumber> From<crate::thread::UnshareFlags> for ArgReg<'a, Num> { - #[inline] - fn from(flags: crate::thread::UnshareFlags) -> Self { - c_uint(flags.bits()) - } -} - -#[cfg(feature = "event")] -impl<'a, Num: ArgNumber> From<crate::event::EventfdFlags> for ArgReg<'a, Num> { - #[inline] - fn from(flags: crate::event::EventfdFlags) -> Self { - c_uint(flags.bits()) - } -} - -#[cfg(feature = "event")] -impl<'a, Num: ArgNumber> From<crate::event::epoll::CreateFlags> for ArgReg<'a, Num> { - #[inline] - fn from(flags: crate::event::epoll::CreateFlags) -> Self { - c_uint(flags.bits()) - } -} - -#[cfg(feature = "mm")] -impl<'a, Num: ArgNumber> From<crate::backend::mm::types::ProtFlags> for ArgReg<'a, Num> { - #[inline] - fn from(flags: crate::backend::mm::types::ProtFlags) -> Self { - c_uint(flags.bits()) - } -} - -#[cfg(feature = "mm")] -impl<'a, Num: ArgNumber> From<crate::backend::mm::types::MsyncFlags> for ArgReg<'a, Num> { - #[inline] - fn from(flags: crate::backend::mm::types::MsyncFlags) -> Self { - c_uint(flags.bits()) - } -} - -#[cfg(feature = "mm")] -impl<'a, Num: ArgNumber> From<crate::backend::mm::types::MremapFlags> for ArgReg<'a, Num> { - #[inline] - fn from(flags: crate::backend::mm::types::MremapFlags) -> Self { - c_uint(flags.bits()) - } -} - -#[cfg(feature = "mm")] -impl<'a, Num: ArgNumber> From<crate::backend::mm::types::MlockFlags> for ArgReg<'a, Num> { - #[inline] - fn from(flags: crate::backend::mm::types::MlockFlags) -> Self { - c_uint(flags.bits()) - } -} - -#[cfg(feature = "mm")] -impl<'a, Num: ArgNumber> From<crate::backend::mm::types::MlockAllFlags> for ArgReg<'a, Num> { - #[inline] - fn from(flags: crate::backend::mm::types::MlockAllFlags) -> Self { - c_uint(flags.bits()) - } -} - -#[cfg(feature = "mm")] -impl<'a, Num: ArgNumber> From<crate::backend::mm::types::MapFlags> for ArgReg<'a, Num> { - #[inline] - fn from(flags: crate::backend::mm::types::MapFlags) -> Self { - c_uint(flags.bits()) - } -} - -#[cfg(feature = "mm")] -impl<'a, Num: ArgNumber> From<crate::backend::mm::types::MprotectFlags> for ArgReg<'a, Num> { - #[inline] - fn from(flags: crate::backend::mm::types::MprotectFlags) -> Self { - c_uint(flags.bits()) - } -} - -#[cfg(feature = "mm")] -impl<'a, Num: ArgNumber> From<crate::backend::mm::types::UserfaultfdFlags> for ArgReg<'a, Num> { - #[inline] - fn from(flags: crate::backend::mm::types::UserfaultfdFlags) -> Self { - c_uint(flags.bits()) - } -} - -#[cfg(feature = "process")] -impl<'a, Num: ArgNumber> From<crate::backend::process::types::MembarrierCommand> - for ArgReg<'a, Num> -{ - #[inline] - fn from(cmd: crate::backend::process::types::MembarrierCommand) -> Self { - c_uint(cmd as u32) - } -} - -#[cfg(feature = "process")] -impl<'a, Num: ArgNumber> From<crate::process::Cpuid> for ArgReg<'a, Num> { - #[inline] - fn from(cpuid: crate::process::Cpuid) -> Self { - c_uint(cpuid.as_raw()) - } -} - -#[cfg(target_pointer_width = "64")] -#[inline] -pub(super) fn dev_t<'a, Num: ArgNumber>(dev: u64) -> ArgReg<'a, Num> { - pass_usize(dev as usize) -} - -#[cfg(target_pointer_width = "32")] -#[inline] -pub(super) fn dev_t<'a, Num: ArgNumber>(dev: u64) -> io::Result<ArgReg<'a, Num>> { - Ok(pass_usize(dev.try_into().map_err(|_err| io::Errno::INVAL)?)) -} - -/// Convert a `Resource` into a syscall argument. -#[cfg(feature = "process")] -impl<'a, Num: ArgNumber> From<Resource> for ArgReg<'a, Num> { - #[inline] - fn from(resource: Resource) -> Self { - c_uint(resource as c::c_uint) - } -} - -#[cfg(any(feature = "process", feature = "runtime", feature = "termios"))] -impl<'a, Num: ArgNumber> From<Pid> for ArgReg<'a, Num> { - #[inline] - fn from(pid: Pid) -> Self { - pass_usize(pid.as_raw_nonzero().get() as usize) - } -} - -#[cfg(feature = "process")] -#[inline] -pub(super) fn negative_pid<'a, Num: ArgNumber>(pid: Pid) -> ArgReg<'a, Num> { - pass_usize(pid.as_raw_nonzero().get().wrapping_neg() as usize) -} - -#[cfg(any(feature = "process", feature = "runtime"))] -impl<'a, Num: ArgNumber> From<Signal> for ArgReg<'a, Num> { - #[inline] - fn from(sig: Signal) -> Self { - pass_usize(sig as usize) - } -} - -#[cfg(feature = "io_uring")] -impl<'a, Num: ArgNumber> From<crate::io_uring::IoringEnterFlags> for ArgReg<'a, Num> { - #[inline] - fn from(flags: crate::io_uring::IoringEnterFlags) -> Self { - c_uint(flags.bits()) - } -} - -#[cfg(feature = "time")] -impl<'a, Num: ArgNumber> From<crate::time::TimerfdFlags> for ArgReg<'a, Num> { - #[inline] - fn from(flags: crate::time::TimerfdFlags) -> Self { - c_uint(flags.bits()) - } -} - -#[cfg(feature = "time")] -impl<'a, Num: ArgNumber> From<crate::time::TimerfdTimerFlags> for ArgReg<'a, Num> { - #[inline] - fn from(flags: crate::time::TimerfdTimerFlags) -> Self { - c_uint(flags.bits()) - } -} - -#[cfg(feature = "rand")] -impl<'a, Num: ArgNumber> From<crate::rand::GetRandomFlags> for ArgReg<'a, Num> { - #[inline] - fn from(flags: crate::rand::GetRandomFlags) -> Self { - c_uint(flags.bits()) - } -} - -#[cfg(feature = "net")] -impl<'a, Num: ArgNumber> From<crate::net::RecvFlags> for ArgReg<'a, Num> { - #[inline] - fn from(flags: crate::net::RecvFlags) -> Self { - c_uint(flags.bits()) - } -} - -#[cfg(feature = "net")] -impl<'a, Num: ArgNumber> From<crate::net::SendFlags> for ArgReg<'a, Num> { - #[inline] - fn from(flags: crate::net::SendFlags) -> Self { - c_uint(flags.bits()) - } -} - -#[cfg(feature = "net")] -impl<'a, Num: ArgNumber> From<crate::net::SocketFlags> for ArgReg<'a, Num> { - #[inline] - fn from(flags: crate::net::SocketFlags) -> Self { - c_uint(flags.bits()) - } -} - -#[cfg(feature = "net")] -impl<'a, Num: ArgNumber> From<crate::net::AddressFamily> for ArgReg<'a, Num> { - #[inline] - fn from(family: crate::net::AddressFamily) -> Self { - c_uint(family.0.into()) - } -} - -#[cfg(feature = "net")] -impl<'a, Num: ArgNumber> From<(crate::net::SocketType, crate::net::SocketFlags)> - for ArgReg<'a, Num> -{ - #[inline] - fn from(pair: (crate::net::SocketType, crate::net::SocketFlags)) -> Self { - c_uint(pair.0 .0 | pair.1.bits()) - } -} - -#[cfg(feature = "thread")] -impl<'a, Num: ArgNumber> From<(crate::thread::FutexOperation, crate::thread::FutexFlags)> - for ArgReg<'a, Num> -{ - #[inline] - fn from(pair: (crate::thread::FutexOperation, crate::thread::FutexFlags)) -> Self { - c_uint(pair.0 as u32 | pair.1.bits()) - } -} - -#[cfg(feature = "net")] -impl<'a, Num: ArgNumber> From<crate::net::SocketType> for ArgReg<'a, Num> { - #[inline] - fn from(type_: crate::net::SocketType) -> Self { - c_uint(type_.0) - } -} - -#[cfg(feature = "net")] -impl<'a, Num: ArgNumber> From<Option<crate::net::Protocol>> for ArgReg<'a, Num> { - #[inline] - fn from(protocol: Option<crate::net::Protocol>) -> Self { - c_uint(match protocol { - Some(p) => p.0.get(), - None => 0, - }) - } -} - -impl<'a, Num: ArgNumber, T> From<&'a mut MaybeUninit<T>> for ArgReg<'a, Num> { - #[inline] - fn from(t: &'a mut MaybeUninit<T>) -> Self { - raw_arg(t.as_mut_ptr().cast()) - } -} - -impl<'a, Num: ArgNumber, T> From<&'a mut [MaybeUninit<T>]> for ArgReg<'a, Num> { - #[inline] - fn from(t: &'a mut [MaybeUninit<T>]) -> Self { - raw_arg(t.as_mut_ptr().cast()) - } -} - -#[cfg(any(feature = "process", feature = "thread"))] -impl<'a, Num: ArgNumber> From<crate::ugid::Uid> for ArgReg<'a, Num> { - #[inline] - fn from(t: crate::ugid::Uid) -> Self { - c_uint(t.as_raw()) - } -} - -#[cfg(any(feature = "process", feature = "thread"))] -impl<'a, Num: ArgNumber> From<crate::ugid::Gid> for ArgReg<'a, Num> { - #[inline] - fn from(t: crate::ugid::Gid) -> Self { - c_uint(t.as_raw()) - } -} - -#[cfg(feature = "runtime")] -impl<'a, Num: ArgNumber> From<crate::runtime::How> for ArgReg<'a, Num> { - #[inline] - fn from(flags: crate::runtime::How) -> Self { - c_uint(flags as u32) - } -} - -/// Convert a `usize` returned from a syscall that effectively returns `()` on -/// success. -/// -/// # Safety -/// -/// The caller must ensure that this is the return value of a syscall which -/// just returns 0 on success. -#[inline] -pub(super) unsafe fn ret(raw: RetReg<R0>) -> io::Result<()> { - try_decode_void(raw) -} - -/// Convert a `usize` returned from a syscall that doesn't return on success. -/// -/// # Safety -/// -/// The caller must ensure that this is the return value of a syscall which -/// doesn't return on success. -#[cfg(any(feature = "event", feature = "runtime"))] -#[inline] -pub(super) unsafe fn ret_error(raw: RetReg<R0>) -> io::Errno { - try_decode_error(raw) -} - -/// Convert a `usize` returned from a syscall that effectively always returns -/// `()`. -/// -/// # Safety -/// -/// The caller must ensure that this is the return value of a syscall which -/// always returns `()`. -#[inline] -pub(super) unsafe fn ret_infallible(raw: RetReg<R0>) { - #[cfg(debug_assertions)] - { - try_decode_void(raw).unwrap() - } - #[cfg(not(debug_assertions))] - drop(raw); -} - -/// Convert a `usize` returned from a syscall that effectively returns a -/// `c_int` on success. -#[inline] -pub(super) fn ret_c_int(raw: RetReg<R0>) -> io::Result<c::c_int> { - try_decode_c_int(raw) -} - -/// Convert a `usize` returned from a syscall that effectively returns a -/// `c_uint` on success. -#[inline] -pub(super) fn ret_c_uint(raw: RetReg<R0>) -> io::Result<c::c_uint> { - try_decode_c_uint(raw) -} - -/// Convert a `usize` returned from a syscall that effectively returns a `u64` -/// on success. -#[cfg(target_pointer_width = "64")] -#[inline] -pub(super) fn ret_u64(raw: RetReg<R0>) -> io::Result<u64> { - try_decode_u64(raw) -} - -/// Convert a `usize` returned from a syscall that effectively returns a -/// `usize` on success. -#[inline] -pub(super) fn ret_usize(raw: RetReg<R0>) -> io::Result<usize> { - try_decode_usize(raw) -} - -/// Convert a `usize` returned from a syscall that effectively always -/// returns a `usize`. -/// -/// # Safety -/// -/// This function must only be used with return values from infallible -/// syscalls. -#[inline] -pub(super) unsafe fn ret_usize_infallible(raw: RetReg<R0>) -> usize { - #[cfg(debug_assertions)] - { - try_decode_usize(raw).unwrap() - } - #[cfg(not(debug_assertions))] - { - decode_usize_infallible(raw) - } -} - -/// Convert a `c_int` returned from a syscall that effectively always -/// returns a `c_int`. -/// -/// # Safety -/// -/// This function must only be used with return values from infallible -/// syscalls. -#[inline] -pub(super) unsafe fn ret_c_int_infallible(raw: RetReg<R0>) -> c::c_int { - #[cfg(debug_assertions)] - { - try_decode_c_int(raw).unwrap() - } - #[cfg(not(debug_assertions))] - { - decode_c_int_infallible(raw) - } -} - -/// Convert a `c_uint` returned from a syscall that effectively always -/// returns a `c_uint`. -/// -/// # Safety -/// -/// This function must only be used with return values from infallible -/// syscalls. -#[inline] -pub(super) unsafe fn ret_c_uint_infallible(raw: RetReg<R0>) -> c::c_uint { - #[cfg(debug_assertions)] - { - try_decode_c_uint(raw).unwrap() - } - #[cfg(not(debug_assertions))] - { - decode_c_uint_infallible(raw) - } -} - -/// Convert a `usize` returned from a syscall that effectively returns an -/// `OwnedFd` on success. -/// -/// # Safety -/// -/// The caller must ensure that this is the return value of a syscall which -/// returns an owned file descriptor. -#[inline] -pub(super) unsafe fn ret_owned_fd(raw: RetReg<R0>) -> io::Result<OwnedFd> { - let raw_fd = try_decode_raw_fd(raw)?; - Ok(crate::backend::fd::OwnedFd::from_raw_fd(raw_fd)) -} - -/// Convert the return value of `dup2` and `dup3`. -/// -/// When these functions succeed, they return the same value as their second -/// argument, so we don't construct a new `OwnedFd`. -/// -/// # Safety -/// -/// The caller must ensure that this is the return value of a syscall which -/// returns a file descriptor. -#[inline] -pub(super) unsafe fn ret_discarded_fd(raw: RetReg<R0>) -> io::Result<()> { - let _raw_fd = try_decode_raw_fd(raw)?; - Ok(()) -} - -/// Convert a `usize` returned from a syscall that effectively returns a -/// `*mut c_void` on success. -#[inline] -pub(super) fn ret_void_star(raw: RetReg<R0>) -> io::Result<*mut c::c_void> { - try_decode_void_star(raw) -} diff --git a/vendor/rustix/src/backend/linux_raw/event/epoll.rs b/vendor/rustix/src/backend/linux_raw/event/epoll.rs deleted file mode 100644 index 3d5787b..0000000 --- a/vendor/rustix/src/backend/linux_raw/event/epoll.rs +++ /dev/null @@ -1,470 +0,0 @@ -//! Linux `epoll` support. -//! -//! # Examples -//! -//! ```no_run -//! # #[cfg(feature = "net")] -//! # fn main() -> std::io::Result<()> { -//! use rustix::event::epoll; -//! use rustix::fd::AsFd; -//! use rustix::io::{ioctl_fionbio, read, write}; -//! use rustix::net::{ -//! accept, bind_v4, listen, socket, AddressFamily, Ipv4Addr, SocketAddrV4, SocketType, -//! }; -//! use std::collections::HashMap; -//! use std::os::unix::io::AsRawFd; -//! -//! // Create a socket and listen on it. -//! let listen_sock = socket(AddressFamily::INET, SocketType::STREAM, None)?; -//! bind_v4(&listen_sock, &SocketAddrV4::new(Ipv4Addr::LOCALHOST, 0))?; -//! listen(&listen_sock, 1)?; -//! -//! // Create an epoll object. Using `Owning` here means the epoll object will -//! // take ownership of the file descriptors registered with it. -//! let epoll = epoll::create(epoll::CreateFlags::CLOEXEC)?; -//! -//! // Register the socket with the epoll object. -//! epoll::add( -//! &epoll, -//! &listen_sock, -//! epoll::EventData::new_u64(1), -//! epoll::EventFlags::IN, -//! )?; -//! -//! // Keep track of the sockets we've opened. -//! let mut next_id = epoll::EventData::new_u64(2); -//! let mut sockets = HashMap::new(); -//! -//! // Process events. -//! let mut event_list = epoll::EventVec::with_capacity(4); -//! loop { -//! epoll::wait(&epoll, &mut event_list, -1)?; -//! for event in &event_list { -//! let target = event.data; -//! if target.u64() == 1 { -//! // Accept a new connection, set it to non-blocking, and -//! // register to be notified when it's ready to write to. -//! let conn_sock = accept(&listen_sock)?; -//! ioctl_fionbio(&conn_sock, true)?; -//! epoll::add( -//! &epoll, -//! &conn_sock, -//! next_id, -//! epoll::EventFlags::OUT | epoll::EventFlags::ET, -//! )?; -//! -//! // Keep track of the socket. -//! sockets.insert(next_id, conn_sock); -//! next_id = epoll::EventData::new_u64(next_id.u64() + 1); -//! } else { -//! // Write a message to the stream and then unregister it. -//! let target = sockets.remove(&target).unwrap(); -//! write(&target, b"hello\n")?; -//! let _ = epoll::delete(&epoll, &target)?; -//! } -//! } -//! } -//! # } -//! # #[cfg(not(feature = "net"))] -//! # fn main() {} -//! ``` - -#![allow(unsafe_code)] - -use crate::backend::c; -use crate::backend::event::syscalls; -use crate::fd::{AsFd, AsRawFd, OwnedFd}; -use crate::io; -#[cfg(feature = "alloc")] -use alloc::vec::Vec; -use bitflags::bitflags; -use core::ffi::c_void; -use core::hash::{Hash, Hasher}; -use core::slice; - -bitflags! { - /// `EPOLL_*` for use with [`new`]. - #[repr(transparent)] - #[derive(Copy, Clone, Eq, PartialEq, Hash, Debug)] - pub struct CreateFlags: c::c_uint { - /// `EPOLL_CLOEXEC` - const CLOEXEC = linux_raw_sys::general::EPOLL_CLOEXEC; - - /// <https://docs.rs/bitflags/*/bitflags/#externally-defined-flags> - const _ = !0; - } -} - -bitflags! { - /// `EPOLL*` for use with [`add`]. - #[repr(transparent)] - #[derive(Default, Copy, Clone, Eq, PartialEq, Hash, Debug)] - pub struct EventFlags: u32 { - /// `EPOLLIN` - const IN = linux_raw_sys::general::EPOLLIN as u32; - - /// `EPOLLOUT` - const OUT = linux_raw_sys::general::EPOLLOUT as u32; - - /// `EPOLLPRI` - const PRI = linux_raw_sys::general::EPOLLPRI as u32; - - /// `EPOLLERR` - const ERR = linux_raw_sys::general::EPOLLERR as u32; - - /// `EPOLLHUP` - const HUP = linux_raw_sys::general::EPOLLHUP as u32; - - /// `EPOLLRDNORM` - const RDNORM = linux_raw_sys::general::EPOLLRDNORM as u32; - - /// `EPOLLRDBAND` - const RDBAND = linux_raw_sys::general::EPOLLRDBAND as u32; - - /// `EPOLLWRNORM` - const WRNORM = linux_raw_sys::general::EPOLLWRNORM as u32; - - /// `EPOLLWRBAND` - const WRBAND = linux_raw_sys::general::EPOLLWRBAND as u32; - - /// `EPOLLMSG` - const MSG = linux_raw_sys::general::EPOLLMSG as u32; - - /// `EPOLLRDHUP` - const RDHUP = linux_raw_sys::general::EPOLLRDHUP as u32; - - /// `EPOLLET` - const ET = linux_raw_sys::general::EPOLLET as u32; - - /// `EPOLLONESHOT` - const ONESHOT = linux_raw_sys::general::EPOLLONESHOT as u32; - - /// `EPOLLWAKEUP` - const WAKEUP = linux_raw_sys::general::EPOLLWAKEUP as u32; - - /// `EPOLLEXCLUSIVE` - const EXCLUSIVE = linux_raw_sys::general::EPOLLEXCLUSIVE as u32; - - /// <https://docs.rs/bitflags/*/bitflags/#externally-defined-flags> - const _ = !0; - } -} - -/// `epoll_create1(flags)`—Creates a new epoll object. -/// -/// Use the [`CreateFlags::CLOEXEC`] flag to prevent the resulting file -/// descriptor from being implicitly passed across `exec` boundaries. -#[inline] -#[doc(alias = "epoll_create1")] -pub fn create(flags: CreateFlags) -> io::Result<OwnedFd> { - syscalls::epoll_create(flags) -} - -/// `epoll_ctl(self, EPOLL_CTL_ADD, data, event)`—Adds an element to an epoll -/// object. -/// -/// This registers interest in any of the events set in `events` occurring on -/// the file descriptor associated with `data`. -/// -/// If [`delete`] is not called on the I/O source passed into this function -/// before the I/O source is `close`d, then the `epoll` will act as if the I/O -/// source is still registered with it. This can lead to spurious events being -/// returned from [`wait`]. If a file descriptor is an -/// `Arc<dyn SystemResource>`, then `epoll` can be thought to maintain a -/// `Weak<dyn SystemResource>` to the file descriptor. -#[doc(alias = "epoll_ctl")] -#[inline] -pub fn add( - epoll: impl AsFd, - source: impl AsFd, - data: EventData, - event_flags: EventFlags, -) -> io::Result<()> { - // SAFETY: We're calling `epoll_ctl` via FFI and we know how it - // behaves. - unsafe { - syscalls::epoll_add( - epoll.as_fd(), - source.as_fd().as_raw_fd(), - &Event { - flags: event_flags, - data, - }, - ) - } -} - -/// `epoll_ctl(self, EPOLL_CTL_MOD, target, event)`—Modifies an element in a -/// given epoll object. -/// -/// This sets the events of interest with `target` to `events`. -#[doc(alias = "epoll_ctl")] -#[inline] -pub fn modify( - epoll: impl AsFd, - source: impl AsFd, - data: EventData, - event_flags: EventFlags, -) -> io::Result<()> { - // SAFETY: We're calling `epoll_ctl` via FFI and we know how it - // behaves. - unsafe { - let raw_fd = source.as_fd().as_raw_fd(); - syscalls::epoll_mod( - epoll.as_fd(), - raw_fd, - &Event { - flags: event_flags, - data, - }, - ) - } -} - -/// `epoll_ctl(self, EPOLL_CTL_DEL, target, NULL)`—Removes an element in a -/// given epoll object. -#[doc(alias = "epoll_ctl")] -#[inline] -pub fn delete(epoll: impl AsFd, source: impl AsFd) -> io::Result<()> { - // SAFETY: We're calling `epoll_ctl` via FFI and we know how it - // behaves. - unsafe { - let raw_fd = source.as_fd().as_raw_fd(); - syscalls::epoll_del(epoll.as_fd(), raw_fd) - } -} - -/// `epoll_wait(self, events, timeout)`—Waits for registered events of -/// interest. -/// -/// For each event of interest, an element is written to `events`. On -/// success, this returns the number of written elements. -#[cfg(feature = "alloc")] -#[cfg_attr(doc_cfg, doc(cfg(feature = "alloc")))] -#[inline] -pub fn wait(epoll: impl AsFd, event_list: &mut EventVec, timeout: c::c_int) -> io::Result<()> { - // SAFETY: We're calling `epoll_wait` via FFI and we know how it - // behaves. - unsafe { - event_list.events.set_len(0); - let nfds = syscalls::epoll_wait( - epoll.as_fd(), - event_list.events[..].as_mut_ptr().cast(), - event_list.events.capacity(), - timeout, - )?; - event_list.events.set_len(nfds); - } - - Ok(()) -} - -/// An iterator over the `Event`s in an `EventVec`. -pub struct Iter<'a> { - /// Use `Copied` to copy the struct, since `Event` is `packed` on some - /// platforms, and it's common for users to directly destructure it, which - /// would lead to errors about forming references to packed fields. - iter: core::iter::Copied<slice::Iter<'a, Event>>, -} - -impl<'a> Iterator for Iter<'a> { - type Item = Event; - - #[inline] - fn next(&mut self) -> Option<Self::Item> { - self.iter.next() - } -} - -/// A record of an event that occurred. -#[repr(C)] -#[cfg_attr(target_arch = "x86_64", repr(packed))] -#[derive(Copy, Clone, Eq, PartialEq, Hash)] -pub struct Event { - /// Which specific event(s) occurred. - pub flags: EventFlags, - /// User data. - pub data: EventData, -} - -/// Data associated with an [`Event`]. This can either be a 64-bit integer -/// value or a pointer which preserves pointer provenance. -#[repr(C)] -#[derive(Copy, Clone)] -pub union EventData { - /// A 64-bit integer value. - as_u64: u64, - - /// A `*mut c_void` which preserves pointer provenance, extended to be - /// 64-bit so that if we read the value as a `u64` union field, we don't - /// get uninitialized memory. - sixty_four_bit_pointer: SixtyFourBitPointer, -} - -impl EventData { - /// Construct a new value containing a `u64`. - #[inline] - pub const fn new_u64(value: u64) -> Self { - Self { as_u64: value } - } - - /// Construct a new value containing a `*mut c_void`. - #[inline] - pub const fn new_ptr(value: *mut c_void) -> Self { - Self { - sixty_four_bit_pointer: SixtyFourBitPointer { - pointer: value, - #[cfg(target_pointer_width = "32")] - _padding: 0, - }, - } - } - - /// Return the value as a `u64`. - /// - /// If the stored value was a pointer, the pointer is zero-extended to a - /// `u64`. - #[inline] - pub fn u64(self) -> u64 { - unsafe { self.as_u64 } - } - - /// Return the value as a `*mut c_void`. - /// - /// If the stored value was a `u64`, the least-significant bits of the - /// `u64` are returned as a pointer value. - #[inline] - pub fn ptr(self) -> *mut c_void { - unsafe { self.sixty_four_bit_pointer.pointer } - } -} - -impl PartialEq for EventData { - #[inline] - fn eq(&self, other: &Self) -> bool { - self.u64() == other.u64() - } -} - -impl Eq for EventData {} - -impl Hash for EventData { - #[inline] - fn hash<H: Hasher>(&self, state: &mut H) { - self.u64().hash(state) - } -} - -#[repr(C)] -#[derive(Copy, Clone)] -struct SixtyFourBitPointer { - #[cfg(target_endian = "big")] - #[cfg(target_pointer_width = "32")] - _padding: u32, - - pointer: *mut c_void, - - #[cfg(target_endian = "little")] - #[cfg(target_pointer_width = "32")] - _padding: u32, -} - -/// A vector of `Event`s, plus context for interpreting them. -#[cfg(feature = "alloc")] -pub struct EventVec { - events: Vec<Event>, -} - -#[cfg(feature = "alloc")] -impl EventVec { - /// Constructs an `EventVec` from raw pointer, length, and capacity. - /// - /// # Safety - /// - /// This function calls [`Vec::from_raw_parts`] with its arguments. - /// - /// [`Vec::from_raw_parts`]: https://doc.rust-lang.org/stable/std/vec/struct.Vec.html#method.from_raw_parts - #[inline] - pub unsafe fn from_raw_parts(ptr: *mut Event, len: usize, capacity: usize) -> Self { - Self { - events: Vec::from_raw_parts(ptr, len, capacity), - } - } - - /// Constructs an `EventVec` with memory for `capacity` `Event`s. - #[inline] - pub fn with_capacity(capacity: usize) -> Self { - Self { - events: Vec::with_capacity(capacity), - } - } - - /// Returns the current `Event` capacity of this `EventVec`. - #[inline] - pub fn capacity(&self) -> usize { - self.events.capacity() - } - - /// Reserves enough memory for at least `additional` more `Event`s. - #[inline] - pub fn reserve(&mut self, additional: usize) { - self.events.reserve(additional); - } - - /// Reserves enough memory for exactly `additional` more `Event`s. - #[inline] - pub fn reserve_exact(&mut self, additional: usize) { - self.events.reserve_exact(additional); - } - - /// Clears all the `Events` out of this `EventVec`. - #[inline] - pub fn clear(&mut self) { - self.events.clear(); - } - - /// Shrinks the capacity of this `EventVec` as much as possible. - #[inline] - pub fn shrink_to_fit(&mut self) { - self.events.shrink_to_fit(); - } - - /// Returns an iterator over the `Event`s in this `EventVec`. - #[inline] - pub fn iter(&self) -> Iter<'_> { - Iter { - iter: self.events.iter().copied(), - } - } - - /// Returns the number of `Event`s logically contained in this `EventVec`. - #[inline] - pub fn len(&mut self) -> usize { - self.events.len() - } - - /// Tests whether this `EventVec` is logically empty. - #[inline] - pub fn is_empty(&mut self) -> bool { - self.events.is_empty() - } -} - -#[cfg(feature = "alloc")] -impl<'a> IntoIterator for &'a EventVec { - type IntoIter = Iter<'a>; - type Item = Event; - - #[inline] - fn into_iter(self) -> Self::IntoIter { - self.iter() - } -} - -#[test] -fn test_epoll_layouts() { - check_renamed_type!(Event, epoll_event); - check_renamed_type!(Event, epoll_event); - check_renamed_struct_renamed_field!(Event, epoll_event, flags, events); - check_renamed_struct_renamed_field!(Event, epoll_event, data, data); -} diff --git a/vendor/rustix/src/backend/linux_raw/event/mod.rs b/vendor/rustix/src/backend/linux_raw/event/mod.rs deleted file mode 100644 index 605de25..0000000 --- a/vendor/rustix/src/backend/linux_raw/event/mod.rs +++ /dev/null @@ -1,4 +0,0 @@ -pub mod epoll; -pub(crate) mod poll_fd; -pub(crate) mod syscalls; -pub(crate) mod types; diff --git a/vendor/rustix/src/backend/linux_raw/event/poll_fd.rs b/vendor/rustix/src/backend/linux_raw/event/poll_fd.rs deleted file mode 100644 index 9de43f2..0000000 --- a/vendor/rustix/src/backend/linux_raw/event/poll_fd.rs +++ /dev/null @@ -1,98 +0,0 @@ -use crate::fd::{AsFd, BorrowedFd}; -use bitflags::bitflags; - -bitflags! { - /// `POLL*` flags for use with [`poll`]. - /// - /// [`poll`]: crate::event::poll - #[repr(transparent)] - #[derive(Copy, Clone, Eq, PartialEq, Hash, Debug)] - pub struct PollFlags: u16 { - /// `POLLIN` - const IN = linux_raw_sys::general::POLLIN as u16; - /// `POLLPRI` - const PRI = linux_raw_sys::general::POLLPRI as u16; - /// `POLLOUT` - const OUT = linux_raw_sys::general::POLLOUT as u16; - /// `POLLRDNORM` - const RDNORM = linux_raw_sys::general::POLLRDNORM as u16; - /// `POLLWRNORM` - const WRNORM = linux_raw_sys::general::POLLWRNORM as u16; - /// `POLLRDBAND` - const RDBAND = linux_raw_sys::general::POLLRDBAND as u16; - /// `POLLWRBAND` - const WRBAND = linux_raw_sys::general::POLLWRBAND as u16; - /// `POLLERR` - const ERR = linux_raw_sys::general::POLLERR as u16; - /// `POLLHUP` - const HUP = linux_raw_sys::general::POLLHUP as u16; - /// `POLLNVAL` - const NVAL = linux_raw_sys::general::POLLNVAL as u16; - /// `POLLRDHUP` - const RDHUP = linux_raw_sys::general::POLLRDHUP as u16; - - /// <https://docs.rs/bitflags/*/bitflags/#externally-defined-flags> - const _ = !0; - } -} - -/// `struct pollfd`—File descriptor and flags for use with [`poll`]. -/// -/// [`poll`]: crate::event::poll -#[doc(alias = "pollfd")] -#[repr(C)] -#[derive(Debug, Clone)] -pub struct PollFd<'fd> { - pub(crate) fd: BorrowedFd<'fd>, - pub(crate) events: u16, - pub(crate) revents: u16, -} - -impl<'fd> PollFd<'fd> { - /// Constructs a new `PollFd` holding `fd` and `events`. - #[inline] - pub fn new<Fd: AsFd>(fd: &'fd Fd, events: PollFlags) -> Self { - Self::from_borrowed_fd(fd.as_fd(), events) - } - - /// Sets the contained file descriptor to `fd`. - #[inline] - pub fn set_fd<Fd: AsFd>(&mut self, fd: &'fd Fd) { - self.fd = fd.as_fd(); - } - - /// Clears the ready events. - #[inline] - pub fn clear_revents(&mut self) { - self.revents = 0; - } - - /// Constructs a new `PollFd` holding `fd` and `events`. - /// - /// This is the same as `new`, but can be used to avoid borrowing the - /// `BorrowedFd`, which can be tricky in situations where the `BorrowedFd` - /// is a temporary. - #[inline] - pub fn from_borrowed_fd(fd: BorrowedFd<'fd>, events: PollFlags) -> Self { - Self { - fd, - events: events.bits(), - revents: 0, - } - } - - /// Returns the ready events. - #[inline] - pub fn revents(&self) -> PollFlags { - // Use `.unwrap()` here because in theory we know we know all the bits - // the OS might set here, but OS's have added extensions in the past. - PollFlags::from_bits(self.revents).unwrap() - } -} - -impl<'fd> AsFd for PollFd<'fd> { - #[inline] - fn as_fd(&self) -> BorrowedFd<'_> { - self.fd.as_fd() - } -} diff --git a/vendor/rustix/src/backend/linux_raw/event/syscalls.rs b/vendor/rustix/src/backend/linux_raw/event/syscalls.rs deleted file mode 100644 index 0ae7753..0000000 --- a/vendor/rustix/src/backend/linux_raw/event/syscalls.rs +++ /dev/null @@ -1,152 +0,0 @@ -//! linux_raw syscalls supporting `rustix::event`. -//! -//! # Safety -//! -//! See the `rustix::backend` module documentation for details. -#![allow(unsafe_code, clippy::undocumented_unsafe_blocks)] - -use crate::backend::c; -#[cfg(feature = "alloc")] -use crate::backend::conv::pass_usize; -use crate::backend::conv::{ - by_ref, c_int, c_uint, raw_fd, ret, ret_error, ret_owned_fd, ret_usize, slice_mut, zero, -}; -use crate::event::{epoll, EventfdFlags, PollFd}; -use crate::fd::{BorrowedFd, OwnedFd}; -use crate::io; -use linux_raw_sys::general::{EPOLL_CTL_ADD, EPOLL_CTL_DEL, EPOLL_CTL_MOD}; -#[cfg(any(target_arch = "aarch64", target_arch = "riscv64"))] -use { - crate::backend::conv::{opt_ref, size_of}, - linux_raw_sys::general::{__kernel_timespec, kernel_sigset_t}, -}; - -#[inline] -pub(crate) fn poll(fds: &mut [PollFd<'_>], timeout: c::c_int) -> io::Result<usize> { - let (fds_addr_mut, fds_len) = slice_mut(fds); - - #[cfg(any(target_arch = "aarch64", target_arch = "riscv64"))] - unsafe { - let timeout = if timeout >= 0 { - Some(__kernel_timespec { - tv_sec: (timeout as i64) / 1000, - tv_nsec: (timeout as i64) % 1000 * 1_000_000, - }) - } else { - None - }; - ret_usize(syscall!( - __NR_ppoll, - fds_addr_mut, - fds_len, - opt_ref(timeout.as_ref()), - zero(), - size_of::<kernel_sigset_t, _>() - )) - } - #[cfg(not(any(target_arch = "aarch64", target_arch = "riscv64")))] - unsafe { - ret_usize(syscall!(__NR_poll, fds_addr_mut, fds_len, c_int(timeout))) - } -} - -#[inline] -pub(crate) fn epoll_create(flags: epoll::CreateFlags) -> io::Result<OwnedFd> { - unsafe { ret_owned_fd(syscall_readonly!(__NR_epoll_create1, flags)) } -} - -#[inline] -pub(crate) unsafe fn epoll_add( - epfd: BorrowedFd<'_>, - fd: c::c_int, - event: &epoll::Event, -) -> io::Result<()> { - ret(syscall_readonly!( - __NR_epoll_ctl, - epfd, - c_uint(EPOLL_CTL_ADD), - raw_fd(fd), - by_ref(event) - )) -} - -#[inline] -pub(crate) unsafe fn epoll_mod( - epfd: BorrowedFd<'_>, - fd: c::c_int, - event: &epoll::Event, -) -> io::Result<()> { - ret(syscall_readonly!( - __NR_epoll_ctl, - epfd, - c_uint(EPOLL_CTL_MOD), - raw_fd(fd), - by_ref(event) - )) -} - -#[inline] -pub(crate) unsafe fn epoll_del(epfd: BorrowedFd<'_>, fd: c::c_int) -> io::Result<()> { - ret(syscall_readonly!( - __NR_epoll_ctl, - epfd, - c_uint(EPOLL_CTL_DEL), - raw_fd(fd), - zero() - )) -} - -#[cfg(feature = "alloc")] -#[inline] -pub(crate) fn epoll_wait( - epfd: BorrowedFd<'_>, - events: *mut epoll::Event, - num_events: usize, - timeout: c::c_int, -) -> io::Result<usize> { - #[cfg(not(any(target_arch = "aarch64", target_arch = "riscv64")))] - unsafe { - ret_usize(syscall!( - __NR_epoll_wait, - epfd, - events, - pass_usize(num_events), - c_int(timeout) - )) - } - #[cfg(any(target_arch = "aarch64", target_arch = "riscv64"))] - unsafe { - ret_usize(syscall!( - __NR_epoll_pwait, - epfd, - events, - pass_usize(num_events), - c_int(timeout), - zero() - )) - } -} - -#[inline] -pub(crate) fn eventfd(initval: u32, flags: EventfdFlags) -> io::Result<OwnedFd> { - unsafe { ret_owned_fd(syscall_readonly!(__NR_eventfd2, c_uint(initval), flags)) } -} - -#[inline] -pub(crate) fn pause() { - unsafe { - #[cfg(any(target_arch = "aarch64", target_arch = "riscv64"))] - let error = ret_error(syscall_readonly!( - __NR_ppoll, - zero(), - zero(), - zero(), - zero() - )); - - #[cfg(not(any(target_arch = "aarch64", target_arch = "riscv64")))] - let error = ret_error(syscall_readonly!(__NR_pause)); - - debug_assert_eq!(error, io::Errno::INTR); - } -} diff --git a/vendor/rustix/src/backend/linux_raw/event/types.rs b/vendor/rustix/src/backend/linux_raw/event/types.rs deleted file mode 100644 index 01611f6..0000000 --- a/vendor/rustix/src/backend/linux_raw/event/types.rs +++ /dev/null @@ -1,21 +0,0 @@ -use crate::backend::c; -use bitflags::bitflags; - -bitflags! { - /// `EFD_*` flags for use with [`eventfd`]. - /// - /// [`eventfd`]: crate::event::eventfd - #[repr(transparent)] - #[derive(Copy, Clone, Eq, PartialEq, Hash, Debug)] - pub struct EventfdFlags: c::c_uint { - /// `EFD_CLOEXEC` - const CLOEXEC = linux_raw_sys::general::EFD_CLOEXEC; - /// `EFD_NONBLOCK` - const NONBLOCK = linux_raw_sys::general::EFD_NONBLOCK; - /// `EFD_SEMAPHORE` - const SEMAPHORE = linux_raw_sys::general::EFD_SEMAPHORE; - - /// <https://docs.rs/bitflags/*/bitflags/#externally-defined-flags> - const _ = !0; - } -} diff --git a/vendor/rustix/src/backend/linux_raw/fs/dir.rs b/vendor/rustix/src/backend/linux_raw/fs/dir.rs deleted file mode 100644 index dbddd58..0000000 --- a/vendor/rustix/src/backend/linux_raw/fs/dir.rs +++ /dev/null @@ -1,315 +0,0 @@ -use crate::fd::{AsFd, BorrowedFd, OwnedFd}; -use crate::ffi::{CStr, CString}; -use crate::fs::{ - fcntl_getfl, fstat, fstatfs, fstatvfs, openat, FileType, Mode, OFlags, Stat, StatFs, StatVfs, -}; -use crate::io; -#[cfg(feature = "process")] -use crate::process::fchdir; -use crate::utils::as_ptr; -use alloc::borrow::ToOwned; -use alloc::vec::Vec; -use core::fmt; -use core::mem::size_of; -use linux_raw_sys::general::{linux_dirent64, SEEK_SET}; - -/// `DIR*` -pub struct Dir { - /// The `OwnedFd` that we read directory entries from. - fd: OwnedFd, - - /// Have we seen any errors in this iteration? - any_errors: bool, - - /// Should we rewind the stream on the next iteration? - rewind: bool, - - /// The buffer for `linux_dirent64` entries. - buf: Vec<u8>, - - /// Where we are in the buffer. - pos: usize, -} - -impl Dir { - /// Take ownership of `fd` and construct a `Dir` that reads entries from - /// the given directory file descriptor. - #[inline] - pub fn new<Fd: Into<OwnedFd>>(fd: Fd) -> io::Result<Self> { - Self::_new(fd.into()) - } - - #[inline] - fn _new(fd: OwnedFd) -> io::Result<Self> { - Ok(Self { - fd, - any_errors: false, - rewind: false, - buf: Vec::new(), - pos: 0, - }) - } - - /// Borrow `fd` and construct a `Dir` that reads entries from the given - /// directory file descriptor. - #[inline] - pub fn read_from<Fd: AsFd>(fd: Fd) -> io::Result<Self> { - Self::_read_from(fd.as_fd()) - } - - #[inline] - fn _read_from(fd: BorrowedFd<'_>) -> io::Result<Self> { - let flags = fcntl_getfl(fd)?; - let fd_for_dir = openat(fd, cstr!("."), flags | OFlags::CLOEXEC, Mode::empty())?; - - Ok(Self { - fd: fd_for_dir, - any_errors: false, - rewind: false, - buf: Vec::new(), - pos: 0, - }) - } - - /// `rewinddir(self)` - #[inline] - pub fn rewind(&mut self) { - self.any_errors = false; - self.rewind = true; - self.pos = self.buf.len(); - } - - /// `readdir(self)`, where `None` means the end of the directory. - pub fn read(&mut self) -> Option<io::Result<DirEntry>> { - // If we've seen errors, don't continue to try to read anyting further. - if self.any_errors { - return None; - } - - // If a rewind was requested, seek to the beginning. - if self.rewind { - self.rewind = false; - match io::retry_on_intr(|| { - crate::backend::fs::syscalls::_seek(self.fd.as_fd(), 0, SEEK_SET) - }) { - Ok(_) => (), - Err(err) => { - self.any_errors = true; - return Some(Err(err)); - } - } - } - - // Compute linux_dirent64 field offsets. - let z = linux_dirent64 { - d_ino: 0_u64, - d_off: 0_i64, - d_type: 0_u8, - d_reclen: 0_u16, - d_name: Default::default(), - }; - let base = as_ptr(&z) as usize; - let offsetof_d_reclen = (as_ptr(&z.d_reclen) as usize) - base; - let offsetof_d_name = (as_ptr(&z.d_name) as usize) - base; - let offsetof_d_ino = (as_ptr(&z.d_ino) as usize) - base; - let offsetof_d_type = (as_ptr(&z.d_type) as usize) - base; - - // Test if we need more entries, and if so, read more. - if self.buf.len() - self.pos < size_of::<linux_dirent64>() { - match self.read_more()? { - Ok(()) => (), - Err(err) => return Some(Err(err)), - } - } - - // We successfully read an entry. Extract the fields. - let pos = self.pos; - - // Do an unaligned u16 load. - let d_reclen = u16::from_ne_bytes([ - self.buf[pos + offsetof_d_reclen], - self.buf[pos + offsetof_d_reclen + 1], - ]); - assert!(self.buf.len() - pos >= d_reclen as usize); - self.pos += d_reclen as usize; - - // Read the NUL-terminated name from the `d_name` field. Without - // `unsafe`, we need to scan for the NUL twice: once to obtain a size - // for the slice, and then once within `CStr::from_bytes_with_nul`. - let name_start = pos + offsetof_d_name; - let name_len = self.buf[name_start..] - .iter() - .position(|x| *x == b'\0') - .unwrap(); - let name = CStr::from_bytes_with_nul(&self.buf[name_start..][..=name_len]).unwrap(); - let name = name.to_owned(); - assert!(name.as_bytes().len() <= self.buf.len() - name_start); - - // Do an unaligned u64 load. - let d_ino = u64::from_ne_bytes([ - self.buf[pos + offsetof_d_ino], - self.buf[pos + offsetof_d_ino + 1], - self.buf[pos + offsetof_d_ino + 2], - self.buf[pos + offsetof_d_ino + 3], - self.buf[pos + offsetof_d_ino + 4], - self.buf[pos + offsetof_d_ino + 5], - self.buf[pos + offsetof_d_ino + 6], - self.buf[pos + offsetof_d_ino + 7], - ]); - - let d_type = self.buf[pos + offsetof_d_type]; - - // Check that our types correspond to the `linux_dirent64` types. - let _ = linux_dirent64 { - d_ino, - d_off: 0, - d_type, - d_reclen, - d_name: Default::default(), - }; - - Some(Ok(DirEntry { - d_ino, - d_type, - name, - })) - } - - #[must_use] - fn read_more(&mut self) -> Option<io::Result<()>> { - // The first few times we're called, we allocate a relatively small - // buffer, because many directories are small. If we're called more, - // use progressively larger allocations, up to a fixed maximum. - // - // The specific sizes and policy here have not been tuned in detail yet - // and may need to be adjusted. In doing so, we should be careful to - // avoid unbounded buffer growth. This buffer only exists to share the - // cost of a `getdents` call over many entries, so if it gets too big, - // cache and heap usage will outweigh the benefit. And ultimately, - // directories can contain more entries than we can allocate contiguous - // memory for, so we'll always need to cap the size at some point. - if self.buf.len() < 1024 * size_of::<linux_dirent64>() { - self.buf.reserve(32 * size_of::<linux_dirent64>()); - } - self.buf.resize(self.buf.capacity(), 0); - let nread = match io::retry_on_intr(|| { - crate::backend::fs::syscalls::getdents(self.fd.as_fd(), &mut self.buf) - }) { - Ok(nread) => nread, - Err(io::Errno::NOENT) => { - self.any_errors = true; - return None; - } - Err(err) => { - self.any_errors = true; - return Some(Err(err)); - } - }; - self.buf.resize(nread, 0); - self.pos = 0; - if nread == 0 { - None - } else { - Some(Ok(())) - } - } - - /// `fstat(self)` - #[inline] - pub fn stat(&self) -> io::Result<Stat> { - fstat(&self.fd) - } - - /// `fstatfs(self)` - #[inline] - pub fn statfs(&self) -> io::Result<StatFs> { - fstatfs(&self.fd) - } - - /// `fstatvfs(self)` - #[inline] - pub fn statvfs(&self) -> io::Result<StatVfs> { - fstatvfs(&self.fd) - } - - /// `fchdir(self)` - #[cfg(feature = "process")] - #[cfg_attr(doc_cfg, doc(cfg(feature = "process")))] - #[inline] - pub fn chdir(&self) -> io::Result<()> { - fchdir(&self.fd) - } -} - -impl Iterator for Dir { - type Item = io::Result<DirEntry>; - - #[inline] - fn next(&mut self) -> Option<Self::Item> { - Self::read(self) - } -} - -impl fmt::Debug for Dir { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - f.debug_struct("Dir").field("fd", &self.fd).finish() - } -} - -/// `struct dirent` -#[derive(Debug)] -pub struct DirEntry { - d_ino: u64, - d_type: u8, - name: CString, -} - -impl DirEntry { - /// Returns the file name of this directory entry. - #[inline] - pub fn file_name(&self) -> &CStr { - &self.name - } - - /// Returns the type of this directory entry. - #[inline] - pub fn file_type(&self) -> FileType { - FileType::from_dirent_d_type(self.d_type) - } - - /// Return the inode number of this directory entry. - #[inline] - pub fn ino(&self) -> u64 { - self.d_ino - } -} - -#[test] -fn dir_iterator_handles_io_errors() { - // create a dir, keep the FD, then delete the dir - let tmp = tempfile::tempdir().unwrap(); - let fd = crate::fs::openat( - crate::fs::CWD, - tmp.path(), - crate::fs::OFlags::RDONLY | crate::fs::OFlags::CLOEXEC, - crate::fs::Mode::empty(), - ) - .unwrap(); - - let file_fd = crate::fs::openat( - &fd, - tmp.path().join("test.txt"), - crate::fs::OFlags::WRONLY | crate::fs::OFlags::CREATE, - crate::fs::Mode::RWXU, - ) - .unwrap(); - - let mut dir = Dir::read_from(&fd).unwrap(); - - // Reach inside the `Dir` and replace its directory with a file, which - // will cause the subsequent `getdents64` to fail. - crate::io::dup2(&file_fd, &mut dir.fd).unwrap(); - - assert!(matches!(dir.next(), Some(Err(_)))); - assert!(dir.next().is_none()); -} diff --git a/vendor/rustix/src/backend/linux_raw/fs/inotify.rs b/vendor/rustix/src/backend/linux_raw/fs/inotify.rs deleted file mode 100644 index 851335b..0000000 --- a/vendor/rustix/src/backend/linux_raw/fs/inotify.rs +++ /dev/null @@ -1,118 +0,0 @@ -//! inotify support for working with inotifies - -use crate::backend::c; -use crate::backend::fs::syscalls; -use crate::fd::{BorrowedFd, OwnedFd}; -use crate::io; -use bitflags::bitflags; - -bitflags! { - /// `IN_*` for use with [`inotify_init`]. - /// - /// [`inotify_init`]: crate::fs::inotify::inotify_init - #[repr(transparent)] - #[derive(Copy, Clone, Eq, PartialEq, Hash, Debug)] - pub struct CreateFlags: c::c_uint { - /// `IN_CLOEXEC` - const CLOEXEC = linux_raw_sys::general::IN_CLOEXEC; - /// `IN_NONBLOCK` - const NONBLOCK = linux_raw_sys::general::IN_NONBLOCK; - - /// <https://docs.rs/bitflags/*/bitflags/#externally-defined-flags> - const _ = !0; - } -} - -bitflags! { - /// `IN*` for use with [`inotify_add_watch`]. - /// - /// [`inotify_add_watch`]: crate::fs::inotify::inotify_add_watch - #[repr(transparent)] - #[derive(Default, Copy, Clone, Eq, PartialEq, Hash, Debug)] - pub struct WatchFlags: c::c_uint { - /// `IN_ACCESS` - const ACCESS = linux_raw_sys::general::IN_ACCESS; - /// `IN_ATTRIB` - const ATTRIB = linux_raw_sys::general::IN_ATTRIB; - /// `IN_CLOSE_NOWRITE` - const CLOSE_NOWRITE = linux_raw_sys::general::IN_CLOSE_NOWRITE; - /// `IN_CLOSE_WRITE` - const CLOSE_WRITE = linux_raw_sys::general::IN_CLOSE_WRITE; - /// `IN_CREATE` - const CREATE = linux_raw_sys::general::IN_CREATE; - /// `IN_DELETE` - const DELETE = linux_raw_sys::general::IN_DELETE; - /// `IN_DELETE_SELF` - const DELETE_SELF = linux_raw_sys::general::IN_DELETE_SELF; - /// `IN_MODIFY` - const MODIFY = linux_raw_sys::general::IN_MODIFY; - /// `IN_MOVE_SELF` - const MOVE_SELF = linux_raw_sys::general::IN_MOVE_SELF; - /// `IN_MOVED_FROM` - const MOVED_FROM = linux_raw_sys::general::IN_MOVED_FROM; - /// `IN_MOVED_TO` - const MOVED_TO = linux_raw_sys::general::IN_MOVED_TO; - /// `IN_OPEN` - const OPEN = linux_raw_sys::general::IN_OPEN; - - /// `IN_CLOSE` - const CLOSE = linux_raw_sys::general::IN_CLOSE; - /// `IN_MOVE` - const MOVE = linux_raw_sys::general::IN_MOVE; - /// `IN_ALL_EVENTS` - const ALL_EVENTS = linux_raw_sys::general::IN_ALL_EVENTS; - - /// `IN_DONT_FOLLOW` - const DONT_FOLLOW = linux_raw_sys::general::IN_DONT_FOLLOW; - /// `IN_EXCL_UNLINK` - const EXCL_UNLINK = linux_raw_sys::general::IN_EXCL_UNLINK; - /// `IN_MASK_ADD` - const MASK_ADD = linux_raw_sys::general::IN_MASK_ADD; - /// `IN_MASK_CREATE` - const MASK_CREATE = linux_raw_sys::general::IN_MASK_CREATE; - /// `IN_ONESHOT` - const ONESHOT = linux_raw_sys::general::IN_ONESHOT; - /// `IN_ONLYDIR` - const ONLYDIR = linux_raw_sys::general::IN_ONLYDIR; - - /// <https://docs.rs/bitflags/*/bitflags/#externally-defined-flags> - const _ = !0; - } -} - -/// `inotify_init1(flags)`—Creates a new inotify object. -/// -/// Use the [`CreateFlags::CLOEXEC`] flag to prevent the resulting file -/// descriptor from being implicitly passed across `exec` boundaries. -#[doc(alias = "inotify_init1")] -#[inline] -pub fn inotify_init(flags: CreateFlags) -> io::Result<OwnedFd> { - syscalls::inotify_init1(flags) -} - -/// `inotify_add_watch(self, path, flags)`—Adds a watch to inotify. -/// -/// This registers or updates a watch for the filesystem path `path` and -/// returns a watch descriptor corresponding to this watch. -/// -/// Note: Due to the existence of hardlinks, providing two different paths to -/// this method may result in it returning the same watch descriptor. An -/// application should keep track of this externally to avoid logic errors. -#[inline] -pub fn inotify_add_watch<P: crate::path::Arg>( - inot: BorrowedFd<'_>, - path: P, - flags: WatchFlags, -) -> io::Result<i32> { - path.into_with_c_str(|path| syscalls::inotify_add_watch(inot, path, flags)) -} - -/// `inotify_rm_watch(self, wd)`—Removes a watch from this inotify. -/// -/// The watch descriptor provided should have previously been returned by -/// [`inotify_add_watch`] and not previously have been removed. -#[doc(alias = "inotify_rm_watch")] -#[inline] -pub fn inotify_remove_watch(inot: BorrowedFd<'_>, wd: i32) -> io::Result<()> { - syscalls::inotify_rm_watch(inot, wd) -} diff --git a/vendor/rustix/src/backend/linux_raw/fs/makedev.rs b/vendor/rustix/src/backend/linux_raw/fs/makedev.rs deleted file mode 100644 index 284ba2f..0000000 --- a/vendor/rustix/src/backend/linux_raw/fs/makedev.rs +++ /dev/null @@ -1,19 +0,0 @@ -use crate::fs::Dev; - -#[inline] -pub(crate) fn makedev(maj: u32, min: u32) -> Dev { - ((u64::from(maj) & 0xffff_f000_u64) << 32) - | ((u64::from(maj) & 0x0000_0fff_u64) << 8) - | ((u64::from(min) & 0xffff_ff00_u64) << 12) - | (u64::from(min) & 0x0000_00ff_u64) -} - -#[inline] -pub(crate) fn major(dev: Dev) -> u32 { - (((dev >> 31 >> 1) & 0xffff_f000) | ((dev >> 8) & 0x0000_0fff)) as u32 -} - -#[inline] -pub(crate) fn minor(dev: Dev) -> u32 { - (((dev >> 12) & 0xffff_ff00) | (dev & 0x0000_00ff)) as u32 -} diff --git a/vendor/rustix/src/backend/linux_raw/fs/mod.rs b/vendor/rustix/src/backend/linux_raw/fs/mod.rs deleted file mode 100644 index 9f53c5d..0000000 --- a/vendor/rustix/src/backend/linux_raw/fs/mod.rs +++ /dev/null @@ -1,13 +0,0 @@ -#[cfg(feature = "alloc")] -pub(crate) mod dir; -pub mod inotify; -pub(crate) mod makedev; -pub(crate) mod syscalls; -pub(crate) mod types; - -// TODO: Fix linux-raw-sys to define ioctl codes for sparc. -#[cfg(any(target_arch = "sparc", target_arch = "sparc64"))] -pub(crate) const EXT4_IOC_RESIZE_FS: u32 = 0x8008_6610; - -#[cfg(not(any(target_arch = "sparc", target_arch = "sparc64")))] -pub(crate) use linux_raw_sys::ioctl::EXT4_IOC_RESIZE_FS; diff --git a/vendor/rustix/src/backend/linux_raw/fs/syscalls.rs b/vendor/rustix/src/backend/linux_raw/fs/syscalls.rs deleted file mode 100644 index 47d01df..0000000 --- a/vendor/rustix/src/backend/linux_raw/fs/syscalls.rs +++ /dev/null @@ -1,1670 +0,0 @@ -//! linux_raw syscalls supporting `rustix::fs`. -//! -//! # Safety -//! -//! See the `rustix::backend` module documentation for details. -#![allow(unsafe_code)] -#![allow(clippy::undocumented_unsafe_blocks)] - -use crate::backend::c; -use crate::backend::conv::fs::oflags_for_open_how; -#[cfg(any( - not(feature = "linux_4_11"), - target_arch = "aarch64", - target_arch = "riscv64", - target_arch = "mips", - target_arch = "mips32r6", -))] -use crate::backend::conv::zero; -use crate::backend::conv::{ - by_ref, c_int, c_uint, dev_t, opt_mut, pass_usize, raw_fd, ret, ret_c_int, ret_c_uint, - ret_infallible, ret_owned_fd, ret_usize, size_of, slice, slice_mut, -}; -#[cfg(target_pointer_width = "64")] -use crate::backend::conv::{loff_t, loff_t_from_u64, ret_u64}; -#[cfg(any( - target_arch = "aarch64", - target_arch = "riscv64", - target_arch = "mips64", - target_arch = "mips64r6", - target_pointer_width = "32", -))] -use crate::fd::AsFd; -use crate::fd::{BorrowedFd, OwnedFd}; -use crate::ffi::CStr; -#[cfg(any(target_arch = "aarch64", target_arch = "riscv64"))] -use crate::fs::CWD; -use crate::fs::{ - inotify, Access, Advice, AtFlags, FallocateFlags, FileType, FlockOperation, Gid, MemfdFlags, - Mode, OFlags, RenameFlags, ResolveFlags, SealFlags, SeekFrom, Stat, StatFs, StatVfs, - StatVfsMountFlags, StatxFlags, Timestamps, Uid, XattrFlags, -}; -use crate::io; -use core::mem::MaybeUninit; -#[cfg(any(target_arch = "mips64", target_arch = "mips64r6"))] -use linux_raw_sys::general::stat as linux_stat64; -use linux_raw_sys::general::{ - __kernel_fsid_t, open_how, statx, AT_EACCESS, AT_FDCWD, AT_REMOVEDIR, AT_SYMLINK_NOFOLLOW, - F_ADD_SEALS, F_GETFL, F_GET_SEALS, F_SETFL, SEEK_CUR, SEEK_DATA, SEEK_END, SEEK_HOLE, SEEK_SET, - STATX__RESERVED, -}; -#[cfg(target_pointer_width = "32")] -use { - crate::backend::conv::{hi, lo, slice_just_addr}, - linux_raw_sys::general::stat64 as linux_stat64, - linux_raw_sys::general::timespec as __kernel_old_timespec, -}; - -#[inline] -pub(crate) fn open(path: &CStr, flags: OFlags, mode: Mode) -> io::Result<OwnedFd> { - // Always enable support for large files. - let flags = flags | OFlags::from_bits_retain(c::O_LARGEFILE); - - #[cfg(any(target_arch = "aarch64", target_arch = "riscv64"))] - { - openat(CWD.as_fd(), path, flags, mode) - } - #[cfg(not(any(target_arch = "aarch64", target_arch = "riscv64")))] - unsafe { - ret_owned_fd(syscall_readonly!(__NR_open, path, flags, mode)) - } -} - -#[inline] -pub(crate) fn openat( - dirfd: BorrowedFd<'_>, - path: &CStr, - flags: OFlags, - mode: Mode, -) -> io::Result<OwnedFd> { - // Always enable support for large files. - let flags = flags | OFlags::from_bits_retain(c::O_LARGEFILE); - - unsafe { ret_owned_fd(syscall_readonly!(__NR_openat, dirfd, path, flags, mode)) } -} - -#[inline] -pub(crate) fn openat2( - dirfd: BorrowedFd<'_>, - path: &CStr, - mut flags: OFlags, - mode: Mode, - resolve: ResolveFlags, -) -> io::Result<OwnedFd> { - // Enable support for large files, but not with `O_PATH` because - // `openat2` doesn't like those flags together. - if !flags.contains(OFlags::PATH) { - flags |= OFlags::from_bits_retain(c::O_LARGEFILE); - } - - unsafe { - ret_owned_fd(syscall_readonly!( - __NR_openat2, - dirfd, - path, - by_ref(&open_how { - flags: oflags_for_open_how(flags), - mode: u64::from(mode.bits()), - resolve: resolve.bits(), - }), - size_of::<open_how, _>() - )) - } -} - -#[inline] -pub(crate) fn chmod(path: &CStr, mode: Mode) -> io::Result<()> { - unsafe { - ret(syscall_readonly!( - __NR_fchmodat, - raw_fd(AT_FDCWD), - path, - mode - )) - } -} - -#[inline] -pub(crate) fn chmodat( - dirfd: BorrowedFd<'_>, - path: &CStr, - mode: Mode, - flags: AtFlags, -) -> io::Result<()> { - if flags == AtFlags::SYMLINK_NOFOLLOW { - return Err(io::Errno::OPNOTSUPP); - } - if !flags.is_empty() { - return Err(io::Errno::INVAL); - } - unsafe { ret(syscall_readonly!(__NR_fchmodat, dirfd, path, mode)) } -} - -#[inline] -pub(crate) fn fchmod(fd: BorrowedFd<'_>, mode: Mode) -> io::Result<()> { - unsafe { ret(syscall_readonly!(__NR_fchmod, fd, mode)) } -} - -#[inline] -pub(crate) fn chownat( - dirfd: BorrowedFd<'_>, - path: &CStr, - owner: Option<Uid>, - group: Option<Gid>, - flags: AtFlags, -) -> io::Result<()> { - unsafe { - let (ow, gr) = crate::ugid::translate_fchown_args(owner, group); - ret(syscall_readonly!( - __NR_fchownat, - dirfd, - path, - c_uint(ow), - c_uint(gr), - flags - )) - } -} - -#[inline] -pub(crate) fn chown(path: &CStr, owner: Option<Uid>, group: Option<Gid>) -> io::Result<()> { - // Most architectures have a `chown` syscall. - #[cfg(not(any(target_arch = "aarch64", target_arch = "riscv64")))] - unsafe { - let (ow, gr) = crate::ugid::translate_fchown_args(owner, group); - ret(syscall_readonly!(__NR_chown, path, c_uint(ow), c_uint(gr))) - } - - // Aarch64 and RISC-V don't, so use `fchownat`. - #[cfg(any(target_arch = "aarch64", target_arch = "riscv64"))] - unsafe { - let (ow, gr) = crate::ugid::translate_fchown_args(owner, group); - ret(syscall_readonly!( - __NR_fchownat, - raw_fd(AT_FDCWD), - path, - c_uint(ow), - c_uint(gr), - zero() - )) - } -} - -#[inline] -pub(crate) fn fchown(fd: BorrowedFd<'_>, owner: Option<Uid>, group: Option<Gid>) -> io::Result<()> { - unsafe { - let (ow, gr) = crate::ugid::translate_fchown_args(owner, group); - ret(syscall_readonly!(__NR_fchown, fd, c_uint(ow), c_uint(gr))) - } -} - -#[inline] -pub(crate) fn mknodat( - dirfd: BorrowedFd<'_>, - path: &CStr, - file_type: FileType, - mode: Mode, - dev: u64, -) -> io::Result<()> { - #[cfg(target_pointer_width = "32")] - unsafe { - ret(syscall_readonly!( - __NR_mknodat, - dirfd, - path, - (mode, file_type), - dev_t(dev)? - )) - } - #[cfg(target_pointer_width = "64")] - unsafe { - ret(syscall_readonly!( - __NR_mknodat, - dirfd, - path, - (mode, file_type), - dev_t(dev) - )) - } -} - -#[inline] -pub(crate) fn seek(fd: BorrowedFd<'_>, pos: SeekFrom) -> io::Result<u64> { - let (whence, offset) = match pos { - SeekFrom::Start(pos) => { - let pos: u64 = pos; - // Silently cast; we'll get `EINVAL` if the value is negative. - (SEEK_SET, pos as i64) - } - SeekFrom::End(offset) => (SEEK_END, offset), - SeekFrom::Current(offset) => (SEEK_CUR, offset), - SeekFrom::Data(offset) => (SEEK_DATA, offset), - SeekFrom::Hole(offset) => (SEEK_HOLE, offset), - }; - _seek(fd, offset, whence) -} - -#[inline] -pub(crate) fn _seek(fd: BorrowedFd<'_>, offset: i64, whence: c::c_uint) -> io::Result<u64> { - #[cfg(target_pointer_width = "32")] - unsafe { - let mut result = MaybeUninit::<u64>::uninit(); - ret(syscall!( - __NR__llseek, - fd, - // Don't use the hi/lo functions here because Linux's llseek - // takes its 64-bit argument differently from everything else. - pass_usize((offset >> 32) as usize), - pass_usize(offset as usize), - &mut result, - c_uint(whence) - ))?; - Ok(result.assume_init()) - } - #[cfg(target_pointer_width = "64")] - unsafe { - ret_u64(syscall_readonly!( - __NR_lseek, - fd, - loff_t(offset), - c_uint(whence) - )) - } -} - -#[inline] -pub(crate) fn tell(fd: BorrowedFd<'_>) -> io::Result<u64> { - _seek(fd, 0, SEEK_CUR).map(|x| x as u64) -} - -#[inline] -pub(crate) fn ftruncate(fd: BorrowedFd<'_>, length: u64) -> io::Result<()> { - // <https://github.com/torvalds/linux/blob/fcadab740480e0e0e9fa9bd272acd409884d431a/arch/arm64/kernel/sys32.c#L81-L83> - #[cfg(all( - target_pointer_width = "32", - any( - target_arch = "arm", - target_arch = "mips", - target_arch = "mips32r6", - target_arch = "powerpc" - ), - ))] - unsafe { - ret(syscall_readonly!( - __NR_ftruncate64, - fd, - zero(), - hi(length), - lo(length) - )) - } - #[cfg(all( - target_pointer_width = "32", - not(any( - target_arch = "arm", - target_arch = "mips", - target_arch = "mips32r6", - target_arch = "powerpc" - )), - ))] - unsafe { - ret(syscall_readonly!( - __NR_ftruncate64, - fd, - hi(length), - lo(length) - )) - } - #[cfg(target_pointer_width = "64")] - unsafe { - ret(syscall_readonly!( - __NR_ftruncate, - fd, - loff_t_from_u64(length) - )) - } -} - -#[inline] -pub(crate) fn fallocate( - fd: BorrowedFd<'_>, - mode: FallocateFlags, - offset: u64, - len: u64, -) -> io::Result<()> { - #[cfg(target_pointer_width = "32")] - unsafe { - ret(syscall_readonly!( - __NR_fallocate, - fd, - mode, - hi(offset), - lo(offset), - hi(len), - lo(len) - )) - } - #[cfg(target_pointer_width = "64")] - unsafe { - ret(syscall_readonly!( - __NR_fallocate, - fd, - mode, - loff_t_from_u64(offset), - loff_t_from_u64(len) - )) - } -} - -#[inline] -pub(crate) fn fadvise(fd: BorrowedFd<'_>, pos: u64, len: u64, advice: Advice) -> io::Result<()> { - // On ARM, the arguments are reordered so that the len and pos argument - // pairs are aligned. And ARM has a custom syscall code for this. - #[cfg(target_arch = "arm")] - unsafe { - ret(syscall_readonly!( - __NR_arm_fadvise64_64, - fd, - advice, - hi(pos), - lo(pos), - hi(len), - lo(len) - )) - } - - // On powerpc, the arguments are reordered as on ARM. - #[cfg(target_arch = "powerpc")] - unsafe { - ret(syscall_readonly!( - __NR_fadvise64_64, - fd, - advice, - hi(pos), - lo(pos), - hi(len), - lo(len) - )) - } - - // On mips, the arguments are not reordered, and padding is inserted - // instead to ensure alignment. - #[cfg(any(target_arch = "mips", target_arch = "mips32r6"))] - unsafe { - ret(syscall_readonly!( - __NR_fadvise64, - fd, - zero(), - hi(pos), - lo(pos), - hi(len), - lo(len), - advice - )) - } - - // For all other 32-bit architectures, use `fadvise64_64` so that we get a - // 64-bit length. - #[cfg(all( - target_pointer_width = "32", - not(any( - target_arch = "arm", - target_arch = "mips", - target_arch = "mips32r6", - target_arch = "powerpc" - )), - ))] - unsafe { - ret(syscall_readonly!( - __NR_fadvise64_64, - fd, - hi(pos), - lo(pos), - hi(len), - lo(len), - advice - )) - } - - // On 64-bit architectures, use `fadvise64` which is sufficient. - #[cfg(target_pointer_width = "64")] - unsafe { - ret(syscall_readonly!( - __NR_fadvise64, - fd, - loff_t_from_u64(pos), - loff_t_from_u64(len), - advice - )) - } -} - -#[inline] -pub(crate) fn fsync(fd: BorrowedFd<'_>) -> io::Result<()> { - unsafe { ret(syscall_readonly!(__NR_fsync, fd)) } -} - -#[inline] -pub(crate) fn fdatasync(fd: BorrowedFd<'_>) -> io::Result<()> { - unsafe { ret(syscall_readonly!(__NR_fdatasync, fd)) } -} - -#[inline] -pub(crate) fn flock(fd: BorrowedFd<'_>, operation: FlockOperation) -> io::Result<()> { - unsafe { - ret(syscall_readonly!( - __NR_flock, - fd, - c_uint(operation as c::c_uint) - )) - } -} - -#[inline] -pub(crate) fn syncfs(fd: BorrowedFd<'_>) -> io::Result<()> { - unsafe { ret(syscall_readonly!(__NR_syncfs, fd)) } -} - -#[inline] -pub(crate) fn sync() { - unsafe { ret_infallible(syscall_readonly!(__NR_sync)) } -} - -#[inline] -pub(crate) fn fstat(fd: BorrowedFd<'_>) -> io::Result<Stat> { - // 32-bit and mips64 Linux: `struct stat64` is not y2038 compatible; use - // `statx`. - // - // And, some old platforms don't support `statx`, and some fail with a - // confusing error code, so we call `crate::fs::statx` to handle that. If - // `statx` isn't available, fall back to the buggy system call. - #[cfg(any( - target_pointer_width = "32", - target_arch = "mips64", - target_arch = "mips64r6" - ))] - { - match crate::fs::statx(fd, cstr!(""), AtFlags::EMPTY_PATH, StatxFlags::BASIC_STATS) { - Ok(x) => statx_to_stat(x), - Err(io::Errno::NOSYS) => fstat_old(fd), - Err(err) => Err(err), - } - } - - #[cfg(all( - target_pointer_width = "64", - not(target_arch = "mips64"), - not(target_arch = "mips64r6") - ))] - unsafe { - let mut result = MaybeUninit::<Stat>::uninit(); - ret(syscall!(__NR_fstat, fd, &mut result))?; - Ok(result.assume_init()) - } -} - -#[cfg(any( - target_pointer_width = "32", - target_arch = "mips64", - target_arch = "mips64r6", -))] -fn fstat_old(fd: BorrowedFd<'_>) -> io::Result<Stat> { - let mut result = MaybeUninit::<linux_stat64>::uninit(); - - #[cfg(any(target_arch = "mips64", target_arch = "mips64r6"))] - unsafe { - ret(syscall!(__NR_fstat, fd, &mut result))?; - stat_to_stat(result.assume_init()) - } - - #[cfg(target_pointer_width = "32")] - unsafe { - ret(syscall!(__NR_fstat64, fd, &mut result))?; - stat_to_stat(result.assume_init()) - } -} - -#[inline] -pub(crate) fn stat(path: &CStr) -> io::Result<Stat> { - // See the comments in `fstat` about using `crate::fs::statx` here. - #[cfg(any( - target_pointer_width = "32", - target_arch = "mips64", - target_arch = "mips64r6" - ))] - { - match crate::fs::statx( - crate::fs::CWD.as_fd(), - path, - AtFlags::empty(), - StatxFlags::BASIC_STATS, - ) { - Ok(x) => statx_to_stat(x), - Err(io::Errno::NOSYS) => stat_old(path), - Err(err) => Err(err), - } - } - - #[cfg(all( - target_pointer_width = "64", - not(target_arch = "mips64"), - not(target_arch = "mips64r6"), - ))] - unsafe { - let mut result = MaybeUninit::<Stat>::uninit(); - ret(syscall!( - __NR_newfstatat, - raw_fd(AT_FDCWD), - path, - &mut result, - c_uint(0) - ))?; - Ok(result.assume_init()) - } -} - -#[cfg(any( - target_pointer_width = "32", - target_arch = "mips64", - target_arch = "mips64r6" -))] -fn stat_old(path: &CStr) -> io::Result<Stat> { - let mut result = MaybeUninit::<linux_stat64>::uninit(); - - #[cfg(any(target_arch = "mips64", target_arch = "mips64r6"))] - unsafe { - ret(syscall!( - __NR_newfstatat, - raw_fd(AT_FDCWD), - path, - &mut result, - c_uint(0) - ))?; - stat_to_stat(result.assume_init()) - } - - #[cfg(target_pointer_width = "32")] - unsafe { - ret(syscall!( - __NR_fstatat64, - raw_fd(AT_FDCWD), - path, - &mut result, - c_uint(0) - ))?; - stat_to_stat(result.assume_init()) - } -} - -#[inline] -pub(crate) fn statat(dirfd: BorrowedFd<'_>, path: &CStr, flags: AtFlags) -> io::Result<Stat> { - // See the comments in `fstat` about using `crate::fs::statx` here. - #[cfg(any( - target_pointer_width = "32", - target_arch = "mips64", - target_arch = "mips64r6" - ))] - { - match crate::fs::statx(dirfd, path, flags, StatxFlags::BASIC_STATS) { - Ok(x) => statx_to_stat(x), - Err(io::Errno::NOSYS) => statat_old(dirfd, path, flags), - Err(err) => Err(err), - } - } - - #[cfg(all( - target_pointer_width = "64", - not(target_arch = "mips64"), - not(target_arch = "mips64r6"), - ))] - unsafe { - let mut result = MaybeUninit::<Stat>::uninit(); - ret(syscall!(__NR_newfstatat, dirfd, path, &mut result, flags))?; - Ok(result.assume_init()) - } -} - -#[cfg(any( - target_pointer_width = "32", - target_arch = "mips64", - target_arch = "mips64r6" -))] -fn statat_old(dirfd: BorrowedFd<'_>, path: &CStr, flags: AtFlags) -> io::Result<Stat> { - let mut result = MaybeUninit::<linux_stat64>::uninit(); - - #[cfg(any(target_arch = "mips64", target_arch = "mips64r6"))] - unsafe { - ret(syscall!(__NR_newfstatat, dirfd, path, &mut result, flags))?; - stat_to_stat(result.assume_init()) - } - - #[cfg(target_pointer_width = "32")] - unsafe { - ret(syscall!(__NR_fstatat64, dirfd, path, &mut result, flags))?; - stat_to_stat(result.assume_init()) - } -} - -#[inline] -pub(crate) fn lstat(path: &CStr) -> io::Result<Stat> { - // See the comments in `fstat` about using `crate::fs::statx` here. - #[cfg(any(target_pointer_width = "32", target_arch = "mips64"))] - { - match crate::fs::statx( - crate::fs::CWD.as_fd(), - path, - AtFlags::SYMLINK_NOFOLLOW, - StatxFlags::BASIC_STATS, - ) { - Ok(x) => statx_to_stat(x), - Err(io::Errno::NOSYS) => lstat_old(path), - Err(err) => Err(err), - } - } - - #[cfg(all(target_pointer_width = "64", not(target_arch = "mips64")))] - unsafe { - let mut result = MaybeUninit::<Stat>::uninit(); - ret(syscall!( - __NR_newfstatat, - raw_fd(AT_FDCWD), - path, - &mut result, - c_uint(AT_SYMLINK_NOFOLLOW) - ))?; - Ok(result.assume_init()) - } -} - -#[cfg(any(target_pointer_width = "32", target_arch = "mips64"))] -fn lstat_old(path: &CStr) -> io::Result<Stat> { - let mut result = MaybeUninit::<linux_stat64>::uninit(); - - #[cfg(any(target_arch = "mips64", target_arch = "mips64r6"))] - unsafe { - ret(syscall!( - __NR_newfstatat, - raw_fd(AT_FDCWD), - path, - &mut result, - c_uint(AT_SYMLINK_NOFOLLOW) - ))?; - stat_to_stat(result.assume_init()) - } - - #[cfg(target_pointer_width = "32")] - unsafe { - ret(syscall!( - __NR_fstatat64, - raw_fd(AT_FDCWD), - path, - &mut result, - c_uint(AT_SYMLINK_NOFOLLOW) - ))?; - stat_to_stat(result.assume_init()) - } -} - -/// Convert from a Linux `statx` value to rustix's `Stat`. -#[cfg(any( - target_pointer_width = "32", - target_arch = "mips64", - target_arch = "mips64r6" -))] -fn statx_to_stat(x: crate::fs::Statx) -> io::Result<Stat> { - Ok(Stat { - st_dev: crate::fs::makedev(x.stx_dev_major, x.stx_dev_minor), - st_mode: x.stx_mode.into(), - st_nlink: x.stx_nlink.into(), - st_uid: x.stx_uid.into(), - st_gid: x.stx_gid.into(), - st_rdev: crate::fs::makedev(x.stx_rdev_major, x.stx_rdev_minor), - st_size: x.stx_size.try_into().map_err(|_| io::Errno::OVERFLOW)?, - st_blksize: x.stx_blksize.into(), - st_blocks: x.stx_blocks.into(), - st_atime: x - .stx_atime - .tv_sec - .try_into() - .map_err(|_| io::Errno::OVERFLOW)?, - st_atime_nsec: x.stx_atime.tv_nsec.into(), - st_mtime: x - .stx_mtime - .tv_sec - .try_into() - .map_err(|_| io::Errno::OVERFLOW)?, - st_mtime_nsec: x.stx_mtime.tv_nsec.into(), - st_ctime: x - .stx_ctime - .tv_sec - .try_into() - .map_err(|_| io::Errno::OVERFLOW)?, - st_ctime_nsec: x.stx_ctime.tv_nsec.into(), - st_ino: x.stx_ino.into(), - }) -} - -/// Convert from a Linux `stat64` value to rustix's `Stat`. -#[cfg(target_pointer_width = "32")] -fn stat_to_stat(s64: linux_raw_sys::general::stat64) -> io::Result<Stat> { - Ok(Stat { - st_dev: s64.st_dev.try_into().map_err(|_| io::Errno::OVERFLOW)?, - st_mode: s64.st_mode.try_into().map_err(|_| io::Errno::OVERFLOW)?, - st_nlink: s64.st_nlink.try_into().map_err(|_| io::Errno::OVERFLOW)?, - st_uid: s64.st_uid.try_into().map_err(|_| io::Errno::OVERFLOW)?, - st_gid: s64.st_gid.try_into().map_err(|_| io::Errno::OVERFLOW)?, - st_rdev: s64.st_rdev.try_into().map_err(|_| io::Errno::OVERFLOW)?, - st_size: s64.st_size.try_into().map_err(|_| io::Errno::OVERFLOW)?, - st_blksize: s64.st_blksize.try_into().map_err(|_| io::Errno::OVERFLOW)?, - st_blocks: s64.st_blocks.try_into().map_err(|_| io::Errno::OVERFLOW)?, - st_atime: s64.st_atime.try_into().map_err(|_| io::Errno::OVERFLOW)?, - st_atime_nsec: s64 - .st_atime_nsec - .try_into() - .map_err(|_| io::Errno::OVERFLOW)?, - st_mtime: s64.st_mtime.try_into().map_err(|_| io::Errno::OVERFLOW)?, - st_mtime_nsec: s64 - .st_mtime_nsec - .try_into() - .map_err(|_| io::Errno::OVERFLOW)?, - st_ctime: s64.st_ctime.try_into().map_err(|_| io::Errno::OVERFLOW)?, - st_ctime_nsec: s64 - .st_ctime_nsec - .try_into() - .map_err(|_| io::Errno::OVERFLOW)?, - st_ino: s64.st_ino.try_into().map_err(|_| io::Errno::OVERFLOW)?, - }) -} - -/// Convert from a Linux `stat` value to rustix's `Stat`. -#[cfg(any(target_arch = "mips64", target_arch = "mips64r6"))] -fn stat_to_stat(s: linux_raw_sys::general::stat) -> io::Result<Stat> { - Ok(Stat { - st_dev: s.st_dev.try_into().map_err(|_| io::Errno::OVERFLOW)?, - st_mode: s.st_mode.try_into().map_err(|_| io::Errno::OVERFLOW)?, - st_nlink: s.st_nlink.try_into().map_err(|_| io::Errno::OVERFLOW)?, - st_uid: s.st_uid.try_into().map_err(|_| io::Errno::OVERFLOW)?, - st_gid: s.st_gid.try_into().map_err(|_| io::Errno::OVERFLOW)?, - st_rdev: s.st_rdev.try_into().map_err(|_| io::Errno::OVERFLOW)?, - st_size: s.st_size.try_into().map_err(|_| io::Errno::OVERFLOW)?, - st_blksize: s.st_blksize.try_into().map_err(|_| io::Errno::OVERFLOW)?, - st_blocks: s.st_blocks.try_into().map_err(|_| io::Errno::OVERFLOW)?, - st_atime: s.st_atime.try_into().map_err(|_| io::Errno::OVERFLOW)?, - st_atime_nsec: s - .st_atime_nsec - .try_into() - .map_err(|_| io::Errno::OVERFLOW)?, - st_mtime: s.st_mtime.try_into().map_err(|_| io::Errno::OVERFLOW)?, - st_mtime_nsec: s - .st_mtime_nsec - .try_into() - .map_err(|_| io::Errno::OVERFLOW)?, - st_ctime: s.st_ctime.try_into().map_err(|_| io::Errno::OVERFLOW)?, - st_ctime_nsec: s - .st_ctime_nsec - .try_into() - .map_err(|_| io::Errno::OVERFLOW)?, - st_ino: s.st_ino.try_into().map_err(|_| io::Errno::OVERFLOW)?, - }) -} - -#[inline] -pub(crate) fn statx( - dirfd: BorrowedFd<'_>, - path: &CStr, - flags: AtFlags, - mask: StatxFlags, -) -> io::Result<statx> { - // If a future Linux kernel adds more fields to `struct statx` and users - // passing flags unknown to rustix in `StatxFlags`, we could end up - // writing outside of the buffer. To prevent this possibility, we mask off - // any flags that we don't know about. - // - // This includes `STATX__RESERVED`, which has a value that we know, but - // which could take on arbitrary new meaning in the future. Linux currently - // rejects this flag with `EINVAL`, so we do the same. - // - // This doesn't rely on `STATX_ALL` because [it's deprecated] and already - // doesn't represent all the known flags. - // - // [it's deprecated]: https://patchwork.kernel.org/project/linux-fsdevel/patch/20200505095915.11275-7-mszeredi@redhat.com/ - if (mask.bits() & STATX__RESERVED) == STATX__RESERVED { - return Err(io::Errno::INVAL); - } - let mask = mask & StatxFlags::all(); - - unsafe { - let mut statx_buf = MaybeUninit::<statx>::uninit(); - ret(syscall!( - __NR_statx, - dirfd, - path, - flags, - mask, - &mut statx_buf - ))?; - Ok(statx_buf.assume_init()) - } -} - -#[cfg(not(feature = "linux_4_11"))] -#[inline] -pub(crate) fn is_statx_available() -> bool { - unsafe { - // Call `statx` with null pointers so that if it fails for any reason - // other than `EFAULT`, we know it's not supported. This can use - // "readonly" because we don't pass it a buffer to mutate. - matches!( - ret(syscall_readonly!( - __NR_statx, - raw_fd(AT_FDCWD), - zero(), - zero(), - zero(), - zero() - )), - Err(io::Errno::FAULT) - ) - } -} - -#[inline] -pub(crate) fn fstatfs(fd: BorrowedFd<'_>) -> io::Result<StatFs> { - #[cfg(target_pointer_width = "32")] - unsafe { - let mut result = MaybeUninit::<StatFs>::uninit(); - ret(syscall!( - __NR_fstatfs64, - fd, - size_of::<StatFs, _>(), - &mut result - ))?; - Ok(result.assume_init()) - } - - #[cfg(target_pointer_width = "64")] - unsafe { - let mut result = MaybeUninit::<StatFs>::uninit(); - ret(syscall!(__NR_fstatfs, fd, &mut result))?; - Ok(result.assume_init()) - } -} - -#[inline] -pub(crate) fn fstatvfs(fd: BorrowedFd<'_>) -> io::Result<StatVfs> { - // Linux doesn't have an `fstatvfs` syscall; we have to do `fstatfs` and - // translate the fields as best we can. - let statfs = fstatfs(fd)?; - - Ok(statfs_to_statvfs(statfs)) -} - -#[inline] -pub(crate) fn statfs(path: &CStr) -> io::Result<StatFs> { - #[cfg(target_pointer_width = "32")] - unsafe { - let mut result = MaybeUninit::<StatFs>::uninit(); - ret(syscall!( - __NR_statfs64, - path, - size_of::<StatFs, _>(), - &mut result - ))?; - Ok(result.assume_init()) - } - #[cfg(target_pointer_width = "64")] - unsafe { - let mut result = MaybeUninit::<StatFs>::uninit(); - ret(syscall!(__NR_statfs, path, &mut result))?; - Ok(result.assume_init()) - } -} - -#[inline] -pub(crate) fn statvfs(path: &CStr) -> io::Result<StatVfs> { - // Linux doesn't have a `statvfs` syscall; we have to do `statfs` and - // translate the fields as best we can. - let statfs = statfs(path)?; - - Ok(statfs_to_statvfs(statfs)) -} - -fn statfs_to_statvfs(statfs: StatFs) -> StatVfs { - let __kernel_fsid_t { val } = statfs.f_fsid; - let [f_fsid_val0, f_fsid_val1]: [i32; 2] = val; - - StatVfs { - f_bsize: statfs.f_bsize as u64, - f_frsize: if statfs.f_frsize != 0 { - statfs.f_frsize - } else { - statfs.f_bsize - } as u64, - f_blocks: statfs.f_blocks as u64, - f_bfree: statfs.f_bfree as u64, - f_bavail: statfs.f_bavail as u64, - f_files: statfs.f_files as u64, - f_ffree: statfs.f_ffree as u64, - f_favail: statfs.f_ffree as u64, - f_fsid: u64::from(f_fsid_val0 as u32) | u64::from(f_fsid_val1 as u32) << 32, - f_flag: StatVfsMountFlags::from_bits_retain(statfs.f_flags as u64), - f_namemax: statfs.f_namelen as u64, - } -} - -#[cfg(feature = "alloc")] -#[inline] -pub(crate) fn readlink(path: &CStr, buf: &mut [u8]) -> io::Result<usize> { - let (buf_addr_mut, buf_len) = slice_mut(buf); - unsafe { - ret_usize(syscall!( - __NR_readlinkat, - raw_fd(AT_FDCWD), - path, - buf_addr_mut, - buf_len - )) - } -} - -#[inline] -pub(crate) fn readlinkat( - dirfd: BorrowedFd<'_>, - path: &CStr, - buf: &mut [MaybeUninit<u8>], -) -> io::Result<usize> { - let (buf_addr_mut, buf_len) = slice_mut(buf); - unsafe { - ret_usize(syscall!( - __NR_readlinkat, - dirfd, - path, - buf_addr_mut, - buf_len - )) - } -} - -#[inline] -pub(crate) fn fcntl_getfl(fd: BorrowedFd<'_>) -> io::Result<OFlags> { - #[cfg(target_pointer_width = "32")] - unsafe { - ret_c_uint(syscall_readonly!(__NR_fcntl64, fd, c_uint(F_GETFL))) - .map(OFlags::from_bits_retain) - } - #[cfg(target_pointer_width = "64")] - unsafe { - ret_c_uint(syscall_readonly!(__NR_fcntl, fd, c_uint(F_GETFL))).map(OFlags::from_bits_retain) - } -} - -#[inline] -pub(crate) fn fcntl_setfl(fd: BorrowedFd<'_>, flags: OFlags) -> io::Result<()> { - // Always enable support for large files. - let flags = flags | OFlags::from_bits_retain(c::O_LARGEFILE); - - #[cfg(target_pointer_width = "32")] - unsafe { - ret(syscall_readonly!(__NR_fcntl64, fd, c_uint(F_SETFL), flags)) - } - #[cfg(target_pointer_width = "64")] - unsafe { - ret(syscall_readonly!(__NR_fcntl, fd, c_uint(F_SETFL), flags)) - } -} - -#[inline] -pub(crate) fn fcntl_get_seals(fd: BorrowedFd<'_>) -> io::Result<SealFlags> { - #[cfg(target_pointer_width = "32")] - unsafe { - ret_c_int(syscall_readonly!(__NR_fcntl64, fd, c_uint(F_GET_SEALS))) - .map(|seals| SealFlags::from_bits_retain(seals as u32)) - } - #[cfg(target_pointer_width = "64")] - unsafe { - ret_c_int(syscall_readonly!(__NR_fcntl, fd, c_uint(F_GET_SEALS))) - .map(|seals| SealFlags::from_bits_retain(seals as u32)) - } -} - -#[inline] -pub(crate) fn fcntl_add_seals(fd: BorrowedFd<'_>, seals: SealFlags) -> io::Result<()> { - #[cfg(target_pointer_width = "32")] - unsafe { - ret(syscall_readonly!( - __NR_fcntl64, - fd, - c_uint(F_ADD_SEALS), - seals - )) - } - #[cfg(target_pointer_width = "64")] - unsafe { - ret(syscall_readonly!( - __NR_fcntl, - fd, - c_uint(F_ADD_SEALS), - seals - )) - } -} - -#[inline] -pub(crate) fn fcntl_lock(fd: BorrowedFd<'_>, operation: FlockOperation) -> io::Result<()> { - #[cfg(target_pointer_width = "64")] - use linux_raw_sys::general::{flock, F_SETLK, F_SETLKW}; - #[cfg(target_pointer_width = "32")] - use linux_raw_sys::general::{flock64 as flock, F_SETLK64 as F_SETLK, F_SETLKW64 as F_SETLKW}; - use linux_raw_sys::general::{F_RDLCK, F_UNLCK, F_WRLCK}; - - let (cmd, l_type) = match operation { - FlockOperation::LockShared => (F_SETLKW, F_RDLCK), - FlockOperation::LockExclusive => (F_SETLKW, F_WRLCK), - FlockOperation::Unlock => (F_SETLKW, F_UNLCK), - FlockOperation::NonBlockingLockShared => (F_SETLK, F_RDLCK), - FlockOperation::NonBlockingLockExclusive => (F_SETLK, F_WRLCK), - FlockOperation::NonBlockingUnlock => (F_SETLK, F_UNLCK), - }; - - let lock = flock { - l_type: l_type as _, - - // When `l_len` is zero, this locks all the bytes from - // `l_whence`/`l_start` to the end of the file, even as the - // file grows dynamically. - l_whence: SEEK_SET as _, - l_start: 0, - l_len: 0, - - // Unused. - l_pid: 0, - }; - - #[cfg(target_pointer_width = "32")] - unsafe { - ret(syscall_readonly!( - __NR_fcntl64, - fd, - c_uint(cmd), - by_ref(&lock) - )) - } - #[cfg(target_pointer_width = "64")] - unsafe { - ret(syscall_readonly!( - __NR_fcntl, - fd, - c_uint(cmd), - by_ref(&lock) - )) - } -} - -#[inline] -pub(crate) fn rename(old_path: &CStr, new_path: &CStr) -> io::Result<()> { - #[cfg(target_arch = "riscv64")] - unsafe { - ret(syscall_readonly!( - __NR_renameat2, - raw_fd(AT_FDCWD), - old_path, - raw_fd(AT_FDCWD), - new_path, - c_uint(0) - )) - } - #[cfg(not(target_arch = "riscv64"))] - unsafe { - ret(syscall_readonly!( - __NR_renameat, - raw_fd(AT_FDCWD), - old_path, - raw_fd(AT_FDCWD), - new_path - )) - } -} - -#[inline] -pub(crate) fn renameat( - old_dirfd: BorrowedFd<'_>, - old_path: &CStr, - new_dirfd: BorrowedFd<'_>, - new_path: &CStr, -) -> io::Result<()> { - #[cfg(target_arch = "riscv64")] - unsafe { - ret(syscall_readonly!( - __NR_renameat2, - old_dirfd, - old_path, - new_dirfd, - new_path, - c_uint(0) - )) - } - #[cfg(not(target_arch = "riscv64"))] - unsafe { - ret(syscall_readonly!( - __NR_renameat, - old_dirfd, - old_path, - new_dirfd, - new_path - )) - } -} - -#[inline] -pub(crate) fn renameat2( - old_dirfd: BorrowedFd<'_>, - old_path: &CStr, - new_dirfd: BorrowedFd<'_>, - new_path: &CStr, - flags: RenameFlags, -) -> io::Result<()> { - unsafe { - ret(syscall_readonly!( - __NR_renameat2, - old_dirfd, - old_path, - new_dirfd, - new_path, - flags - )) - } -} - -#[inline] -pub(crate) fn unlink(path: &CStr) -> io::Result<()> { - unsafe { - ret(syscall_readonly!( - __NR_unlinkat, - raw_fd(AT_FDCWD), - path, - c_uint(0) - )) - } -} - -#[inline] -pub(crate) fn unlinkat(dirfd: BorrowedFd<'_>, path: &CStr, flags: AtFlags) -> io::Result<()> { - unsafe { ret(syscall_readonly!(__NR_unlinkat, dirfd, path, flags)) } -} - -#[inline] -pub(crate) fn rmdir(path: &CStr) -> io::Result<()> { - unsafe { - ret(syscall_readonly!( - __NR_unlinkat, - raw_fd(AT_FDCWD), - path, - c_uint(AT_REMOVEDIR) - )) - } -} - -#[inline] -pub(crate) fn link(old_path: &CStr, new_path: &CStr) -> io::Result<()> { - unsafe { - ret(syscall_readonly!( - __NR_linkat, - raw_fd(AT_FDCWD), - old_path, - raw_fd(AT_FDCWD), - new_path, - c_uint(0) - )) - } -} - -#[inline] -pub(crate) fn linkat( - old_dirfd: BorrowedFd<'_>, - old_path: &CStr, - new_dirfd: BorrowedFd<'_>, - new_path: &CStr, - flags: AtFlags, -) -> io::Result<()> { - unsafe { - ret(syscall_readonly!( - __NR_linkat, - old_dirfd, - old_path, - new_dirfd, - new_path, - flags - )) - } -} - -#[inline] -pub(crate) fn symlink(old_path: &CStr, new_path: &CStr) -> io::Result<()> { - unsafe { - ret(syscall_readonly!( - __NR_symlinkat, - old_path, - raw_fd(AT_FDCWD), - new_path - )) - } -} - -#[inline] -pub(crate) fn symlinkat(old_path: &CStr, dirfd: BorrowedFd<'_>, new_path: &CStr) -> io::Result<()> { - unsafe { ret(syscall_readonly!(__NR_symlinkat, old_path, dirfd, new_path)) } -} - -#[inline] -pub(crate) fn mkdir(path: &CStr, mode: Mode) -> io::Result<()> { - unsafe { - ret(syscall_readonly!( - __NR_mkdirat, - raw_fd(AT_FDCWD), - path, - mode - )) - } -} - -#[inline] -pub(crate) fn mkdirat(dirfd: BorrowedFd<'_>, path: &CStr, mode: Mode) -> io::Result<()> { - unsafe { ret(syscall_readonly!(__NR_mkdirat, dirfd, path, mode)) } -} - -#[cfg(feature = "alloc")] -#[inline] -pub(crate) fn getdents(fd: BorrowedFd<'_>, dirent: &mut [u8]) -> io::Result<usize> { - let (dirent_addr_mut, dirent_len) = slice_mut(dirent); - - unsafe { ret_usize(syscall!(__NR_getdents64, fd, dirent_addr_mut, dirent_len)) } -} - -#[inline] -pub(crate) fn getdents_uninit( - fd: BorrowedFd<'_>, - dirent: &mut [MaybeUninit<u8>], -) -> io::Result<usize> { - let (dirent_addr_mut, dirent_len) = slice_mut(dirent); - - unsafe { ret_usize(syscall!(__NR_getdents64, fd, dirent_addr_mut, dirent_len)) } -} - -#[inline] -pub(crate) fn utimensat( - dirfd: BorrowedFd<'_>, - path: &CStr, - times: &Timestamps, - flags: AtFlags, -) -> io::Result<()> { - _utimensat(dirfd, Some(path), times, flags) -} - -#[inline] -fn _utimensat( - dirfd: BorrowedFd<'_>, - path: Option<&CStr>, - times: &Timestamps, - flags: AtFlags, -) -> io::Result<()> { - // `utimensat_time64` was introduced in Linux 5.1. The old `utimensat` - // syscall is not y2038-compatible on 32-bit architectures. - #[cfg(target_pointer_width = "32")] - unsafe { - match ret(syscall_readonly!( - __NR_utimensat_time64, - dirfd, - path, - by_ref(times), - flags - )) { - Err(io::Errno::NOSYS) => _utimensat_old(dirfd, path, times, flags), - otherwise => otherwise, - } - } - #[cfg(target_pointer_width = "64")] - unsafe { - ret(syscall_readonly!( - __NR_utimensat, - dirfd, - path, - by_ref(times), - flags - )) - } -} - -#[cfg(target_pointer_width = "32")] -unsafe fn _utimensat_old( - dirfd: BorrowedFd<'_>, - path: Option<&CStr>, - times: &Timestamps, - flags: AtFlags, -) -> io::Result<()> { - // See the comments in `rustix_clock_gettime_via_syscall` about - // emulation. - let old_times = [ - __kernel_old_timespec { - tv_sec: times - .last_access - .tv_sec - .try_into() - .map_err(|_| io::Errno::OVERFLOW)?, - tv_nsec: times - .last_access - .tv_nsec - .try_into() - .map_err(|_| io::Errno::INVAL)?, - }, - __kernel_old_timespec { - tv_sec: times - .last_modification - .tv_sec - .try_into() - .map_err(|_| io::Errno::OVERFLOW)?, - tv_nsec: times - .last_modification - .tv_nsec - .try_into() - .map_err(|_| io::Errno::INVAL)?, - }, - ]; - // The length of the array is fixed and not passed into the syscall. - let old_times_addr = slice_just_addr(&old_times); - ret(syscall_readonly!( - __NR_utimensat, - dirfd, - path, - old_times_addr, - flags - )) -} - -#[inline] -pub(crate) fn futimens(fd: BorrowedFd<'_>, times: &Timestamps) -> io::Result<()> { - _utimensat(fd, None, times, AtFlags::empty()) -} - -#[inline] -pub(crate) fn access(path: &CStr, access: Access) -> io::Result<()> { - #[cfg(any(target_arch = "aarch64", target_arch = "riscv64"))] - { - accessat_noflags(CWD.as_fd(), path, access) - } - - #[cfg(not(any(target_arch = "aarch64", target_arch = "riscv64")))] - unsafe { - ret(syscall_readonly!(__NR_access, path, access)) - } -} - -pub(crate) fn accessat( - dirfd: BorrowedFd<'_>, - path: &CStr, - access: Access, - flags: AtFlags, -) -> io::Result<()> { - if !flags - .difference(AtFlags::EACCESS | AtFlags::SYMLINK_NOFOLLOW) - .is_empty() - { - return Err(io::Errno::INVAL); - } - - // Linux's `faccessat` syscall doesn't have a flags argument, so if we have - // any flags, use the newer `faccessat2` introduced in Linux 5.8 which - // does. Unless we're on Android where using newer system calls can cause - // seccomp to abort the process. - #[cfg(not(target_os = "android"))] - if !flags.is_empty() { - unsafe { - match ret(syscall_readonly!( - __NR_faccessat2, - dirfd, - path, - access, - flags - )) { - Ok(()) => return Ok(()), - Err(io::Errno::NOSYS) => {} - Err(other) => return Err(other), - } - } - } - - // Linux's `faccessat` doesn't have a flags parameter. If we have - // `AT_EACCESS` and we're not setuid or setgid, we can emulate it. - if flags.is_empty() - || (flags.bits() == AT_EACCESS - && crate::backend::ugid::syscalls::getuid() - == crate::backend::ugid::syscalls::geteuid() - && crate::backend::ugid::syscalls::getgid() - == crate::backend::ugid::syscalls::getegid()) - { - return accessat_noflags(dirfd, path, access); - } - - Err(io::Errno::NOSYS) -} - -#[inline] -fn accessat_noflags(dirfd: BorrowedFd<'_>, path: &CStr, access: Access) -> io::Result<()> { - unsafe { ret(syscall_readonly!(__NR_faccessat, dirfd, path, access)) } -} - -#[inline] -pub(crate) fn copy_file_range( - fd_in: BorrowedFd<'_>, - off_in: Option<&mut u64>, - fd_out: BorrowedFd<'_>, - off_out: Option<&mut u64>, - len: usize, -) -> io::Result<usize> { - unsafe { - ret_usize(syscall!( - __NR_copy_file_range, - fd_in, - opt_mut(off_in), - fd_out, - opt_mut(off_out), - pass_usize(len), - c_uint(0) - )) - } -} - -#[inline] -pub(crate) fn memfd_create(name: &CStr, flags: MemfdFlags) -> io::Result<OwnedFd> { - unsafe { ret_owned_fd(syscall_readonly!(__NR_memfd_create, name, flags)) } -} - -#[inline] -pub(crate) fn sendfile( - out_fd: BorrowedFd<'_>, - in_fd: BorrowedFd<'_>, - offset: Option<&mut u64>, - count: usize, -) -> io::Result<usize> { - #[cfg(target_pointer_width = "32")] - unsafe { - ret_usize(syscall!( - __NR_sendfile64, - out_fd, - in_fd, - opt_mut(offset), - pass_usize(count) - )) - } - #[cfg(target_pointer_width = "64")] - unsafe { - ret_usize(syscall!( - __NR_sendfile, - out_fd, - in_fd, - opt_mut(offset), - pass_usize(count) - )) - } -} - -#[inline] -pub(crate) fn inotify_init1(flags: inotify::CreateFlags) -> io::Result<OwnedFd> { - unsafe { ret_owned_fd(syscall_readonly!(__NR_inotify_init1, flags)) } -} - -#[inline] -pub(crate) fn inotify_add_watch( - infd: BorrowedFd<'_>, - path: &CStr, - flags: inotify::WatchFlags, -) -> io::Result<i32> { - unsafe { ret_c_int(syscall_readonly!(__NR_inotify_add_watch, infd, path, flags)) } -} - -#[inline] -pub(crate) fn inotify_rm_watch(infd: BorrowedFd<'_>, wfd: i32) -> io::Result<()> { - unsafe { ret(syscall_readonly!(__NR_inotify_rm_watch, infd, c_int(wfd))) } -} - -#[inline] -pub(crate) fn getxattr(path: &CStr, name: &CStr, value: &mut [u8]) -> io::Result<usize> { - let (value_addr_mut, value_len) = slice_mut(value); - unsafe { - ret_usize(syscall!( - __NR_getxattr, - path, - name, - value_addr_mut, - value_len - )) - } -} - -#[inline] -pub(crate) fn lgetxattr(path: &CStr, name: &CStr, value: &mut [u8]) -> io::Result<usize> { - let (value_addr_mut, value_len) = slice_mut(value); - unsafe { - ret_usize(syscall!( - __NR_lgetxattr, - path, - name, - value_addr_mut, - value_len - )) - } -} - -#[inline] -pub(crate) fn fgetxattr(fd: BorrowedFd<'_>, name: &CStr, value: &mut [u8]) -> io::Result<usize> { - let (value_addr_mut, value_len) = slice_mut(value); - unsafe { - ret_usize(syscall!( - __NR_fgetxattr, - fd, - name, - value_addr_mut, - value_len - )) - } -} - -#[inline] -pub(crate) fn setxattr( - path: &CStr, - name: &CStr, - value: &[u8], - flags: XattrFlags, -) -> io::Result<()> { - let (value_addr, value_len) = slice(value); - unsafe { - ret(syscall_readonly!( - __NR_setxattr, - path, - name, - value_addr, - value_len, - flags - )) - } -} - -#[inline] -pub(crate) fn lsetxattr( - path: &CStr, - name: &CStr, - value: &[u8], - flags: XattrFlags, -) -> io::Result<()> { - let (value_addr, value_len) = slice(value); - unsafe { - ret(syscall_readonly!( - __NR_lsetxattr, - path, - name, - value_addr, - value_len, - flags - )) - } -} - -#[inline] -pub(crate) fn fsetxattr( - fd: BorrowedFd<'_>, - name: &CStr, - value: &[u8], - flags: XattrFlags, -) -> io::Result<()> { - let (value_addr, value_len) = slice(value); - unsafe { - ret(syscall_readonly!( - __NR_fsetxattr, - fd, - name, - value_addr, - value_len, - flags - )) - } -} - -#[inline] -pub(crate) fn listxattr(path: &CStr, list: &mut [c::c_char]) -> io::Result<usize> { - let (list_addr_mut, list_len) = slice_mut(list); - unsafe { ret_usize(syscall!(__NR_listxattr, path, list_addr_mut, list_len)) } -} - -#[inline] -pub(crate) fn llistxattr(path: &CStr, list: &mut [c::c_char]) -> io::Result<usize> { - let (list_addr_mut, list_len) = slice_mut(list); - unsafe { ret_usize(syscall!(__NR_llistxattr, path, list_addr_mut, list_len)) } -} - -#[inline] -pub(crate) fn flistxattr(fd: BorrowedFd<'_>, list: &mut [c::c_char]) -> io::Result<usize> { - let (list_addr_mut, list_len) = slice_mut(list); - unsafe { ret_usize(syscall!(__NR_flistxattr, fd, list_addr_mut, list_len)) } -} - -#[inline] -pub(crate) fn removexattr(path: &CStr, name: &CStr) -> io::Result<()> { - unsafe { ret(syscall_readonly!(__NR_removexattr, path, name)) } -} - -#[inline] -pub(crate) fn lremovexattr(path: &CStr, name: &CStr) -> io::Result<()> { - unsafe { ret(syscall_readonly!(__NR_lremovexattr, path, name)) } -} - -#[inline] -pub(crate) fn fremovexattr(fd: BorrowedFd<'_>, name: &CStr) -> io::Result<()> { - unsafe { ret(syscall_readonly!(__NR_fremovexattr, fd, name)) } -} - -#[test] -fn test_sizes() { - assert_eq_size!(linux_raw_sys::general::__kernel_loff_t, u64); - - // Assert that `Timestamps` has the expected layout. - assert_eq_size!([linux_raw_sys::general::__kernel_timespec; 2], Timestamps); -} diff --git a/vendor/rustix/src/backend/linux_raw/fs/types.rs b/vendor/rustix/src/backend/linux_raw/fs/types.rs deleted file mode 100644 index 39823c4..0000000 --- a/vendor/rustix/src/backend/linux_raw/fs/types.rs +++ /dev/null @@ -1,739 +0,0 @@ -use crate::backend::c; -use bitflags::bitflags; - -bitflags! { - /// `*_OK` constants for use with [`accessat`]. - /// - /// [`accessat`]: fn.accessat.html - #[repr(transparent)] - #[derive(Copy, Clone, Eq, PartialEq, Hash, Debug)] - pub struct Access: c::c_uint { - /// `R_OK` - const READ_OK = linux_raw_sys::general::R_OK; - - /// `W_OK` - const WRITE_OK = linux_raw_sys::general::W_OK; - - /// `X_OK` - const EXEC_OK = linux_raw_sys::general::X_OK; - - /// `F_OK` - const EXISTS = linux_raw_sys::general::F_OK; - - /// <https://docs.rs/bitflags/*/bitflags/#externally-defined-flags> - const _ = !0; - } -} - -bitflags! { - /// `AT_*` constants for use with [`openat`], [`statat`], and other `*at` - /// functions. - /// - /// [`openat`]: crate::fs::openat - /// [`statat`]: crate::fs::statat - #[repr(transparent)] - #[derive(Copy, Clone, Eq, PartialEq, Hash, Debug)] - pub struct AtFlags: c::c_uint { - /// `AT_SYMLINK_NOFOLLOW` - const SYMLINK_NOFOLLOW = linux_raw_sys::general::AT_SYMLINK_NOFOLLOW; - - /// `AT_EACCESS` - const EACCESS = linux_raw_sys::general::AT_EACCESS; - - /// `AT_REMOVEDIR` - const REMOVEDIR = linux_raw_sys::general::AT_REMOVEDIR; - - /// `AT_SYMLINK_FOLLOW` - const SYMLINK_FOLLOW = linux_raw_sys::general::AT_SYMLINK_FOLLOW; - - /// `AT_NO_AUTOMOUNT` - const NO_AUTOMOUNT = linux_raw_sys::general::AT_NO_AUTOMOUNT; - - /// `AT_EMPTY_PATH` - const EMPTY_PATH = linux_raw_sys::general::AT_EMPTY_PATH; - - /// `AT_STATX_SYNC_AS_STAT` - const STATX_SYNC_AS_STAT = linux_raw_sys::general::AT_STATX_SYNC_AS_STAT; - - /// `AT_STATX_FORCE_SYNC` - const STATX_FORCE_SYNC = linux_raw_sys::general::AT_STATX_FORCE_SYNC; - - /// `AT_STATX_DONT_SYNC` - const STATX_DONT_SYNC = linux_raw_sys::general::AT_STATX_DONT_SYNC; - - /// <https://docs.rs/bitflags/*/bitflags/#externally-defined-flags> - const _ = !0; - } -} - -bitflags! { - /// `S_I*` constants for use with [`openat`], [`chmodat`], and [`fchmod`]. - /// - /// [`openat`]: crate::fs::openat - /// [`chmodat`]: crate::fs::chmodat - /// [`fchmod`]: crate::fs::fchmod - #[repr(transparent)] - #[derive(Copy, Clone, Eq, PartialEq, Hash, Debug)] - pub struct Mode: RawMode { - /// `S_IRWXU` - const RWXU = linux_raw_sys::general::S_IRWXU; - - /// `S_IRUSR` - const RUSR = linux_raw_sys::general::S_IRUSR; - - /// `S_IWUSR` - const WUSR = linux_raw_sys::general::S_IWUSR; - - /// `S_IXUSR` - const XUSR = linux_raw_sys::general::S_IXUSR; - - /// `S_IRWXG` - const RWXG = linux_raw_sys::general::S_IRWXG; - - /// `S_IRGRP` - const RGRP = linux_raw_sys::general::S_IRGRP; - - /// `S_IWGRP` - const WGRP = linux_raw_sys::general::S_IWGRP; - - /// `S_IXGRP` - const XGRP = linux_raw_sys::general::S_IXGRP; - - /// `S_IRWXO` - const RWXO = linux_raw_sys::general::S_IRWXO; - - /// `S_IROTH` - const ROTH = linux_raw_sys::general::S_IROTH; - - /// `S_IWOTH` - const WOTH = linux_raw_sys::general::S_IWOTH; - - /// `S_IXOTH` - const XOTH = linux_raw_sys::general::S_IXOTH; - - /// `S_ISUID` - const SUID = linux_raw_sys::general::S_ISUID; - - /// `S_ISGID` - const SGID = linux_raw_sys::general::S_ISGID; - - /// `S_ISVTX` - const SVTX = linux_raw_sys::general::S_ISVTX; - - /// <https://docs.rs/bitflags/*/bitflags/#externally-defined-flags> - const _ = !0; - } -} - -impl Mode { - /// Construct a `Mode` from the mode bits of the `st_mode` field of a - /// `Mode`. - #[inline] - pub const fn from_raw_mode(st_mode: RawMode) -> Self { - Self::from_bits_truncate(st_mode) - } - - /// Construct an `st_mode` value from a `Mode`. - #[inline] - pub const fn as_raw_mode(self) -> RawMode { - self.bits() - } -} - -impl From<RawMode> for Mode { - /// Support conversions from raw mode values to `Mode`. - /// - /// ``` - /// use rustix::fs::{Mode, RawMode}; - /// assert_eq!(Mode::from(0o700), Mode::RWXU); - /// ``` - #[inline] - fn from(st_mode: RawMode) -> Self { - Self::from_raw_mode(st_mode) - } -} - -impl From<Mode> for RawMode { - /// Support conversions from `Mode` to raw mode values. - /// - /// ``` - /// use rustix::fs::{Mode, RawMode}; - /// assert_eq!(RawMode::from(Mode::RWXU), 0o700); - /// ``` - #[inline] - fn from(mode: Mode) -> Self { - mode.as_raw_mode() - } -} - -bitflags! { - /// `O_*` constants for use with [`openat`]. - /// - /// [`openat`]: crate::fs::openat - #[repr(transparent)] - #[derive(Copy, Clone, Eq, PartialEq, Hash, Debug)] - pub struct OFlags: c::c_uint { - /// `O_ACCMODE` - const ACCMODE = linux_raw_sys::general::O_ACCMODE; - - /// Similar to `ACCMODE`, but just includes the read/write flags, and - /// no other flags. - /// - /// On some platforms, `PATH` may be included in `ACCMODE`, when - /// sometimes we really just want the read/write bits. Caution is - /// indicated, as the presence of `PATH` may mean that the read/write - /// bits don't have their usual meaning. - const RWMODE = linux_raw_sys::general::O_RDONLY | - linux_raw_sys::general::O_WRONLY | - linux_raw_sys::general::O_RDWR; - - /// `O_APPEND` - const APPEND = linux_raw_sys::general::O_APPEND; - - /// `O_CREAT` - #[doc(alias = "CREAT")] - const CREATE = linux_raw_sys::general::O_CREAT; - - /// `O_DIRECTORY` - const DIRECTORY = linux_raw_sys::general::O_DIRECTORY; - - /// `O_DSYNC`. - const DSYNC = linux_raw_sys::general::O_SYNC; - - /// `O_EXCL` - const EXCL = linux_raw_sys::general::O_EXCL; - - /// `O_FSYNC`. - const FSYNC = linux_raw_sys::general::O_SYNC; - - /// `O_NOFOLLOW` - const NOFOLLOW = linux_raw_sys::general::O_NOFOLLOW; - - /// `O_NONBLOCK` - const NONBLOCK = linux_raw_sys::general::O_NONBLOCK; - - /// `O_RDONLY` - const RDONLY = linux_raw_sys::general::O_RDONLY; - - /// `O_WRONLY` - const WRONLY = linux_raw_sys::general::O_WRONLY; - - /// `O_RDWR` - /// - /// This is not equal to `RDONLY | WRONLY`. It's a distinct flag. - const RDWR = linux_raw_sys::general::O_RDWR; - - /// `O_NOCTTY` - const NOCTTY = linux_raw_sys::general::O_NOCTTY; - - /// `O_RSYNC`. - const RSYNC = linux_raw_sys::general::O_SYNC; - - /// `O_SYNC` - const SYNC = linux_raw_sys::general::O_SYNC; - - /// `O_TRUNC` - const TRUNC = linux_raw_sys::general::O_TRUNC; - - /// `O_PATH` - const PATH = linux_raw_sys::general::O_PATH; - - /// `O_CLOEXEC` - const CLOEXEC = linux_raw_sys::general::O_CLOEXEC; - - /// `O_TMPFILE` - const TMPFILE = linux_raw_sys::general::O_TMPFILE; - - /// `O_NOATIME` - const NOATIME = linux_raw_sys::general::O_NOATIME; - - /// `O_DIRECT` - const DIRECT = linux_raw_sys::general::O_DIRECT; - - /// <https://docs.rs/bitflags/*/bitflags/#externally-defined-flags> - const _ = !0; - } -} - -bitflags! { - /// `RESOLVE_*` constants for use with [`openat2`]. - /// - /// [`openat2`]: crate::fs::openat2 - #[repr(transparent)] - #[derive(Default, Copy, Clone, Eq, PartialEq, Hash, Debug)] - pub struct ResolveFlags: u64 { - /// `RESOLVE_NO_XDEV` - const NO_XDEV = linux_raw_sys::general::RESOLVE_NO_XDEV as u64; - - /// `RESOLVE_NO_MAGICLINKS` - const NO_MAGICLINKS = linux_raw_sys::general::RESOLVE_NO_MAGICLINKS as u64; - - /// `RESOLVE_NO_SYMLINKS` - const NO_SYMLINKS = linux_raw_sys::general::RESOLVE_NO_SYMLINKS as u64; - - /// `RESOLVE_BENEATH` - const BENEATH = linux_raw_sys::general::RESOLVE_BENEATH as u64; - - /// `RESOLVE_IN_ROOT` - const IN_ROOT = linux_raw_sys::general::RESOLVE_IN_ROOT as u64; - - /// `RESOLVE_CACHED` (since Linux 5.12) - const CACHED = linux_raw_sys::general::RESOLVE_CACHED as u64; - - /// <https://docs.rs/bitflags/*/bitflags/#externally-defined-flags> - const _ = !0; - } -} - -bitflags! { - /// `RENAME_*` constants for use with [`renameat_with`]. - /// - /// [`renameat_with`]: crate::fs::renameat_with - #[repr(transparent)] - #[derive(Copy, Clone, Eq, PartialEq, Hash, Debug)] - pub struct RenameFlags: c::c_uint { - /// `RENAME_EXCHANGE` - const EXCHANGE = linux_raw_sys::general::RENAME_EXCHANGE; - - /// `RENAME_NOREPLACE` - const NOREPLACE = linux_raw_sys::general::RENAME_NOREPLACE; - - /// `RENAME_WHITEOUT` - const WHITEOUT = linux_raw_sys::general::RENAME_WHITEOUT; - - /// <https://docs.rs/bitflags/*/bitflags/#externally-defined-flags> - const _ = !0; - } -} - -/// `S_IF*` constants for use with [`mknodat`] and [`Stat`]'s `st_mode` field. -/// -/// [`mknodat`]: crate::fs::mknodat -/// [`Stat`]: crate::fs::Stat -#[derive(Clone, Copy, Debug, PartialEq, Eq)] -pub enum FileType { - /// `S_IFREG` - RegularFile = linux_raw_sys::general::S_IFREG as isize, - - /// `S_IFDIR` - Directory = linux_raw_sys::general::S_IFDIR as isize, - - /// `S_IFLNK` - Symlink = linux_raw_sys::general::S_IFLNK as isize, - - /// `S_IFIFO` - #[doc(alias = "IFO")] - Fifo = linux_raw_sys::general::S_IFIFO as isize, - - /// `S_IFSOCK` - Socket = linux_raw_sys::general::S_IFSOCK as isize, - - /// `S_IFCHR` - CharacterDevice = linux_raw_sys::general::S_IFCHR as isize, - - /// `S_IFBLK` - BlockDevice = linux_raw_sys::general::S_IFBLK as isize, - - /// An unknown filesystem object. - Unknown, -} - -impl FileType { - /// Construct a `FileType` from the `S_IFMT` bits of the `st_mode` field of - /// a `Stat`. - #[inline] - pub const fn from_raw_mode(st_mode: RawMode) -> Self { - match st_mode & linux_raw_sys::general::S_IFMT { - linux_raw_sys::general::S_IFREG => Self::RegularFile, - linux_raw_sys::general::S_IFDIR => Self::Directory, - linux_raw_sys::general::S_IFLNK => Self::Symlink, - linux_raw_sys::general::S_IFIFO => Self::Fifo, - linux_raw_sys::general::S_IFSOCK => Self::Socket, - linux_raw_sys::general::S_IFCHR => Self::CharacterDevice, - linux_raw_sys::general::S_IFBLK => Self::BlockDevice, - _ => Self::Unknown, - } - } - - /// Construct an `st_mode` value from a `FileType`. - #[inline] - pub const fn as_raw_mode(self) -> RawMode { - match self { - Self::RegularFile => linux_raw_sys::general::S_IFREG, - Self::Directory => linux_raw_sys::general::S_IFDIR, - Self::Symlink => linux_raw_sys::general::S_IFLNK, - Self::Fifo => linux_raw_sys::general::S_IFIFO, - Self::Socket => linux_raw_sys::general::S_IFSOCK, - Self::CharacterDevice => linux_raw_sys::general::S_IFCHR, - Self::BlockDevice => linux_raw_sys::general::S_IFBLK, - Self::Unknown => linux_raw_sys::general::S_IFMT, - } - } - - /// Construct a `FileType` from the `d_type` field of a `c::dirent`. - #[inline] - pub(crate) const fn from_dirent_d_type(d_type: u8) -> Self { - match d_type as u32 { - linux_raw_sys::general::DT_REG => Self::RegularFile, - linux_raw_sys::general::DT_DIR => Self::Directory, - linux_raw_sys::general::DT_LNK => Self::Symlink, - linux_raw_sys::general::DT_SOCK => Self::Socket, - linux_raw_sys::general::DT_FIFO => Self::Fifo, - linux_raw_sys::general::DT_CHR => Self::CharacterDevice, - linux_raw_sys::general::DT_BLK => Self::BlockDevice, - // linux_raw_sys::general::DT_UNKNOWN | - _ => Self::Unknown, - } - } -} - -/// `POSIX_FADV_*` constants for use with [`fadvise`]. -/// -/// [`fadvise`]: crate::fs::fadvise -#[derive(Debug, Copy, Clone, Eq, PartialEq)] -#[repr(u32)] -pub enum Advice { - /// `POSIX_FADV_NORMAL` - Normal = linux_raw_sys::general::POSIX_FADV_NORMAL, - - /// `POSIX_FADV_SEQUENTIAL` - Sequential = linux_raw_sys::general::POSIX_FADV_SEQUENTIAL, - - /// `POSIX_FADV_RANDOM` - Random = linux_raw_sys::general::POSIX_FADV_RANDOM, - - /// `POSIX_FADV_NOREUSE` - NoReuse = linux_raw_sys::general::POSIX_FADV_NOREUSE, - - /// `POSIX_FADV_WILLNEED` - WillNeed = linux_raw_sys::general::POSIX_FADV_WILLNEED, - - /// `POSIX_FADV_DONTNEED` - DontNeed = linux_raw_sys::general::POSIX_FADV_DONTNEED, -} - -bitflags! { - /// `MFD_*` constants for use with [`memfd_create`]. - /// - /// [`memfd_create`]: crate::fs::memfd_create - #[repr(transparent)] - #[derive(Copy, Clone, Eq, PartialEq, Hash, Debug)] - pub struct MemfdFlags: c::c_uint { - /// `MFD_CLOEXEC` - const CLOEXEC = linux_raw_sys::general::MFD_CLOEXEC; - - /// `MFD_ALLOW_SEALING` - const ALLOW_SEALING = linux_raw_sys::general::MFD_ALLOW_SEALING; - - /// `MFD_HUGETLB` (since Linux 4.14) - const HUGETLB = linux_raw_sys::general::MFD_HUGETLB; - - /// `MFD_HUGE_64KB` - const HUGE_64KB = linux_raw_sys::general::MFD_HUGE_64KB; - /// `MFD_HUGE_512JB` - const HUGE_512KB = linux_raw_sys::general::MFD_HUGE_512KB; - /// `MFD_HUGE_1MB` - const HUGE_1MB = linux_raw_sys::general::MFD_HUGE_1MB; - /// `MFD_HUGE_2MB` - const HUGE_2MB = linux_raw_sys::general::MFD_HUGE_2MB; - /// `MFD_HUGE_8MB` - const HUGE_8MB = linux_raw_sys::general::MFD_HUGE_8MB; - /// `MFD_HUGE_16MB` - const HUGE_16MB = linux_raw_sys::general::MFD_HUGE_16MB; - /// `MFD_HUGE_32MB` - const HUGE_32MB = linux_raw_sys::general::MFD_HUGE_32MB; - /// `MFD_HUGE_256MB` - const HUGE_256MB = linux_raw_sys::general::MFD_HUGE_256MB; - /// `MFD_HUGE_512MB` - const HUGE_512MB = linux_raw_sys::general::MFD_HUGE_512MB; - /// `MFD_HUGE_1GB` - const HUGE_1GB = linux_raw_sys::general::MFD_HUGE_1GB; - /// `MFD_HUGE_2GB` - const HUGE_2GB = linux_raw_sys::general::MFD_HUGE_2GB; - /// `MFD_HUGE_16GB` - const HUGE_16GB = linux_raw_sys::general::MFD_HUGE_16GB; - - /// <https://docs.rs/bitflags/*/bitflags/#externally-defined-flags> - const _ = !0; - } -} - -bitflags! { - /// `F_SEAL_*` constants for use with [`fcntl_add_seals`] and - /// [`fcntl_get_seals`]. - /// - /// [`fcntl_add_seals`]: crate::fs::fcntl_add_seals - /// [`fcntl_get_seals`]: crate::fs::fcntl_get_seals - #[repr(transparent)] - #[derive(Copy, Clone, Eq, PartialEq, Hash, Debug)] - pub struct SealFlags: u32 { - /// `F_SEAL_SEAL`. - const SEAL = linux_raw_sys::general::F_SEAL_SEAL; - /// `F_SEAL_SHRINK`. - const SHRINK = linux_raw_sys::general::F_SEAL_SHRINK; - /// `F_SEAL_GROW`. - const GROW = linux_raw_sys::general::F_SEAL_GROW; - /// `F_SEAL_WRITE`. - const WRITE = linux_raw_sys::general::F_SEAL_WRITE; - /// `F_SEAL_FUTURE_WRITE` (since Linux 5.1) - const FUTURE_WRITE = linux_raw_sys::general::F_SEAL_FUTURE_WRITE; - - /// <https://docs.rs/bitflags/*/bitflags/#externally-defined-flags> - const _ = !0; - } -} - -bitflags! { - /// `STATX_*` constants for use with [`statx`]. - /// - /// [`statx`]: crate::fs::statx - #[repr(transparent)] - #[derive(Copy, Clone, Eq, PartialEq, Hash, Debug)] - pub struct StatxFlags: u32 { - /// `STATX_TYPE` - const TYPE = linux_raw_sys::general::STATX_TYPE; - - /// `STATX_MODE` - const MODE = linux_raw_sys::general::STATX_MODE; - - /// `STATX_NLINK` - const NLINK = linux_raw_sys::general::STATX_NLINK; - - /// `STATX_UID` - const UID = linux_raw_sys::general::STATX_UID; - - /// `STATX_GID` - const GID = linux_raw_sys::general::STATX_GID; - - /// `STATX_ATIME` - const ATIME = linux_raw_sys::general::STATX_ATIME; - - /// `STATX_MTIME` - const MTIME = linux_raw_sys::general::STATX_MTIME; - - /// `STATX_CTIME` - const CTIME = linux_raw_sys::general::STATX_CTIME; - - /// `STATX_INO` - const INO = linux_raw_sys::general::STATX_INO; - - /// `STATX_SIZE` - const SIZE = linux_raw_sys::general::STATX_SIZE; - - /// `STATX_BLOCKS` - const BLOCKS = linux_raw_sys::general::STATX_BLOCKS; - - /// `STATX_BASIC_STATS` - const BASIC_STATS = linux_raw_sys::general::STATX_BASIC_STATS; - - /// `STATX_BTIME` - const BTIME = linux_raw_sys::general::STATX_BTIME; - - /// `STATX_MNT_ID` (since Linux 5.8) - const MNT_ID = linux_raw_sys::general::STATX_MNT_ID; - - /// `STATX_DIOALIGN` (since Linux 6.1) - const DIOALIGN = linux_raw_sys::general::STATX_DIOALIGN; - - /// `STATX_ALL` - const ALL = linux_raw_sys::general::STATX_ALL; - - /// <https://docs.rs/bitflags/*/bitflags/#externally-defined-flags> - const _ = !0; - } -} - -bitflags! { - /// `FALLOC_FL_*` constants for use with [`fallocate`]. - /// - /// [`fallocate`]: crate::fs::fallocate - #[repr(transparent)] - #[derive(Copy, Clone, Eq, PartialEq, Hash, Debug)] - pub struct FallocateFlags: u32 { - /// `FALLOC_FL_KEEP_SIZE` - const KEEP_SIZE = linux_raw_sys::general::FALLOC_FL_KEEP_SIZE; - /// `FALLOC_FL_PUNCH_HOLE` - const PUNCH_HOLE = linux_raw_sys::general::FALLOC_FL_PUNCH_HOLE; - /// `FALLOC_FL_NO_HIDE_STALE` - const NO_HIDE_STALE = linux_raw_sys::general::FALLOC_FL_NO_HIDE_STALE; - /// `FALLOC_FL_COLLAPSE_RANGE` - const COLLAPSE_RANGE = linux_raw_sys::general::FALLOC_FL_COLLAPSE_RANGE; - /// `FALLOC_FL_ZERO_RANGE` - const ZERO_RANGE = linux_raw_sys::general::FALLOC_FL_ZERO_RANGE; - /// `FALLOC_FL_INSERT_RANGE` - const INSERT_RANGE = linux_raw_sys::general::FALLOC_FL_INSERT_RANGE; - /// `FALLOC_FL_UNSHARE_RANGE` - const UNSHARE_RANGE = linux_raw_sys::general::FALLOC_FL_UNSHARE_RANGE; - - /// <https://docs.rs/bitflags/*/bitflags/#externally-defined-flags> - const _ = !0; - } -} - -bitflags! { - /// `ST_*` constants for use with [`StatVfs`]. - #[repr(transparent)] - #[derive(Copy, Clone, Eq, PartialEq, Hash, Debug)] - pub struct StatVfsMountFlags: u64 { - /// `ST_MANDLOCK` - const MANDLOCK = linux_raw_sys::general::MS_MANDLOCK as u64; - - /// `ST_NOATIME` - const NOATIME = linux_raw_sys::general::MS_NOATIME as u64; - - /// `ST_NODEV` - const NODEV = linux_raw_sys::general::MS_NODEV as u64; - - /// `ST_NODIRATIME` - const NODIRATIME = linux_raw_sys::general::MS_NODIRATIME as u64; - - /// `ST_NOEXEC` - const NOEXEC = linux_raw_sys::general::MS_NOEXEC as u64; - - /// `ST_NOSUID` - const NOSUID = linux_raw_sys::general::MS_NOSUID as u64; - - /// `ST_RDONLY` - const RDONLY = linux_raw_sys::general::MS_RDONLY as u64; - - /// `ST_RELATIME` - const RELATIME = linux_raw_sys::general::MS_RELATIME as u64; - - /// `ST_SYNCHRONOUS` - const SYNCHRONOUS = linux_raw_sys::general::MS_SYNCHRONOUS as u64; - - /// <https://docs.rs/bitflags/*/bitflags/#externally-defined-flags> - const _ = !0; - } -} - -/// `LOCK_*` constants for use with [`flock`] and [`fcntl_lock`]. -/// -/// [`flock`]: crate::fs::flock -/// [`fcntl_lock`]: crate::fs::fcntl_lock -#[derive(Clone, Copy, Debug, PartialEq, Eq)] -#[repr(u32)] -pub enum FlockOperation { - /// `LOCK_SH` - LockShared = linux_raw_sys::general::LOCK_SH, - /// `LOCK_EX` - LockExclusive = linux_raw_sys::general::LOCK_EX, - /// `LOCK_UN` - Unlock = linux_raw_sys::general::LOCK_UN, - /// `LOCK_SH | LOCK_NB` - NonBlockingLockShared = linux_raw_sys::general::LOCK_SH | linux_raw_sys::general::LOCK_NB, - /// `LOCK_EX | LOCK_NB` - NonBlockingLockExclusive = linux_raw_sys::general::LOCK_EX | linux_raw_sys::general::LOCK_NB, - /// `LOCK_UN | LOCK_NB` - NonBlockingUnlock = linux_raw_sys::general::LOCK_UN | linux_raw_sys::general::LOCK_NB, -} - -/// `struct stat` for use with [`statat`] and [`fstat`]. -/// -/// [`statat`]: crate::fs::statat -/// [`fstat`]: crate::fs::fstat -// On 32-bit, and mips64, Linux's `struct stat64` has a 32-bit `st_mtime` and -// friends, so we use our own struct, populated from `statx` where possible, to -// avoid the y2038 bug. -#[cfg(any( - target_pointer_width = "32", - target_arch = "mips64", - target_arch = "mips64r6" -))] -#[repr(C)] -#[derive(Debug, Copy, Clone)] -#[allow(missing_docs)] -pub struct Stat { - pub st_dev: u64, - pub st_mode: u32, - pub st_nlink: u32, - pub st_uid: u32, - pub st_gid: u32, - pub st_rdev: u64, - pub st_size: i64, - pub st_blksize: u32, - pub st_blocks: u64, - pub st_atime: u64, - pub st_atime_nsec: u32, - pub st_mtime: u64, - pub st_mtime_nsec: u32, - pub st_ctime: u64, - pub st_ctime_nsec: u32, - pub st_ino: u64, -} - -/// `struct stat` for use with [`statat`] and [`fstat`]. -/// -/// [`statat`]: crate::fs::statat -/// [`fstat`]: crate::fs::fstat -#[cfg(all( - target_pointer_width = "64", - not(target_arch = "mips64"), - not(target_arch = "mips64r6") -))] -pub type Stat = linux_raw_sys::general::stat; - -/// `struct statfs` for use with [`statfs`] and [`fstatfs`]. -/// -/// [`statfs`]: crate::fs::statfs -/// [`fstatfs`]: crate::fs::fstatfs -#[allow(clippy::module_name_repetitions)] -pub type StatFs = linux_raw_sys::general::statfs64; - -/// `struct statvfs` for use with [`statvfs`] and [`fstatvfs`]. -/// -/// [`statvfs`]: crate::fs::statvfs -/// [`fstatvfs`]: crate::fs::fstatvfs -#[allow(missing_docs)] -pub struct StatVfs { - pub f_bsize: u64, - pub f_frsize: u64, - pub f_blocks: u64, - pub f_bfree: u64, - pub f_bavail: u64, - pub f_files: u64, - pub f_ffree: u64, - pub f_favail: u64, - pub f_fsid: u64, - pub f_flag: StatVfsMountFlags, - pub f_namemax: u64, -} - -/// `struct statx` for use with [`statx`]. -/// -/// [`statx`]: crate::fs::statx -pub type Statx = linux_raw_sys::general::statx; - -/// `struct statx_timestamp` for use with [`Statx`]. -pub type StatxTimestamp = linux_raw_sys::general::statx_timestamp; - -/// `mode_t` -#[cfg(not(any( - target_arch = "x86", - target_arch = "sparc", - target_arch = "avr", - target_arch = "arm", -)))] -pub type RawMode = linux_raw_sys::general::__kernel_mode_t; - -/// `mode_t` -#[cfg(any( - target_arch = "x86", - target_arch = "sparc", - target_arch = "avr", - target_arch = "arm", -))] -// Don't use `__kernel_mode_t` since it's `u16` which differs from `st_size`. -pub type RawMode = c::c_uint; - -/// `dev_t` -// Within the kernel the dev_t is 32-bit, but userspace uses a 64-bit field. -pub type Dev = u64; - -/// `__fsword_t` -#[cfg(not(any(target_arch = "mips64", target_arch = "mips64r6")))] -pub type FsWord = linux_raw_sys::general::__fsword_t; - -/// `__fsword_t` -#[cfg(any(target_arch = "mips64", target_arch = "mips64r6"))] -pub type FsWord = i64; diff --git a/vendor/rustix/src/backend/linux_raw/io/errno.rs b/vendor/rustix/src/backend/linux_raw/io/errno.rs deleted file mode 100644 index bc40e9a..0000000 --- a/vendor/rustix/src/backend/linux_raw/io/errno.rs +++ /dev/null @@ -1,553 +0,0 @@ -//! The `rustix` `Errno` type. -//! -//! This type holds an OS error code, which conceptually corresponds to an -//! `errno` value. -//! -//! # Safety -//! -//! Linux uses error codes in `-4095..0`; we use rustc attributes to describe -//! this restricted range of values. -#![allow(unsafe_code)] -#![cfg_attr(not(rustc_attrs), allow(unused_unsafe))] - -use crate::backend::c; -use crate::backend::fd::RawFd; -use crate::backend::reg::{RetNumber, RetReg}; -use crate::io; -use linux_raw_sys::errno; - -/// `errno`—An error code. -/// -/// The error type for `rustix` APIs. This is similar to [`std::io::Error`], -/// but only holds an OS error code, and no extra error value. -/// -/// # References -/// - [POSIX] -/// - [Linux] -/// - [Winsock] -/// - [FreeBSD] -/// - [NetBSD] -/// - [OpenBSD] -/// - [DragonFly BSD] -/// - [illumos] -/// - [glibc] -/// -/// [POSIX]: https://pubs.opengroup.org/onlinepubs/9699919799/functions/errno.html -/// [Linux]: https://man7.org/linux/man-pages/man3/errno.3.html -/// [Winsock]: https://learn.microsoft.com/en-us/windows/win32/winsock/windows-sockets-error-codes-2 -/// [FreeBSD]: https://man.freebsd.org/cgi/man.cgi?errno -/// [NetBSD]: https://man.netbsd.org/errno.2 -/// [OpenBSD]: https://man.openbsd.org/errno.2 -/// [DragonFly BSD]: https://man.dragonflybsd.org/?command=errno§ion=2 -/// [illumos]: https://illumos.org/man/3C/errno -/// [glibc]: https://www.gnu.org/software/libc/manual/html_node/Error-Codes.html -/// [`std::io::Error`]: Result -#[repr(transparent)] -#[doc(alias = "errno")] -#[derive(Eq, PartialEq, Hash, Copy, Clone)] -// Linux returns negated error codes, and we leave them in negated form, so -// error codes are in `-4095..0`. -#[cfg_attr(rustc_attrs, rustc_layout_scalar_valid_range_start(0xf001))] -#[cfg_attr(rustc_attrs, rustc_layout_scalar_valid_range_end(0xffff))] -pub struct Errno(u16); - -impl Errno { - /// Extract an `Errno` value from a `std::io::Error`. - /// - /// This isn't a `From` conversion because it's expected to be relatively - /// uncommon. - #[cfg(feature = "std")] - #[inline] - pub fn from_io_error(io_err: &std::io::Error) -> Option<Self> { - io_err.raw_os_error().and_then(|raw| { - // `std::io::Error` could theoretically have arbitrary OS error - // values, so check that they're in Linux's range. - if (1..4096).contains(&raw) { - Some(Self::from_errno(raw as u32)) - } else { - None - } - }) - } - - /// Extract the raw OS error number from this error. - #[inline] - pub const fn raw_os_error(self) -> i32 { - (self.0 as i16 as i32).wrapping_neg() - } - - /// Construct an `Errno` from a raw OS error number. - #[inline] - pub const fn from_raw_os_error(raw: i32) -> Self { - Self::from_errno(raw as u32) - } - - /// Convert from a C `errno` value (which is positive) to an `Errno`. - const fn from_errno(raw: u32) -> Self { - // We store error values in negated form, so that we don't have to - // negate them after every syscall. - let encoded = raw.wrapping_neg() as u16; - - // TODO: Use Range::contains, once that's `const`. - assert!(encoded >= 0xf001); - - // SAFETY: Linux syscalls return negated error values in the range - // `-4095..0`, which we just asserted. - unsafe { Self(encoded) } - } -} - -/// Check for an error from the result of a syscall which encodes a -/// `c::c_int` on success. -#[inline] -pub(in crate::backend) fn try_decode_c_int<Num: RetNumber>( - raw: RetReg<Num>, -) -> io::Result<c::c_int> { - if raw.is_in_range(-4095..0) { - // SAFETY: `raw` must be in `-4095..0`, and we just checked that raw is - // in that range. - return Err(unsafe { Errno(raw.decode_error_code()) }); - } - - Ok(raw.decode_c_int()) -} - -/// Check for an error from the result of a syscall which encodes a -/// `c::c_uint` on success. -#[inline] -pub(in crate::backend) fn try_decode_c_uint<Num: RetNumber>( - raw: RetReg<Num>, -) -> io::Result<c::c_uint> { - if raw.is_in_range(-4095..0) { - // SAFETY: `raw` must be in `-4095..0`, and we just checked that raw is - // in that range. - return Err(unsafe { Errno(raw.decode_error_code()) }); - } - - Ok(raw.decode_c_uint()) -} - -/// Check for an error from the result of a syscall which encodes a `usize` on -/// success. -#[inline] -pub(in crate::backend) fn try_decode_usize<Num: RetNumber>(raw: RetReg<Num>) -> io::Result<usize> { - if raw.is_in_range(-4095..0) { - // SAFETY: `raw` must be in `-4095..0`, and we just checked that raw is - // in that range. - return Err(unsafe { Errno(raw.decode_error_code()) }); - } - - Ok(raw.decode_usize()) -} - -/// Check for an error from the result of a syscall which encodes a -/// `*mut c_void` on success. -#[inline] -pub(in crate::backend) fn try_decode_void_star<Num: RetNumber>( - raw: RetReg<Num>, -) -> io::Result<*mut c::c_void> { - if raw.is_in_range(-4095..0) { - // SAFETY: `raw` must be in `-4095..0`, and we just checked that raw is - // in that range. - return Err(unsafe { Errno(raw.decode_error_code()) }); - } - - Ok(raw.decode_void_star()) -} - -/// Check for an error from the result of a syscall which encodes a -/// `u64` on success. -#[cfg(target_pointer_width = "64")] -#[inline] -pub(in crate::backend) fn try_decode_u64<Num: RetNumber>(raw: RetReg<Num>) -> io::Result<u64> { - if raw.is_in_range(-4095..0) { - // SAFETY: `raw` must be in `-4095..0`, and we just checked that raw is - // in that range. - return Err(unsafe { Errno(raw.decode_error_code()) }); - } - - Ok(raw.decode_u64()) -} - -/// Check for an error from the result of a syscall which encodes a file -/// descriptor on success. -/// -/// # Safety -/// -/// This must only be used with syscalls which return file descriptors on -/// success. -#[inline] -pub(in crate::backend) unsafe fn try_decode_raw_fd<Num: RetNumber>( - raw: RetReg<Num>, -) -> io::Result<RawFd> { - // Instead of using `check_result` here, we just check for negative, since - // this function is only used for system calls which return file - // descriptors, and this produces smaller code. - if raw.is_negative() { - debug_assert!(raw.is_in_range(-4095..0)); - - // Tell the optimizer that we know the value is in the error range. - // This helps it avoid unnecessary integer conversions. - #[cfg(core_intrinsics)] - { - core::intrinsics::assume(raw.is_in_range(-4095..0)); - } - - return Err(Errno(raw.decode_error_code())); - } - - Ok(raw.decode_raw_fd()) -} - -/// Check for an error from the result of a syscall which encodes no value on -/// success. On success, return the unconsumed `raw` value. -/// -/// # Safety -/// -/// This must only be used with syscalls which return no value on success. -#[inline] -pub(in crate::backend) unsafe fn try_decode_void<Num: RetNumber>( - raw: RetReg<Num>, -) -> io::Result<()> { - // Instead of using `check_result` here, we just check for zero, since this - // function is only used for system calls which have no other return value, - // and this produces smaller code. - if raw.is_nonzero() { - debug_assert!(raw.is_in_range(-4095..0)); - - // Tell the optimizer that we know the value is in the error range. - // This helps it avoid unnecessary integer conversions. - #[cfg(core_intrinsics)] - { - core::intrinsics::assume(raw.is_in_range(-4095..0)); - } - - return Err(Errno(raw.decode_error_code())); - } - - raw.decode_void(); - - Ok(()) -} - -/// Check for an error from the result of a syscall which does not return on -/// success. On success, return the unconsumed `raw` value. -/// -/// # Safety -/// -/// This must only be used with syscalls which do not return on success. -#[cfg(any(feature = "event", feature = "runtime"))] -#[inline] -pub(in crate::backend) unsafe fn try_decode_error<Num: RetNumber>(raw: RetReg<Num>) -> io::Errno { - debug_assert!(raw.is_in_range(-4095..0)); - - // Tell the optimizer that we know the value is in the error range. - // This helps it avoid unnecessary integer conversions. - #[cfg(core_intrinsics)] - { - core::intrinsics::assume(raw.is_in_range(-4095..0)); - } - - Errno(raw.decode_error_code()) -} - -/// Return the contained `usize` value. -#[cfg(not(debug_assertions))] -#[inline] -pub(in crate::backend) fn decode_usize_infallible<Num: RetNumber>(raw: RetReg<Num>) -> usize { - raw.decode_usize() -} - -/// Return the contained `c_int` value. -#[cfg(not(debug_assertions))] -#[inline] -pub(in crate::backend) fn decode_c_int_infallible<Num: RetNumber>(raw: RetReg<Num>) -> c::c_int { - raw.decode_c_int() -} - -/// Return the contained `c_uint` value. -#[cfg(not(debug_assertions))] -#[inline] -pub(in crate::backend) fn decode_c_uint_infallible<Num: RetNumber>(raw: RetReg<Num>) -> c::c_uint { - raw.decode_c_uint() -} - -impl Errno { - /// `EACCES` - #[doc(alias = "ACCES")] - pub const ACCESS: Self = Self::from_errno(errno::EACCES); - /// `EADDRINUSE` - pub const ADDRINUSE: Self = Self::from_errno(errno::EADDRINUSE); - /// `EADDRNOTAVAIL` - pub const ADDRNOTAVAIL: Self = Self::from_errno(errno::EADDRNOTAVAIL); - /// `EADV` - pub const ADV: Self = Self::from_errno(errno::EADV); - /// `EAFNOSUPPORT` - pub const AFNOSUPPORT: Self = Self::from_errno(errno::EAFNOSUPPORT); - /// `EAGAIN` - pub const AGAIN: Self = Self::from_errno(errno::EAGAIN); - /// `EALREADY` - pub const ALREADY: Self = Self::from_errno(errno::EALREADY); - /// `EBADE` - pub const BADE: Self = Self::from_errno(errno::EBADE); - /// `EBADF` - pub const BADF: Self = Self::from_errno(errno::EBADF); - /// `EBADFD` - pub const BADFD: Self = Self::from_errno(errno::EBADFD); - /// `EBADMSG` - pub const BADMSG: Self = Self::from_errno(errno::EBADMSG); - /// `EBADR` - pub const BADR: Self = Self::from_errno(errno::EBADR); - /// `EBADRQC` - pub const BADRQC: Self = Self::from_errno(errno::EBADRQC); - /// `EBADSLT` - pub const BADSLT: Self = Self::from_errno(errno::EBADSLT); - /// `EBFONT` - pub const BFONT: Self = Self::from_errno(errno::EBFONT); - /// `EBUSY` - pub const BUSY: Self = Self::from_errno(errno::EBUSY); - /// `ECANCELED` - pub const CANCELED: Self = Self::from_errno(errno::ECANCELED); - /// `ECHILD` - pub const CHILD: Self = Self::from_errno(errno::ECHILD); - /// `ECHRNG` - pub const CHRNG: Self = Self::from_errno(errno::ECHRNG); - /// `ECOMM` - pub const COMM: Self = Self::from_errno(errno::ECOMM); - /// `ECONNABORTED` - pub const CONNABORTED: Self = Self::from_errno(errno::ECONNABORTED); - /// `ECONNREFUSED` - pub const CONNREFUSED: Self = Self::from_errno(errno::ECONNREFUSED); - /// `ECONNRESET` - pub const CONNRESET: Self = Self::from_errno(errno::ECONNRESET); - /// `EDEADLK` - pub const DEADLK: Self = Self::from_errno(errno::EDEADLK); - /// `EDEADLOCK` - pub const DEADLOCK: Self = Self::from_errno(errno::EDEADLOCK); - /// `EDESTADDRREQ` - pub const DESTADDRREQ: Self = Self::from_errno(errno::EDESTADDRREQ); - /// `EDOM` - pub const DOM: Self = Self::from_errno(errno::EDOM); - /// `EDOTDOT` - pub const DOTDOT: Self = Self::from_errno(errno::EDOTDOT); - /// `EDQUOT` - pub const DQUOT: Self = Self::from_errno(errno::EDQUOT); - /// `EEXIST` - pub const EXIST: Self = Self::from_errno(errno::EEXIST); - /// `EFAULT` - pub const FAULT: Self = Self::from_errno(errno::EFAULT); - /// `EFBIG` - pub const FBIG: Self = Self::from_errno(errno::EFBIG); - /// `EHOSTDOWN` - pub const HOSTDOWN: Self = Self::from_errno(errno::EHOSTDOWN); - /// `EHOSTUNREACH` - pub const HOSTUNREACH: Self = Self::from_errno(errno::EHOSTUNREACH); - /// `EHWPOISON` - pub const HWPOISON: Self = Self::from_errno(errno::EHWPOISON); - /// `EIDRM` - pub const IDRM: Self = Self::from_errno(errno::EIDRM); - /// `EILSEQ` - pub const ILSEQ: Self = Self::from_errno(errno::EILSEQ); - /// `EINPROGRESS` - pub const INPROGRESS: Self = Self::from_errno(errno::EINPROGRESS); - /// `EINTR`. - /// - /// For a convenient way to retry system calls that exit with `INTR`, use - /// [`retry_on_intr`]. - /// - /// [`retry_on_intr`]: io::retry_on_intr - pub const INTR: Self = Self::from_errno(errno::EINTR); - /// `EINVAL` - pub const INVAL: Self = Self::from_errno(errno::EINVAL); - /// `EIO` - pub const IO: Self = Self::from_errno(errno::EIO); - /// `EISCONN` - pub const ISCONN: Self = Self::from_errno(errno::EISCONN); - /// `EISDIR` - pub const ISDIR: Self = Self::from_errno(errno::EISDIR); - /// `EISNAM` - pub const ISNAM: Self = Self::from_errno(errno::EISNAM); - /// `EKEYEXPIRED` - pub const KEYEXPIRED: Self = Self::from_errno(errno::EKEYEXPIRED); - /// `EKEYREJECTED` - pub const KEYREJECTED: Self = Self::from_errno(errno::EKEYREJECTED); - /// `EKEYREVOKED` - pub const KEYREVOKED: Self = Self::from_errno(errno::EKEYREVOKED); - /// `EL2HLT` - pub const L2HLT: Self = Self::from_errno(errno::EL2HLT); - /// `EL2NSYNC` - pub const L2NSYNC: Self = Self::from_errno(errno::EL2NSYNC); - /// `EL3HLT` - pub const L3HLT: Self = Self::from_errno(errno::EL3HLT); - /// `EL3RST` - pub const L3RST: Self = Self::from_errno(errno::EL3RST); - /// `ELIBACC` - pub const LIBACC: Self = Self::from_errno(errno::ELIBACC); - /// `ELIBBAD` - pub const LIBBAD: Self = Self::from_errno(errno::ELIBBAD); - /// `ELIBEXEC` - pub const LIBEXEC: Self = Self::from_errno(errno::ELIBEXEC); - /// `ELIBMAX` - pub const LIBMAX: Self = Self::from_errno(errno::ELIBMAX); - /// `ELIBSCN` - pub const LIBSCN: Self = Self::from_errno(errno::ELIBSCN); - /// `ELNRNG` - pub const LNRNG: Self = Self::from_errno(errno::ELNRNG); - /// `ELOOP` - pub const LOOP: Self = Self::from_errno(errno::ELOOP); - /// `EMEDIUMTYPE` - pub const MEDIUMTYPE: Self = Self::from_errno(errno::EMEDIUMTYPE); - /// `EMFILE` - pub const MFILE: Self = Self::from_errno(errno::EMFILE); - /// `EMLINK` - pub const MLINK: Self = Self::from_errno(errno::EMLINK); - /// `EMSGSIZE` - pub const MSGSIZE: Self = Self::from_errno(errno::EMSGSIZE); - /// `EMULTIHOP` - pub const MULTIHOP: Self = Self::from_errno(errno::EMULTIHOP); - /// `ENAMETOOLONG` - pub const NAMETOOLONG: Self = Self::from_errno(errno::ENAMETOOLONG); - /// `ENAVAIL` - pub const NAVAIL: Self = Self::from_errno(errno::ENAVAIL); - /// `ENETDOWN` - pub const NETDOWN: Self = Self::from_errno(errno::ENETDOWN); - /// `ENETRESET` - pub const NETRESET: Self = Self::from_errno(errno::ENETRESET); - /// `ENETUNREACH` - pub const NETUNREACH: Self = Self::from_errno(errno::ENETUNREACH); - /// `ENFILE` - pub const NFILE: Self = Self::from_errno(errno::ENFILE); - /// `ENOANO` - pub const NOANO: Self = Self::from_errno(errno::ENOANO); - /// `ENOBUFS` - pub const NOBUFS: Self = Self::from_errno(errno::ENOBUFS); - /// `ENOCSI` - pub const NOCSI: Self = Self::from_errno(errno::ENOCSI); - /// `ENODATA` - #[doc(alias = "NOATTR")] - pub const NODATA: Self = Self::from_errno(errno::ENODATA); - /// `ENODEV` - pub const NODEV: Self = Self::from_errno(errno::ENODEV); - /// `ENOENT` - pub const NOENT: Self = Self::from_errno(errno::ENOENT); - /// `ENOEXEC` - pub const NOEXEC: Self = Self::from_errno(errno::ENOEXEC); - /// `ENOKEY` - pub const NOKEY: Self = Self::from_errno(errno::ENOKEY); - /// `ENOLCK` - pub const NOLCK: Self = Self::from_errno(errno::ENOLCK); - /// `ENOLINK` - pub const NOLINK: Self = Self::from_errno(errno::ENOLINK); - /// `ENOMEDIUM` - pub const NOMEDIUM: Self = Self::from_errno(errno::ENOMEDIUM); - /// `ENOMEM` - pub const NOMEM: Self = Self::from_errno(errno::ENOMEM); - /// `ENOMSG` - pub const NOMSG: Self = Self::from_errno(errno::ENOMSG); - /// `ENONET` - pub const NONET: Self = Self::from_errno(errno::ENONET); - /// `ENOPKG` - pub const NOPKG: Self = Self::from_errno(errno::ENOPKG); - /// `ENOPROTOOPT` - pub const NOPROTOOPT: Self = Self::from_errno(errno::ENOPROTOOPT); - /// `ENOSPC` - pub const NOSPC: Self = Self::from_errno(errno::ENOSPC); - /// `ENOSR` - pub const NOSR: Self = Self::from_errno(errno::ENOSR); - /// `ENOSTR` - pub const NOSTR: Self = Self::from_errno(errno::ENOSTR); - /// `ENOSYS` - pub const NOSYS: Self = Self::from_errno(errno::ENOSYS); - /// `ENOTBLK` - pub const NOTBLK: Self = Self::from_errno(errno::ENOTBLK); - /// `ENOTCONN` - pub const NOTCONN: Self = Self::from_errno(errno::ENOTCONN); - /// `ENOTDIR` - pub const NOTDIR: Self = Self::from_errno(errno::ENOTDIR); - /// `ENOTEMPTY` - pub const NOTEMPTY: Self = Self::from_errno(errno::ENOTEMPTY); - /// `ENOTNAM` - pub const NOTNAM: Self = Self::from_errno(errno::ENOTNAM); - /// `ENOTRECOVERABLE` - pub const NOTRECOVERABLE: Self = Self::from_errno(errno::ENOTRECOVERABLE); - /// `ENOTSOCK` - pub const NOTSOCK: Self = Self::from_errno(errno::ENOTSOCK); - /// `ENOTSUP` - // On Linux, `ENOTSUP` has the same value as `EOPNOTSUPP`. - pub const NOTSUP: Self = Self::from_errno(errno::EOPNOTSUPP); - /// `ENOTTY` - pub const NOTTY: Self = Self::from_errno(errno::ENOTTY); - /// `ENOTUNIQ` - pub const NOTUNIQ: Self = Self::from_errno(errno::ENOTUNIQ); - /// `ENXIO` - pub const NXIO: Self = Self::from_errno(errno::ENXIO); - /// `EOPNOTSUPP` - pub const OPNOTSUPP: Self = Self::from_errno(errno::EOPNOTSUPP); - /// `EOVERFLOW` - pub const OVERFLOW: Self = Self::from_errno(errno::EOVERFLOW); - /// `EOWNERDEAD` - pub const OWNERDEAD: Self = Self::from_errno(errno::EOWNERDEAD); - /// `EPERM` - pub const PERM: Self = Self::from_errno(errno::EPERM); - /// `EPFNOSUPPORT` - pub const PFNOSUPPORT: Self = Self::from_errno(errno::EPFNOSUPPORT); - /// `EPIPE` - pub const PIPE: Self = Self::from_errno(errno::EPIPE); - /// `EPROTO` - pub const PROTO: Self = Self::from_errno(errno::EPROTO); - /// `EPROTONOSUPPORT` - pub const PROTONOSUPPORT: Self = Self::from_errno(errno::EPROTONOSUPPORT); - /// `EPROTOTYPE` - pub const PROTOTYPE: Self = Self::from_errno(errno::EPROTOTYPE); - /// `ERANGE` - pub const RANGE: Self = Self::from_errno(errno::ERANGE); - /// `EREMCHG` - pub const REMCHG: Self = Self::from_errno(errno::EREMCHG); - /// `EREMOTE` - pub const REMOTE: Self = Self::from_errno(errno::EREMOTE); - /// `EREMOTEIO` - pub const REMOTEIO: Self = Self::from_errno(errno::EREMOTEIO); - /// `ERESTART` - pub const RESTART: Self = Self::from_errno(errno::ERESTART); - /// `ERFKILL` - pub const RFKILL: Self = Self::from_errno(errno::ERFKILL); - /// `EROFS` - pub const ROFS: Self = Self::from_errno(errno::EROFS); - /// `ESHUTDOWN` - pub const SHUTDOWN: Self = Self::from_errno(errno::ESHUTDOWN); - /// `ESOCKTNOSUPPORT` - pub const SOCKTNOSUPPORT: Self = Self::from_errno(errno::ESOCKTNOSUPPORT); - /// `ESPIPE` - pub const SPIPE: Self = Self::from_errno(errno::ESPIPE); - /// `ESRCH` - pub const SRCH: Self = Self::from_errno(errno::ESRCH); - /// `ESRMNT` - pub const SRMNT: Self = Self::from_errno(errno::ESRMNT); - /// `ESTALE` - pub const STALE: Self = Self::from_errno(errno::ESTALE); - /// `ESTRPIPE` - pub const STRPIPE: Self = Self::from_errno(errno::ESTRPIPE); - /// `ETIME` - pub const TIME: Self = Self::from_errno(errno::ETIME); - /// `ETIMEDOUT` - pub const TIMEDOUT: Self = Self::from_errno(errno::ETIMEDOUT); - /// `E2BIG` - #[doc(alias = "2BIG")] - pub const TOOBIG: Self = Self::from_errno(errno::E2BIG); - /// `ETOOMANYREFS` - pub const TOOMANYREFS: Self = Self::from_errno(errno::ETOOMANYREFS); - /// `ETXTBSY` - pub const TXTBSY: Self = Self::from_errno(errno::ETXTBSY); - /// `EUCLEAN` - pub const UCLEAN: Self = Self::from_errno(errno::EUCLEAN); - /// `EUNATCH` - pub const UNATCH: Self = Self::from_errno(errno::EUNATCH); - /// `EUSERS` - pub const USERS: Self = Self::from_errno(errno::EUSERS); - /// `EWOULDBLOCK` - pub const WOULDBLOCK: Self = Self::from_errno(errno::EWOULDBLOCK); - /// `EXDEV` - pub const XDEV: Self = Self::from_errno(errno::EXDEV); - /// `EXFULL` - pub const XFULL: Self = Self::from_errno(errno::EXFULL); -} diff --git a/vendor/rustix/src/backend/linux_raw/io/mod.rs b/vendor/rustix/src/backend/linux_raw/io/mod.rs deleted file mode 100644 index 9477b9b..0000000 --- a/vendor/rustix/src/backend/linux_raw/io/mod.rs +++ /dev/null @@ -1,3 +0,0 @@ -pub(crate) mod errno; -pub(crate) mod syscalls; -pub(crate) mod types; diff --git a/vendor/rustix/src/backend/linux_raw/io/syscalls.rs b/vendor/rustix/src/backend/linux_raw/io/syscalls.rs deleted file mode 100644 index c38f28f..0000000 --- a/vendor/rustix/src/backend/linux_raw/io/syscalls.rs +++ /dev/null @@ -1,379 +0,0 @@ -//! linux_raw syscalls supporting `rustix::io`. -//! -//! # Safety -//! -//! See the `rustix::backend` module documentation for details. -#![allow(unsafe_code)] -#![allow(clippy::undocumented_unsafe_blocks)] - -#[cfg(target_pointer_width = "64")] -use crate::backend::conv::loff_t_from_u64; -#[cfg(all( - target_pointer_width = "32", - any(target_arch = "arm", target_arch = "mips", target_arch = "mips32r6"), -))] -use crate::backend::conv::zero; -use crate::backend::conv::{ - c_uint, pass_usize, raw_fd, ret, ret_c_int, ret_c_uint, ret_discarded_fd, ret_owned_fd, - ret_usize, slice, -}; -#[cfg(target_pointer_width = "32")] -use crate::backend::conv::{hi, lo}; -use crate::backend::{c, MAX_IOV}; -use crate::fd::{AsFd, BorrowedFd, OwnedFd, RawFd}; -use crate::io::{self, DupFlags, FdFlags, IoSlice, IoSliceMut, ReadWriteFlags}; -use crate::ioctl::{IoctlOutput, RawOpcode}; -#[cfg(all(feature = "fs", feature = "net"))] -use crate::net::{RecvFlags, SendFlags}; -use core::cmp; -use linux_raw_sys::general::{F_DUPFD_CLOEXEC, F_GETFD, F_SETFD}; - -#[inline] -pub(crate) unsafe fn read(fd: BorrowedFd<'_>, buf: *mut u8, len: usize) -> io::Result<usize> { - ret_usize(syscall!(__NR_read, fd, buf, pass_usize(len))) -} - -#[inline] -pub(crate) unsafe fn pread( - fd: BorrowedFd<'_>, - buf: *mut u8, - len: usize, - pos: u64, -) -> io::Result<usize> { - // <https://github.com/torvalds/linux/blob/fcadab740480e0e0e9fa9bd272acd409884d431a/arch/arm64/kernel/sys32.c#L75> - #[cfg(all( - target_pointer_width = "32", - any(target_arch = "arm", target_arch = "mips", target_arch = "mips32r6"), - ))] - { - ret_usize(syscall!( - __NR_pread64, - fd, - buf, - pass_usize(len), - zero(), - hi(pos), - lo(pos) - )) - } - #[cfg(all( - target_pointer_width = "32", - not(any(target_arch = "arm", target_arch = "mips", target_arch = "mips32r6")), - ))] - { - ret_usize(syscall!( - __NR_pread64, - fd, - buf, - pass_usize(len), - hi(pos), - lo(pos) - )) - } - #[cfg(target_pointer_width = "64")] - ret_usize(syscall!( - __NR_pread64, - fd, - buf, - pass_usize(len), - loff_t_from_u64(pos) - )) -} - -#[inline] -pub(crate) fn readv(fd: BorrowedFd<'_>, bufs: &mut [IoSliceMut<'_>]) -> io::Result<usize> { - let (bufs_addr, bufs_len) = slice(&bufs[..cmp::min(bufs.len(), MAX_IOV)]); - - unsafe { ret_usize(syscall!(__NR_readv, fd, bufs_addr, bufs_len)) } -} - -#[inline] -pub(crate) fn preadv( - fd: BorrowedFd<'_>, - bufs: &mut [IoSliceMut<'_>], - pos: u64, -) -> io::Result<usize> { - let (bufs_addr, bufs_len) = slice(&bufs[..cmp::min(bufs.len(), MAX_IOV)]); - - // Unlike the plain "p" functions, the "pv" functions pass their offset in - // an endian-independent way, and always in two registers. - unsafe { - ret_usize(syscall!( - __NR_preadv, - fd, - bufs_addr, - bufs_len, - pass_usize(pos as usize), - pass_usize((pos >> 32) as usize) - )) - } -} - -#[inline] -pub(crate) fn preadv2( - fd: BorrowedFd<'_>, - bufs: &mut [IoSliceMut<'_>], - pos: u64, - flags: ReadWriteFlags, -) -> io::Result<usize> { - let (bufs_addr, bufs_len) = slice(&bufs[..cmp::min(bufs.len(), MAX_IOV)]); - - // Unlike the plain "p" functions, the "pv" functions pass their offset in - // an endian-independent way, and always in two registers. - unsafe { - ret_usize(syscall!( - __NR_preadv2, - fd, - bufs_addr, - bufs_len, - pass_usize(pos as usize), - pass_usize((pos >> 32) as usize), - flags - )) - } -} - -#[inline] -pub(crate) fn write(fd: BorrowedFd<'_>, buf: &[u8]) -> io::Result<usize> { - let (buf_addr, buf_len) = slice(buf); - - unsafe { ret_usize(syscall_readonly!(__NR_write, fd, buf_addr, buf_len)) } -} - -#[inline] -pub(crate) fn pwrite(fd: BorrowedFd<'_>, buf: &[u8], pos: u64) -> io::Result<usize> { - let (buf_addr, buf_len) = slice(buf); - - // <https://github.com/torvalds/linux/blob/fcadab740480e0e0e9fa9bd272acd409884d431a/arch/arm64/kernel/sys32.c#L81-L83> - #[cfg(all( - target_pointer_width = "32", - any(target_arch = "arm", target_arch = "mips", target_arch = "mips32r6"), - ))] - unsafe { - ret_usize(syscall_readonly!( - __NR_pwrite64, - fd, - buf_addr, - buf_len, - zero(), - hi(pos), - lo(pos) - )) - } - #[cfg(all( - target_pointer_width = "32", - not(any(target_arch = "arm", target_arch = "mips", target_arch = "mips32r6")), - ))] - unsafe { - ret_usize(syscall_readonly!( - __NR_pwrite64, - fd, - buf_addr, - buf_len, - hi(pos), - lo(pos) - )) - } - #[cfg(target_pointer_width = "64")] - unsafe { - ret_usize(syscall_readonly!( - __NR_pwrite64, - fd, - buf_addr, - buf_len, - loff_t_from_u64(pos) - )) - } -} - -#[inline] -pub(crate) fn writev(fd: BorrowedFd<'_>, bufs: &[IoSlice<'_>]) -> io::Result<usize> { - let (bufs_addr, bufs_len) = slice(&bufs[..cmp::min(bufs.len(), MAX_IOV)]); - - unsafe { ret_usize(syscall_readonly!(__NR_writev, fd, bufs_addr, bufs_len)) } -} - -#[inline] -pub(crate) fn pwritev(fd: BorrowedFd<'_>, bufs: &[IoSlice<'_>], pos: u64) -> io::Result<usize> { - let (bufs_addr, bufs_len) = slice(&bufs[..cmp::min(bufs.len(), MAX_IOV)]); - - // Unlike the plain "p" functions, the "pv" functions pass their offset in - // an endian-independent way, and always in two registers. - unsafe { - ret_usize(syscall_readonly!( - __NR_pwritev, - fd, - bufs_addr, - bufs_len, - pass_usize(pos as usize), - pass_usize((pos >> 32) as usize) - )) - } -} - -#[inline] -pub(crate) fn pwritev2( - fd: BorrowedFd<'_>, - bufs: &[IoSlice<'_>], - pos: u64, - flags: ReadWriteFlags, -) -> io::Result<usize> { - let (bufs_addr, bufs_len) = slice(&bufs[..cmp::min(bufs.len(), MAX_IOV)]); - - // Unlike the plain "p" functions, the "pv" functions pass their offset in - // an endian-independent way, and always in two registers. - unsafe { - ret_usize(syscall_readonly!( - __NR_pwritev2, - fd, - bufs_addr, - bufs_len, - pass_usize(pos as usize), - pass_usize((pos >> 32) as usize), - flags - )) - } -} - -#[inline] -pub(crate) unsafe fn close(fd: RawFd) { - // See the documentation for [`io::close`] for why errors are ignored. - syscall_readonly!(__NR_close, raw_fd(fd)).decode_void(); -} - -#[inline] -pub(crate) unsafe fn ioctl( - fd: BorrowedFd<'_>, - request: RawOpcode, - arg: *mut c::c_void, -) -> io::Result<IoctlOutput> { - ret_c_int(syscall!(__NR_ioctl, fd, c_uint(request), arg)) -} - -#[inline] -pub(crate) unsafe fn ioctl_readonly( - fd: BorrowedFd<'_>, - request: RawOpcode, - arg: *mut c::c_void, -) -> io::Result<IoctlOutput> { - ret_c_int(syscall_readonly!(__NR_ioctl, fd, c_uint(request), arg)) -} - -#[cfg(all(feature = "fs", feature = "net"))] -pub(crate) fn is_read_write(fd: BorrowedFd<'_>) -> io::Result<(bool, bool)> { - let (mut read, mut write) = crate::fs::fd::_is_file_read_write(fd)?; - let mut not_socket = false; - if read { - // Do a `recv` with `PEEK` and `DONTWAIT` for 1 byte. A 0 indicates - // the read side is shut down; an `EWOULDBLOCK` indicates the read - // side is still open. - let mut buf = [core::mem::MaybeUninit::<u8>::uninit()]; - match unsafe { - crate::backend::net::syscalls::recv( - fd, - buf.as_mut_ptr() as *mut u8, - 1, - RecvFlags::PEEK | RecvFlags::DONTWAIT, - ) - } { - Ok(0) => read = false, - Err(err) => { - #[allow(unreachable_patterns)] // `EAGAIN` may equal `EWOULDBLOCK` - match err { - io::Errno::AGAIN | io::Errno::WOULDBLOCK => (), - io::Errno::NOTSOCK => not_socket = true, - _ => return Err(err), - } - } - Ok(_) => (), - } - } - if write && !not_socket { - // Do a `send` with `DONTWAIT` for 0 bytes. An `EPIPE` indicates - // the write side is shut down. - #[allow(unreachable_patterns)] // `EAGAIN` equals `EWOULDBLOCK` - match crate::backend::net::syscalls::send(fd, &[], SendFlags::DONTWAIT) { - Err(io::Errno::AGAIN | io::Errno::WOULDBLOCK | io::Errno::NOTSOCK) => (), - Err(io::Errno::PIPE) => write = false, - Err(err) => return Err(err), - Ok(_) => (), - } - } - Ok((read, write)) -} - -#[inline] -pub(crate) fn dup(fd: BorrowedFd<'_>) -> io::Result<OwnedFd> { - unsafe { ret_owned_fd(syscall_readonly!(__NR_dup, fd)) } -} - -#[allow(clippy::needless_pass_by_ref_mut)] -#[inline] -pub(crate) fn dup2(fd: BorrowedFd<'_>, new: &mut OwnedFd) -> io::Result<()> { - #[cfg(any(target_arch = "aarch64", target_arch = "riscv64"))] - { - // We don't need to worry about the difference between `dup2` and - // `dup3` when the file descriptors are equal because we have an - // `&mut OwnedFd` which means `fd` doesn't alias it. - dup3(fd, new, DupFlags::empty()) - } - - #[cfg(not(any(target_arch = "aarch64", target_arch = "riscv64")))] - unsafe { - ret_discarded_fd(syscall_readonly!(__NR_dup2, fd, new.as_fd())) - } -} - -#[allow(clippy::needless_pass_by_ref_mut)] -#[inline] -pub(crate) fn dup3(fd: BorrowedFd<'_>, new: &mut OwnedFd, flags: DupFlags) -> io::Result<()> { - unsafe { ret_discarded_fd(syscall_readonly!(__NR_dup3, fd, new.as_fd(), flags)) } -} - -#[inline] -pub(crate) fn fcntl_getfd(fd: BorrowedFd<'_>) -> io::Result<FdFlags> { - #[cfg(target_pointer_width = "32")] - unsafe { - ret_c_uint(syscall_readonly!(__NR_fcntl64, fd, c_uint(F_GETFD))) - .map(FdFlags::from_bits_retain) - } - #[cfg(target_pointer_width = "64")] - unsafe { - ret_c_uint(syscall_readonly!(__NR_fcntl, fd, c_uint(F_GETFD))) - .map(FdFlags::from_bits_retain) - } -} - -#[inline] -pub(crate) fn fcntl_setfd(fd: BorrowedFd<'_>, flags: FdFlags) -> io::Result<()> { - #[cfg(target_pointer_width = "32")] - unsafe { - ret(syscall_readonly!(__NR_fcntl64, fd, c_uint(F_SETFD), flags)) - } - #[cfg(target_pointer_width = "64")] - unsafe { - ret(syscall_readonly!(__NR_fcntl, fd, c_uint(F_SETFD), flags)) - } -} - -#[inline] -pub(crate) fn fcntl_dupfd_cloexec(fd: BorrowedFd<'_>, min: RawFd) -> io::Result<OwnedFd> { - #[cfg(target_pointer_width = "32")] - unsafe { - ret_owned_fd(syscall_readonly!( - __NR_fcntl64, - fd, - c_uint(F_DUPFD_CLOEXEC), - raw_fd(min) - )) - } - #[cfg(target_pointer_width = "64")] - unsafe { - ret_owned_fd(syscall_readonly!( - __NR_fcntl, - fd, - c_uint(F_DUPFD_CLOEXEC), - raw_fd(min) - )) - } -} diff --git a/vendor/rustix/src/backend/linux_raw/io/types.rs b/vendor/rustix/src/backend/linux_raw/io/types.rs deleted file mode 100644 index 4b3dfc6..0000000 --- a/vendor/rustix/src/backend/linux_raw/io/types.rs +++ /dev/null @@ -1,57 +0,0 @@ -use crate::backend::c; -use bitflags::bitflags; - -bitflags! { - /// `FD_*` constants for use with [`fcntl_getfd`] and [`fcntl_setfd`]. - /// - /// [`fcntl_getfd`]: crate::io::fcntl_getfd - /// [`fcntl_setfd`]: crate::io::fcntl_setfd - #[repr(transparent)] - #[derive(Copy, Clone, Eq, PartialEq, Hash, Debug)] - pub struct FdFlags: c::c_uint { - /// `FD_CLOEXEC` - const CLOEXEC = linux_raw_sys::general::FD_CLOEXEC; - - /// <https://docs.rs/bitflags/*/bitflags/#externally-defined-flags> - const _ = !0; - } -} - -bitflags! { - /// `RWF_*` constants for use with [`preadv2`] and [`pwritev2`]. - /// - /// [`preadv2`]: crate::io::preadv2 - /// [`pwritev2`]: crate::io::pwritev - #[repr(transparent)] - #[derive(Copy, Clone, Eq, PartialEq, Hash, Debug)] - pub struct ReadWriteFlags: c::c_uint { - /// `RWF_DSYNC` (since Linux 4.7) - const DSYNC = linux_raw_sys::general::RWF_DSYNC; - /// `RWF_HIPRI` (since Linux 4.6) - const HIPRI = linux_raw_sys::general::RWF_HIPRI; - /// `RWF_SYNC` (since Linux 4.7) - const SYNC = linux_raw_sys::general::RWF_SYNC; - /// `RWF_NOWAIT` (since Linux 4.14) - const NOWAIT = linux_raw_sys::general::RWF_NOWAIT; - /// `RWF_APPEND` (since Linux 4.16) - const APPEND = linux_raw_sys::general::RWF_APPEND; - - /// <https://docs.rs/bitflags/*/bitflags/#externally-defined-flags> - const _ = !0; - } -} - -bitflags! { - /// `O_*` constants for use with [`dup2`]. - /// - /// [`dup2`]: crate::io::dup2 - #[repr(transparent)] - #[derive(Copy, Clone, Eq, PartialEq, Hash, Debug)] - pub struct DupFlags: c::c_uint { - /// `O_CLOEXEC` - const CLOEXEC = linux_raw_sys::general::O_CLOEXEC; - - /// <https://docs.rs/bitflags/*/bitflags/#externally-defined-flags> - const _ = !0; - } -} diff --git a/vendor/rustix/src/backend/linux_raw/io_uring/mod.rs b/vendor/rustix/src/backend/linux_raw/io_uring/mod.rs deleted file mode 100644 index ef944f0..0000000 --- a/vendor/rustix/src/backend/linux_raw/io_uring/mod.rs +++ /dev/null @@ -1 +0,0 @@ -pub(crate) mod syscalls; diff --git a/vendor/rustix/src/backend/linux_raw/io_uring/syscalls.rs b/vendor/rustix/src/backend/linux_raw/io_uring/syscalls.rs deleted file mode 100644 index d10cd13..0000000 --- a/vendor/rustix/src/backend/linux_raw/io_uring/syscalls.rs +++ /dev/null @@ -1,62 +0,0 @@ -//! linux_raw syscalls supporting `rustix::io_uring`. -//! -//! # Safety -//! -//! See the `rustix::backend::syscalls` module documentation for details. -#![allow(unsafe_code, clippy::undocumented_unsafe_blocks)] - -use crate::backend::conv::{by_mut, c_uint, pass_usize, ret_c_uint, ret_owned_fd}; -use crate::fd::{BorrowedFd, OwnedFd}; -use crate::io; -use crate::io_uring::{io_uring_params, IoringEnterFlags, IoringRegisterOp}; -use core::ffi::c_void; - -#[inline] -pub(crate) fn io_uring_setup(entries: u32, params: &mut io_uring_params) -> io::Result<OwnedFd> { - unsafe { - ret_owned_fd(syscall!( - __NR_io_uring_setup, - c_uint(entries), - by_mut(params) - )) - } -} - -#[inline] -pub(crate) unsafe fn io_uring_register( - fd: BorrowedFd<'_>, - opcode: IoringRegisterOp, - arg: *const c_void, - nr_args: u32, -) -> io::Result<u32> { - ret_c_uint(syscall_readonly!( - __NR_io_uring_register, - fd, - c_uint(opcode as u32), - arg, - c_uint(nr_args) - )) -} - -#[inline] -pub(crate) unsafe fn io_uring_enter( - fd: BorrowedFd<'_>, - to_submit: u32, - min_complete: u32, - flags: IoringEnterFlags, - arg: *const c_void, - size: usize, -) -> io::Result<u32> { - // This is not `_readonly` because `io_uring_enter` waits for I/O to - // complete, and I/O could involve writing to memory buffers, which - // could be a side effect depended on by the caller. - ret_c_uint(syscall!( - __NR_io_uring_enter, - fd, - c_uint(to_submit), - c_uint(min_complete), - flags, - arg, - pass_usize(size) - )) -} diff --git a/vendor/rustix/src/backend/linux_raw/mm/mod.rs b/vendor/rustix/src/backend/linux_raw/mm/mod.rs deleted file mode 100644 index 1e0181a..0000000 --- a/vendor/rustix/src/backend/linux_raw/mm/mod.rs +++ /dev/null @@ -1,2 +0,0 @@ -pub(crate) mod syscalls; -pub(crate) mod types; diff --git a/vendor/rustix/src/backend/linux_raw/mm/syscalls.rs b/vendor/rustix/src/backend/linux_raw/mm/syscalls.rs deleted file mode 100644 index 361f111..0000000 --- a/vendor/rustix/src/backend/linux_raw/mm/syscalls.rs +++ /dev/null @@ -1,237 +0,0 @@ -//! linux_raw syscalls supporting `rustix::io`. -//! -//! # Safety -//! -//! See the `rustix::backend` module documentation for details. -#![allow(unsafe_code)] -#![allow(clippy::undocumented_unsafe_blocks)] - -use super::types::{ - Advice, MapFlags, MlockAllFlags, MlockFlags, MprotectFlags, MremapFlags, MsyncFlags, ProtFlags, - UserfaultfdFlags, -}; -use crate::backend::c; -#[cfg(target_pointer_width = "64")] -use crate::backend::conv::loff_t_from_u64; -use crate::backend::conv::{c_uint, no_fd, pass_usize, ret, ret_owned_fd, ret_void_star}; -use crate::fd::{BorrowedFd, OwnedFd}; -use crate::io; -use linux_raw_sys::general::MAP_ANONYMOUS; - -#[inline] -pub(crate) fn madvise(addr: *mut c::c_void, len: usize, advice: Advice) -> io::Result<()> { - unsafe { - ret(syscall!( - __NR_madvise, - addr, - pass_usize(len), - c_uint(advice as c::c_uint) - )) - } -} - -#[inline] -pub(crate) unsafe fn msync(addr: *mut c::c_void, len: usize, flags: MsyncFlags) -> io::Result<()> { - ret(syscall!(__NR_msync, addr, pass_usize(len), flags)) -} - -/// # Safety -/// -/// `mmap` is primarily unsafe due to the `addr` parameter, as anything working -/// with memory pointed to by raw pointers is unsafe. -#[inline] -pub(crate) unsafe fn mmap( - addr: *mut c::c_void, - length: usize, - prot: ProtFlags, - flags: MapFlags, - fd: BorrowedFd<'_>, - offset: u64, -) -> io::Result<*mut c::c_void> { - #[cfg(target_pointer_width = "32")] - { - ret_void_star(syscall!( - __NR_mmap2, - addr, - pass_usize(length), - prot, - flags, - fd, - (offset / 4096) - .try_into() - .map(pass_usize) - .map_err(|_| io::Errno::INVAL)? - )) - } - #[cfg(target_pointer_width = "64")] - { - ret_void_star(syscall!( - __NR_mmap, - addr, - pass_usize(length), - prot, - flags, - fd, - loff_t_from_u64(offset) - )) - } -} - -/// # Safety -/// -/// `mmap` is primarily unsafe due to the `addr` parameter, as anything working -/// with memory pointed to by raw pointers is unsafe. -#[inline] -pub(crate) unsafe fn mmap_anonymous( - addr: *mut c::c_void, - length: usize, - prot: ProtFlags, - flags: MapFlags, -) -> io::Result<*mut c::c_void> { - #[cfg(target_pointer_width = "32")] - { - ret_void_star(syscall!( - __NR_mmap2, - addr, - pass_usize(length), - prot, - c_uint(flags.bits() | MAP_ANONYMOUS), - no_fd(), - pass_usize(0) - )) - } - #[cfg(target_pointer_width = "64")] - { - ret_void_star(syscall!( - __NR_mmap, - addr, - pass_usize(length), - prot, - c_uint(flags.bits() | MAP_ANONYMOUS), - no_fd(), - loff_t_from_u64(0) - )) - } -} - -#[inline] -pub(crate) unsafe fn mprotect( - ptr: *mut c::c_void, - len: usize, - flags: MprotectFlags, -) -> io::Result<()> { - ret(syscall!(__NR_mprotect, ptr, pass_usize(len), flags)) -} - -/// # Safety -/// -/// `munmap` is primarily unsafe due to the `addr` parameter, as anything -/// working with memory pointed to by raw pointers is unsafe. -#[inline] -pub(crate) unsafe fn munmap(addr: *mut c::c_void, length: usize) -> io::Result<()> { - ret(syscall!(__NR_munmap, addr, pass_usize(length))) -} - -/// # Safety -/// -/// `mremap` is primarily unsafe due to the `old_address` parameter, as -/// anything working with memory pointed to by raw pointers is unsafe. -#[inline] -pub(crate) unsafe fn mremap( - old_address: *mut c::c_void, - old_size: usize, - new_size: usize, - flags: MremapFlags, -) -> io::Result<*mut c::c_void> { - ret_void_star(syscall!( - __NR_mremap, - old_address, - pass_usize(old_size), - pass_usize(new_size), - flags - )) -} - -/// # Safety -/// -/// `mremap_fixed` is primarily unsafe due to the `old_address` and -/// `new_address` parameters, as anything working with memory pointed to by raw -/// pointers is unsafe. -#[inline] -pub(crate) unsafe fn mremap_fixed( - old_address: *mut c::c_void, - old_size: usize, - new_size: usize, - flags: MremapFlags, - new_address: *mut c::c_void, -) -> io::Result<*mut c::c_void> { - ret_void_star(syscall!( - __NR_mremap, - old_address, - pass_usize(old_size), - pass_usize(new_size), - flags, - new_address - )) -} - -/// # Safety -/// -/// `mlock` operates on raw pointers and may round out to the nearest page -/// boundaries. -#[inline] -pub(crate) unsafe fn mlock(addr: *mut c::c_void, length: usize) -> io::Result<()> { - ret(syscall!(__NR_mlock, addr, pass_usize(length))) -} - -/// # Safety -/// -/// `mlock_with` operates on raw pointers and may round out to the nearest page -/// boundaries. -#[inline] -pub(crate) unsafe fn mlock_with( - addr: *mut c::c_void, - length: usize, - flags: MlockFlags, -) -> io::Result<()> { - ret(syscall!(__NR_mlock2, addr, pass_usize(length), flags)) -} - -/// # Safety -/// -/// `munlock` operates on raw pointers and may round out to the nearest page -/// boundaries. -#[inline] -pub(crate) unsafe fn munlock(addr: *mut c::c_void, length: usize) -> io::Result<()> { - ret(syscall!(__NR_munlock, addr, pass_usize(length))) -} - -#[inline] -pub(crate) unsafe fn userfaultfd(flags: UserfaultfdFlags) -> io::Result<OwnedFd> { - ret_owned_fd(syscall_readonly!(__NR_userfaultfd, flags)) -} - -/// Locks all pages mapped into the address space of the calling process. -/// -/// This includes the pages of the code, data, and stack segment, as well as -/// shared libraries, user space kernel data, shared memory, and memory-mapped -/// files. All mapped pages are guaranteed to be resident in RAM when the call -/// returns successfully; the pages are guaranteed to stay in RAM until later -/// unlocked. -#[inline] -pub(crate) fn mlockall(flags: MlockAllFlags) -> io::Result<()> { - // When `mlockall` is used with `MCL_ONFAULT | MCL_FUTURE`, the ordering - // of `mlockall` with respect to arbitrary loads may be significant, - // because if a load happens and evokes a fault before the `mlockall`, - // the memory doesn't get locked, but if the load and therefore - // the fault happens after, then the memory does get locked. - // So to be conservative in this regard, we use `syscall` instead - // of `syscall_readonly` - unsafe { ret(syscall!(__NR_mlockall, flags)) } -} - -/// Unlocks all pages mapped into the address space of the calling process. -#[inline] -pub(crate) fn munlockall() -> io::Result<()> { - unsafe { ret(syscall_readonly!(__NR_munlockall)) } -} diff --git a/vendor/rustix/src/backend/linux_raw/mm/types.rs b/vendor/rustix/src/backend/linux_raw/mm/types.rs deleted file mode 100644 index 68898f5..0000000 --- a/vendor/rustix/src/backend/linux_raw/mm/types.rs +++ /dev/null @@ -1,295 +0,0 @@ -use crate::backend::c; -use bitflags::bitflags; - -bitflags! { - /// `PROT_*` flags for use with [`mmap`]. - /// - /// For `PROT_NONE`, use `ProtFlags::empty()`. - /// - /// [`mmap`]: crate::mm::mmap - #[repr(transparent)] - #[derive(Copy, Clone, Eq, PartialEq, Hash, Debug)] - pub struct ProtFlags: u32 { - /// `PROT_READ` - const READ = linux_raw_sys::general::PROT_READ; - /// `PROT_WRITE` - const WRITE = linux_raw_sys::general::PROT_WRITE; - /// `PROT_EXEC` - const EXEC = linux_raw_sys::general::PROT_EXEC; - - /// <https://docs.rs/bitflags/*/bitflags/#externally-defined-flags> - const _ = !0; - } -} - -bitflags! { - /// `PROT_*` flags for use with [`mprotect`]. - /// - /// For `PROT_NONE`, use `MprotectFlags::empty()`. - /// - /// [`mprotect`]: crate::mm::mprotect - #[repr(transparent)] - #[derive(Copy, Clone, Eq, PartialEq, Hash, Debug)] - pub struct MprotectFlags: u32 { - /// `PROT_READ` - const READ = linux_raw_sys::general::PROT_READ; - /// `PROT_WRITE` - const WRITE = linux_raw_sys::general::PROT_WRITE; - /// `PROT_EXEC` - const EXEC = linux_raw_sys::general::PROT_EXEC; - /// `PROT_GROWSUP` - const GROWSUP = linux_raw_sys::general::PROT_GROWSUP; - /// `PROT_GROWSDOWN` - const GROWSDOWN = linux_raw_sys::general::PROT_GROWSDOWN; - /// `PROT_SEM` - const SEM = linux_raw_sys::general::PROT_SEM; - /// `PROT_BTI` - #[cfg(target_arch = "aarch64")] - const BTI = linux_raw_sys::general::PROT_BTI; - /// `PROT_MTE` - #[cfg(target_arch = "aarch64")] - const MTE = linux_raw_sys::general::PROT_MTE; - /// `PROT_SAO` - #[cfg(any(target_arch = "powerpc", target_arch = "powerpc64"))] - const SAO = linux_raw_sys::general::PROT_SAO; - /// `PROT_ADI` - #[cfg(any(target_arch = "sparc", target_arch = "sparc64"))] - const ADI = linux_raw_sys::general::PROT_ADI; - - /// <https://docs.rs/bitflags/*/bitflags/#externally-defined-flags> - const _ = !0; - } -} - -bitflags! { - /// `MAP_*` flags for use with [`mmap`]. - /// - /// For `MAP_ANONYMOUS` (aka `MAP_ANON`), see [`mmap_anonymous`]. - /// - /// [`mmap`]: crate::mm::mmap - /// [`mmap_anonymous`]: crates::mm::mmap_anonymous - #[repr(transparent)] - #[derive(Copy, Clone, Eq, PartialEq, Hash, Debug)] - pub struct MapFlags: u32 { - /// `MAP_SHARED` - const SHARED = linux_raw_sys::general::MAP_SHARED; - /// `MAP_SHARED_VALIDATE` (since Linux 4.15) - const SHARED_VALIDATE = linux_raw_sys::general::MAP_SHARED_VALIDATE; - /// `MAP_PRIVATE` - const PRIVATE = linux_raw_sys::general::MAP_PRIVATE; - /// `MAP_DENYWRITE` - const DENYWRITE = linux_raw_sys::general::MAP_DENYWRITE; - /// `MAP_FIXED` - const FIXED = linux_raw_sys::general::MAP_FIXED; - /// `MAP_FIXED_NOREPLACE` (since Linux 4.17) - const FIXED_NOREPLACE = linux_raw_sys::general::MAP_FIXED_NOREPLACE; - /// `MAP_GROWSDOWN` - const GROWSDOWN = linux_raw_sys::general::MAP_GROWSDOWN; - /// `MAP_HUGETLB` - const HUGETLB = linux_raw_sys::general::MAP_HUGETLB; - /// `MAP_HUGE_2MB` (since Linux 3.8) - const HUGE_2MB = linux_raw_sys::general::MAP_HUGE_2MB; - /// `MAP_HUGE_1GB` (since Linux 3.8) - const HUGE_1GB = linux_raw_sys::general::MAP_HUGE_1GB; - /// `MAP_LOCKED` - const LOCKED = linux_raw_sys::general::MAP_LOCKED; - /// `MAP_NORESERVE` - const NORESERVE = linux_raw_sys::general::MAP_NORESERVE; - /// `MAP_POPULATE` - const POPULATE = linux_raw_sys::general::MAP_POPULATE; - /// `MAP_STACK` - const STACK = linux_raw_sys::general::MAP_STACK; - /// `MAP_SYNC` (since Linux 4.15) - #[cfg(not(any(target_arch = "mips", target_arch = "mips32r6", target_arch = "mips64", target_arch = "mips64r6")))] - const SYNC = linux_raw_sys::general::MAP_SYNC; - /// `MAP_UNINITIALIZED` - #[cfg(not(any(target_arch = "mips", target_arch = "mips32r6", target_arch = "mips64", target_arch = "mips64r6")))] - const UNINITIALIZED = linux_raw_sys::general::MAP_UNINITIALIZED; - - /// <https://docs.rs/bitflags/*/bitflags/#externally-defined-flags> - const _ = !0; - } -} - -bitflags! { - /// `MREMAP_*` flags for use with [`mremap`]. - /// - /// For `MREMAP_FIXED`, see [`mremap_fixed`]. - /// - /// [`mremap`]: crate::mm::mremap - /// [`mremap_fixed`]: crate::mm::mremap_fixed - #[repr(transparent)] - #[derive(Copy, Clone, Eq, PartialEq, Hash, Debug)] - pub struct MremapFlags: u32 { - /// `MREMAP_MAYMOVE` - const MAYMOVE = linux_raw_sys::general::MREMAP_MAYMOVE; - /// `MREMAP_DONTUNMAP` (since Linux 5.7) - const DONTUNMAP = linux_raw_sys::general::MREMAP_DONTUNMAP; - - /// <https://docs.rs/bitflags/*/bitflags/#externally-defined-flags> - const _ = !0; - } -} - -bitflags! { - /// `MS_*` flags for use with [`msync`]. - /// - /// [`msync`]: crate::mm::msync - #[repr(transparent)] - #[derive(Copy, Clone, Eq, PartialEq, Hash, Debug)] - pub struct MsyncFlags: u32 { - /// `MS_SYNC`—Requests an update and waits for it to complete. - const SYNC = linux_raw_sys::general::MS_SYNC; - /// `MS_ASYNC`—Specifies that an update be scheduled, but the call - /// returns immediately. - const ASYNC = linux_raw_sys::general::MS_ASYNC; - /// `MS_INVALIDATE`—Asks to invalidate other mappings of the same - /// file (so that they can be updated with the fresh values just - /// written). - const INVALIDATE = linux_raw_sys::general::MS_INVALIDATE; - - /// <https://docs.rs/bitflags/*/bitflags/#externally-defined-flags> - const _ = !0; - } -} - -bitflags! { - /// `MLOCK_*` flags for use with [`mlock_with`]. - /// - /// [`mlock_with`]: crate::mm::mlock_with - #[repr(transparent)] - #[derive(Copy, Clone, Eq, PartialEq, Hash, Debug)] - pub struct MlockFlags: u32 { - /// `MLOCK_ONFAULT` - const ONFAULT = linux_raw_sys::general::MLOCK_ONFAULT; - - /// <https://docs.rs/bitflags/*/bitflags/#externally-defined-flags> - const _ = !0; - } -} - -/// `POSIX_MADV_*` constants for use with [`madvise`]. -/// -/// [`madvise`]: crate::mm::madvise -#[derive(Debug, Copy, Clone, Eq, PartialEq)] -#[repr(u32)] -#[non_exhaustive] -pub enum Advice { - /// `POSIX_MADV_NORMAL` - Normal = linux_raw_sys::general::MADV_NORMAL, - - /// `POSIX_MADV_SEQUENTIAL` - Sequential = linux_raw_sys::general::MADV_SEQUENTIAL, - - /// `POSIX_MADV_RANDOM` - Random = linux_raw_sys::general::MADV_RANDOM, - - /// `POSIX_MADV_WILLNEED` - WillNeed = linux_raw_sys::general::MADV_WILLNEED, - - /// `MADV_DONTNEED` - LinuxDontNeed = linux_raw_sys::general::MADV_DONTNEED, - - /// `MADV_FREE` (since Linux 4.5) - LinuxFree = linux_raw_sys::general::MADV_FREE, - /// `MADV_REMOVE` - LinuxRemove = linux_raw_sys::general::MADV_REMOVE, - /// `MADV_DONTFORK` - LinuxDontFork = linux_raw_sys::general::MADV_DONTFORK, - /// `MADV_DOFORK` - LinuxDoFork = linux_raw_sys::general::MADV_DOFORK, - /// `MADV_HWPOISON` - LinuxHwPoison = linux_raw_sys::general::MADV_HWPOISON, - /// `MADV_SOFT_OFFLINE` - #[cfg(not(any( - target_arch = "mips", - target_arch = "mips32r6", - target_arch = "mips64", - target_arch = "mips64r6" - )))] - LinuxSoftOffline = linux_raw_sys::general::MADV_SOFT_OFFLINE, - /// `MADV_MERGEABLE` - LinuxMergeable = linux_raw_sys::general::MADV_MERGEABLE, - /// `MADV_UNMERGEABLE` - LinuxUnmergeable = linux_raw_sys::general::MADV_UNMERGEABLE, - /// `MADV_HUGEPAGE` - LinuxHugepage = linux_raw_sys::general::MADV_HUGEPAGE, - /// `MADV_NOHUGEPAGE` - LinuxNoHugepage = linux_raw_sys::general::MADV_NOHUGEPAGE, - /// `MADV_DONTDUMP` (since Linux 3.4) - LinuxDontDump = linux_raw_sys::general::MADV_DONTDUMP, - /// `MADV_DODUMP` (since Linux 3.4) - LinuxDoDump = linux_raw_sys::general::MADV_DODUMP, - /// `MADV_WIPEONFORK` (since Linux 4.14) - LinuxWipeOnFork = linux_raw_sys::general::MADV_WIPEONFORK, - /// `MADV_KEEPONFORK` (since Linux 4.14) - LinuxKeepOnFork = linux_raw_sys::general::MADV_KEEPONFORK, - /// `MADV_COLD` (since Linux 5.4) - LinuxCold = linux_raw_sys::general::MADV_COLD, - /// `MADV_PAGEOUT` (since Linux 5.4) - LinuxPageOut = linux_raw_sys::general::MADV_PAGEOUT, - /// `MADV_POPULATE_READ` (since Linux 5.14) - LinuxPopulateRead = linux_raw_sys::general::MADV_POPULATE_READ, - /// `MADV_POPULATE_WRITE` (since Linux 5.14) - LinuxPopulateWrite = linux_raw_sys::general::MADV_POPULATE_WRITE, - /// `MADV_DONTNEED_LOCKED` (since Linux 5.18) - LinuxDontneedLocked = linux_raw_sys::general::MADV_DONTNEED_LOCKED, -} - -#[allow(non_upper_case_globals)] -impl Advice { - /// `POSIX_MADV_DONTNEED` - /// - /// On Linux, this is mapped to `POSIX_MADV_NORMAL` because Linux's - /// `MADV_DONTNEED` differs from `POSIX_MADV_DONTNEED`. See `LinuxDontNeed` - /// for the Linux behavior. - pub const DontNeed: Self = Self::Normal; -} - -bitflags! { - /// `O_*` flags for use with [`userfaultfd`]. - /// - /// [`userfaultfd`]: crate::mm::userfaultfd - #[repr(transparent)] - #[derive(Copy, Clone, Eq, PartialEq, Hash, Debug)] - pub struct UserfaultfdFlags: c::c_uint { - /// `O_CLOEXEC` - const CLOEXEC = linux_raw_sys::general::O_CLOEXEC; - /// `O_NONBLOCK` - const NONBLOCK = linux_raw_sys::general::O_NONBLOCK; - - /// <https://docs.rs/bitflags/*/bitflags/#externally-defined-flags> - const _ = !0; - } -} - -bitflags! { - /// `MCL_*` flags for use with [`mlockall`]. - /// - /// [`mlockall`]: crate::mm::mlockall - #[repr(transparent)] - #[derive(Copy, Clone, Eq, PartialEq, Hash, Debug)] - pub struct MlockAllFlags: u32 { - /// Used together with `MCL_CURRENT`, `MCL_FUTURE`, or both. Mark all - /// current (with `MCL_CURRENT`) or future (with `MCL_FUTURE`) mappings - /// to lock pages when they are faulted in. When used with - /// `MCL_CURRENT`, all present pages are locked, but `mlockall` will - /// not fault in non-present pages. When used with `MCL_FUTURE`, all - /// future mappings will be marked to lock pages when they are faulted - /// in, but they will not be populated by the lock when the mapping is - /// created. `MCL_ONFAULT` must be used with either `MCL_CURRENT` or - /// `MCL_FUTURE` or both. - const ONFAULT = linux_raw_sys::general::MCL_ONFAULT; - /// Lock all pages which will become mapped into the address space of - /// the process in the future. These could be, for instance, new pages - /// required by a growing heap and stack as well as new memory-mapped - /// files or shared memory regions. - const FUTURE = linux_raw_sys::general::MCL_FUTURE; - /// Lock all pages which are currently mapped into the address space of - /// the process. - const CURRENT = linux_raw_sys::general::MCL_CURRENT; - - /// <https://docs.rs/bitflags/*/bitflags/#externally-defined-flags> - const _ = !0; - } -} diff --git a/vendor/rustix/src/backend/linux_raw/mod.rs b/vendor/rustix/src/backend/linux_raw/mod.rs deleted file mode 100644 index 0d4e533..0000000 --- a/vendor/rustix/src/backend/linux_raw/mod.rs +++ /dev/null @@ -1,117 +0,0 @@ -//! The linux_raw backend. -//! -//! This makes Linux syscalls directly, without going through libc. -//! -//! # Safety -//! -//! These files performs raw system calls, and sometimes passes them -//! uninitialized memory buffers. The signatures in this file are currently -//! manually maintained and must correspond with the signatures of the actual -//! Linux syscalls. -//! -//! Some of this could be auto-generated from the Linux header file -//! <linux/syscalls.h>, but we often need more information than it provides, -//! such as which pointers are array slices, out parameters, or in-out -//! parameters, which integers are owned or borrowed file descriptors, etc. - -#[macro_use] -mod arch; -mod conv; -mod reg; -#[cfg(any(feature = "time", feature = "process", target_arch = "x86"))] -mod vdso; -#[cfg(any(feature = "time", feature = "process", target_arch = "x86"))] -mod vdso_wrappers; - -#[cfg(feature = "event")] -pub(crate) mod event; -#[cfg(any( - feature = "fs", - all( - not(feature = "use-libc-auxv"), - not(feature = "use-explicitly-provided-auxv"), - any( - feature = "param", - feature = "process", - feature = "runtime", - feature = "time", - target_arch = "x86", - ) - ) -))] -pub(crate) mod fs; -pub(crate) mod io; -#[cfg(feature = "io_uring")] -pub(crate) mod io_uring; -#[cfg(feature = "mm")] -pub(crate) mod mm; -#[cfg(feature = "mount")] -pub(crate) mod mount; -#[cfg(all(feature = "fs", not(feature = "mount")))] -pub(crate) mod mount; // for deprecated mount functions in "fs" -#[cfg(feature = "net")] -pub(crate) mod net; -#[cfg(any( - feature = "param", - feature = "process", - feature = "runtime", - feature = "time", - target_arch = "x86", -))] -pub(crate) mod param; -#[cfg(feature = "pipe")] -pub(crate) mod pipe; -#[cfg(feature = "process")] -pub(crate) mod process; -#[cfg(feature = "pty")] -pub(crate) mod pty; -#[cfg(feature = "rand")] -pub(crate) mod rand; -#[cfg(feature = "runtime")] -pub(crate) mod runtime; -#[cfg(feature = "shm")] -pub(crate) mod shm; -#[cfg(feature = "system")] -pub(crate) mod system; -#[cfg(feature = "termios")] -pub(crate) mod termios; -#[cfg(feature = "thread")] -pub(crate) mod thread; -#[cfg(feature = "time")] -pub(crate) mod time; - -pub(crate) mod fd { - pub use crate::maybe_polyfill::os::fd::{ - AsFd, AsRawFd, BorrowedFd, FromRawFd, IntoRawFd, OwnedFd, RawFd, - }; -} - -// The linux_raw backend doesn't use actual libc, so we define selected -// libc-like definitions in a module called `c`. -pub(crate) mod c; - -// Private modules used by multiple public modules. -#[cfg(any(feature = "procfs", feature = "process", feature = "runtime"))] -pub(crate) mod pid; -#[cfg(any(feature = "process", feature = "thread"))] -pub(crate) mod prctl; -#[cfg(any( - feature = "fs", - feature = "process", - feature = "thread", - all( - not(feature = "use-libc-auxv"), - not(feature = "use-explicitly-provided-auxv"), - any( - feature = "param", - feature = "runtime", - feature = "time", - target_arch = "x86", - ) - ) -))] -pub(crate) mod ugid; - -/// The maximum number of buffers that can be passed into a vectored I/O system -/// call on the current platform. -const MAX_IOV: usize = linux_raw_sys::general::UIO_MAXIOV as usize; diff --git a/vendor/rustix/src/backend/linux_raw/mount/mod.rs b/vendor/rustix/src/backend/linux_raw/mount/mod.rs deleted file mode 100644 index 1e0181a..0000000 --- a/vendor/rustix/src/backend/linux_raw/mount/mod.rs +++ /dev/null @@ -1,2 +0,0 @@ -pub(crate) mod syscalls; -pub(crate) mod types; diff --git a/vendor/rustix/src/backend/linux_raw/mount/syscalls.rs b/vendor/rustix/src/backend/linux_raw/mount/syscalls.rs deleted file mode 100644 index 5cb80cc..0000000 --- a/vendor/rustix/src/backend/linux_raw/mount/syscalls.rs +++ /dev/null @@ -1,239 +0,0 @@ -//! linux_raw syscalls supporting `rustix::mount`. -//! -//! # Safety -//! -//! See the `rustix::backend` module documentation for details. -#![allow(unsafe_code)] -#![allow(clippy::undocumented_unsafe_blocks)] - -use crate::backend::conv::ret; -#[cfg(feature = "mount")] -use crate::backend::conv::{ret_owned_fd, slice, zero}; -#[cfg(feature = "mount")] -use crate::fd::{BorrowedFd, OwnedFd}; -use crate::ffi::CStr; -use crate::io; - -#[inline] -pub(crate) fn mount( - source: Option<&CStr>, - target: &CStr, - file_system_type: Option<&CStr>, - flags: super::types::MountFlagsArg, - data: Option<&CStr>, -) -> io::Result<()> { - unsafe { - ret(syscall_readonly!( - __NR_mount, - source, - target, - file_system_type, - flags, - data - )) - } -} - -#[inline] -pub(crate) fn unmount(target: &CStr, flags: super::types::UnmountFlags) -> io::Result<()> { - unsafe { ret(syscall_readonly!(__NR_umount2, target, flags)) } -} - -#[cfg(feature = "mount")] -#[inline] -pub(crate) fn fsopen(fs_name: &CStr, flags: super::types::FsOpenFlags) -> io::Result<OwnedFd> { - unsafe { ret_owned_fd(syscall_readonly!(__NR_fsopen, fs_name, flags)) } -} - -#[cfg(feature = "mount")] -#[inline] -pub(crate) fn fsmount( - fs_fd: BorrowedFd<'_>, - flags: super::types::FsMountFlags, - attr_flags: super::types::MountAttrFlags, -) -> io::Result<OwnedFd> { - unsafe { ret_owned_fd(syscall_readonly!(__NR_fsmount, fs_fd, flags, attr_flags)) } -} - -#[cfg(feature = "mount")] -#[inline] -pub(crate) fn move_mount( - from_dfd: BorrowedFd<'_>, - from_pathname: &CStr, - to_dfd: BorrowedFd<'_>, - to_pathname: &CStr, - flags: super::types::MoveMountFlags, -) -> io::Result<()> { - unsafe { - ret(syscall_readonly!( - __NR_move_mount, - from_dfd, - from_pathname, - to_dfd, - to_pathname, - flags - )) - } -} - -#[cfg(feature = "mount")] -#[inline] -pub(crate) fn open_tree( - dfd: BorrowedFd<'_>, - filename: &CStr, - flags: super::types::OpenTreeFlags, -) -> io::Result<OwnedFd> { - unsafe { ret_owned_fd(syscall_readonly!(__NR_open_tree, dfd, filename, flags)) } -} - -#[cfg(feature = "mount")] -#[inline] -pub(crate) fn fspick( - dfd: BorrowedFd<'_>, - path: &CStr, - flags: super::types::FsPickFlags, -) -> io::Result<OwnedFd> { - unsafe { ret_owned_fd(syscall_readonly!(__NR_fspick, dfd, path, flags)) } -} - -#[cfg(feature = "mount")] -#[inline] -pub(crate) fn fsconfig_set_flag(fs_fd: BorrowedFd<'_>, key: &CStr) -> io::Result<()> { - unsafe { - ret(syscall_readonly!( - __NR_fsconfig, - fs_fd, - super::types::FsConfigCmd::SetFlag, - key, - zero(), - zero() - )) - } -} - -#[cfg(feature = "mount")] -#[inline] -pub(crate) fn fsconfig_set_string( - fs_fd: BorrowedFd<'_>, - key: &CStr, - value: &CStr, -) -> io::Result<()> { - unsafe { - ret(syscall_readonly!( - __NR_fsconfig, - fs_fd, - super::types::FsConfigCmd::SetString, - key, - value, - zero() - )) - } -} - -#[cfg(feature = "mount")] -#[inline] -pub(crate) fn fsconfig_set_binary( - fs_fd: BorrowedFd<'_>, - key: &CStr, - value: &[u8], -) -> io::Result<()> { - let (value_addr, value_len) = slice(value); - unsafe { - ret(syscall_readonly!( - __NR_fsconfig, - fs_fd, - super::types::FsConfigCmd::SetBinary, - key, - value_addr, - value_len - )) - } -} - -#[cfg(feature = "mount")] -#[inline] -pub(crate) fn fsconfig_set_fd( - fs_fd: BorrowedFd<'_>, - key: &CStr, - fd: BorrowedFd<'_>, -) -> io::Result<()> { - unsafe { - ret(syscall_readonly!( - __NR_fsconfig, - fs_fd, - super::types::FsConfigCmd::SetFd, - key, - zero(), - fd - )) - } -} - -#[cfg(feature = "mount")] -#[inline] -pub(crate) fn fsconfig_set_path( - fs_fd: BorrowedFd<'_>, - key: &CStr, - path: &CStr, - fd: BorrowedFd<'_>, -) -> io::Result<()> { - unsafe { - ret(syscall_readonly!( - __NR_fsconfig, - fs_fd, - super::types::FsConfigCmd::SetPath, - key, - path, - fd - )) - } -} - -#[cfg(feature = "mount")] -#[inline] -pub(crate) fn fsconfig_set_path_empty( - fs_fd: BorrowedFd<'_>, - key: &CStr, - fd: BorrowedFd<'_>, -) -> io::Result<()> { - unsafe { - ret(syscall_readonly!( - __NR_fsconfig, - fs_fd, - super::types::FsConfigCmd::SetPathEmpty, - key, - cstr!(""), - fd - )) - } -} - -#[cfg(feature = "mount")] -#[inline] -pub(crate) fn fsconfig_create(fs_fd: BorrowedFd<'_>) -> io::Result<()> { - unsafe { - ret(syscall_readonly!( - __NR_fsconfig, - fs_fd, - super::types::FsConfigCmd::Create, - zero(), - zero(), - zero() - )) - } -} - -#[cfg(feature = "mount")] -#[inline] -pub(crate) fn fsconfig_reconfigure(fs_fd: BorrowedFd<'_>) -> io::Result<()> { - unsafe { - ret(syscall_readonly!( - __NR_fsconfig, - fs_fd, - super::types::FsConfigCmd::Reconfigure, - zero(), - zero(), - zero() - )) - } -} diff --git a/vendor/rustix/src/backend/linux_raw/mount/types.rs b/vendor/rustix/src/backend/linux_raw/mount/types.rs deleted file mode 100644 index 43cb8c0..0000000 --- a/vendor/rustix/src/backend/linux_raw/mount/types.rs +++ /dev/null @@ -1,332 +0,0 @@ -use crate::backend::c; -use bitflags::bitflags; - -bitflags! { - /// `MS_*` constants for use with [`mount`]. - /// - /// [`mount`]: crate::mount::mount - #[repr(transparent)] - #[derive(Copy, Clone, Eq, PartialEq, Hash, Debug)] - pub struct MountFlags: c::c_uint { - /// `MS_BIND` - const BIND = linux_raw_sys::general::MS_BIND; - - /// `MS_DIRSYNC` - const DIRSYNC = linux_raw_sys::general::MS_DIRSYNC; - - /// `MS_LAZYTIME` - const LAZYTIME = linux_raw_sys::general::MS_LAZYTIME; - - /// `MS_MANDLOCK` - #[doc(alias = "MANDLOCK")] - const PERMIT_MANDATORY_FILE_LOCKING = linux_raw_sys::general::MS_MANDLOCK; - - /// `MS_NOATIME` - const NOATIME = linux_raw_sys::general::MS_NOATIME; - - /// `MS_NODEV` - const NODEV = linux_raw_sys::general::MS_NODEV; - - /// `MS_NODIRATIME` - const NODIRATIME = linux_raw_sys::general::MS_NODIRATIME; - - /// `MS_NOEXEC` - const NOEXEC = linux_raw_sys::general::MS_NOEXEC; - - /// `MS_NOSUID` - const NOSUID = linux_raw_sys::general::MS_NOSUID; - - /// `MS_RDONLY` - const RDONLY = linux_raw_sys::general::MS_RDONLY; - - /// `MS_REC` - const REC = linux_raw_sys::general::MS_REC; - - /// `MS_RELATIME` - const RELATIME = linux_raw_sys::general::MS_RELATIME; - - /// `MS_SILENT` - const SILENT = linux_raw_sys::general::MS_SILENT; - - /// `MS_STRICTATIME` - const STRICTATIME = linux_raw_sys::general::MS_STRICTATIME; - - /// `MS_SYNCHRONOUS` - const SYNCHRONOUS = linux_raw_sys::general::MS_SYNCHRONOUS; - - /// `MS_NOSYMFOLLOW` - const NOSYMFOLLOW = linux_raw_sys::general::MS_NOSYMFOLLOW; - - /// <https://docs.rs/bitflags/*/bitflags/#externally-defined-flags> - const _ = !0; - } -} - -bitflags! { - /// `MNT_*` constants for use with [`unmount`]. - /// - /// [`unmount`]: crate::mount::unmount - #[repr(transparent)] - #[derive(Copy, Clone, Eq, PartialEq, Hash, Debug)] - pub struct UnmountFlags: c::c_uint { - /// `MNT_FORCE` - const FORCE = linux_raw_sys::general::MNT_FORCE; - /// `MNT_DETACH` - const DETACH = linux_raw_sys::general::MNT_DETACH; - /// `MNT_EXPIRE` - const EXPIRE = linux_raw_sys::general::MNT_EXPIRE; - /// `UMOUNT_NOFOLLOW` - const NOFOLLOW = linux_raw_sys::general::UMOUNT_NOFOLLOW; - - /// <https://docs.rs/bitflags/*/bitflags/#externally-defined-flags> - const _ = !0; - } -} - -#[cfg(feature = "mount")] -bitflags! { - /// `FSOPEN_*` constants for use with [`fsopen`]. - /// - /// [`fsopen`]: crate::mount::fsopen - #[repr(transparent)] - #[derive(Copy, Clone, Eq, PartialEq, Hash, Debug)] - pub struct FsOpenFlags: c::c_uint { - /// `FSOPEN_CLOEXEC` - const FSOPEN_CLOEXEC = linux_raw_sys::general::FSOPEN_CLOEXEC; - - /// <https://docs.rs/bitflags/*/bitflags/#externally-defined-flags> - const _ = !0; - } -} - -#[cfg(feature = "mount")] -bitflags! { - /// `FSMOUNT_*` constants for use with [`fsmount`]. - /// - /// [`fsmount`]: crate::mount::fsmount - #[repr(transparent)] - #[derive(Copy, Clone, Eq, PartialEq, Hash, Debug)] - pub struct FsMountFlags: c::c_uint { - /// `FSMOUNT_CLOEXEC` - const FSMOUNT_CLOEXEC = linux_raw_sys::general::FSMOUNT_CLOEXEC; - - /// <https://docs.rs/bitflags/*/bitflags/#externally-defined-flags> - const _ = !0; - } -} - -/// `FSCONFIG_*` constants for use with the `fsconfig` syscall. -#[cfg(feature = "mount")] -#[derive(Debug, Copy, Clone, Eq, PartialEq)] -#[repr(u32)] -pub(crate) enum FsConfigCmd { - /// `FSCONFIG_SET_FLAG` - SetFlag = linux_raw_sys::general::fsconfig_command::FSCONFIG_SET_FLAG as u32, - - /// `FSCONFIG_SET_STRING` - SetString = linux_raw_sys::general::fsconfig_command::FSCONFIG_SET_STRING as u32, - - /// `FSCONFIG_SET_BINARY` - SetBinary = linux_raw_sys::general::fsconfig_command::FSCONFIG_SET_BINARY as u32, - - /// `FSCONFIG_SET_PATH` - SetPath = linux_raw_sys::general::fsconfig_command::FSCONFIG_SET_PATH as u32, - - /// `FSCONFIG_SET_PATH_EMPTY` - SetPathEmpty = linux_raw_sys::general::fsconfig_command::FSCONFIG_SET_PATH_EMPTY as u32, - - /// `FSCONFIG_SET_FD` - SetFd = linux_raw_sys::general::fsconfig_command::FSCONFIG_SET_FD as u32, - - /// `FSCONFIG_CMD_CREATE` - Create = linux_raw_sys::general::fsconfig_command::FSCONFIG_CMD_CREATE as u32, - - /// `FSCONFIG_CMD_RECONFIGURE` - Reconfigure = linux_raw_sys::general::fsconfig_command::FSCONFIG_CMD_RECONFIGURE as u32, -} - -#[cfg(feature = "mount")] -bitflags! { - /// `MOUNT_ATTR_*` constants for use with [`fsmount`]. - /// - /// [`fsmount`]: crate::mount::fsmount - #[repr(transparent)] - #[derive(Copy, Clone, Eq, PartialEq, Hash, Debug)] - pub struct MountAttrFlags: c::c_uint { - /// `MOUNT_ATTR_RDONLY` - const MOUNT_ATTR_RDONLY = linux_raw_sys::general::MOUNT_ATTR_RDONLY; - - /// `MOUNT_ATTR_NOSUID` - const MOUNT_ATTR_NOSUID = linux_raw_sys::general::MOUNT_ATTR_NOSUID; - - /// `MOUNT_ATTR_NODEV` - const MOUNT_ATTR_NODEV = linux_raw_sys::general::MOUNT_ATTR_NODEV; - - /// `MOUNT_ATTR_NOEXEC` - const MOUNT_ATTR_NOEXEC = linux_raw_sys::general::MOUNT_ATTR_NOEXEC; - - /// `MOUNT_ATTR__ATIME` - const MOUNT_ATTR__ATIME = linux_raw_sys::general::MOUNT_ATTR__ATIME; - - /// `MOUNT_ATTR_RELATIME` - const MOUNT_ATTR_RELATIME = linux_raw_sys::general::MOUNT_ATTR_RELATIME; - - /// `MOUNT_ATTR_NOATIME` - const MOUNT_ATTR_NOATIME = linux_raw_sys::general::MOUNT_ATTR_NOATIME; - - /// `MOUNT_ATTR_STRICTATIME` - const MOUNT_ATTR_STRICTATIME = linux_raw_sys::general::MOUNT_ATTR_STRICTATIME; - - /// `MOUNT_ATTR_NODIRATIME` - const MOUNT_ATTR_NODIRATIME = linux_raw_sys::general::MOUNT_ATTR_NODIRATIME; - - /// `MOUNT_ATTR_NOUSER` - const MOUNT_ATTR_IDMAP = linux_raw_sys::general::MOUNT_ATTR_IDMAP; - - /// `MOUNT_ATTR__ATIME_FLAGS` - const MOUNT_ATTR_NOSYMFOLLOW = linux_raw_sys::general::MOUNT_ATTR_NOSYMFOLLOW; - - /// `MOUNT_ATTR__ATIME_FLAGS` - const MOUNT_ATTR_SIZE_VER0 = linux_raw_sys::general::MOUNT_ATTR_SIZE_VER0; - - /// <https://docs.rs/bitflags/*/bitflags/#externally-defined-flags> - const _ = !0; - } -} - -#[cfg(feature = "mount")] -bitflags! { - /// `MOVE_MOUNT_*` constants for use with [`move_mount`]. - /// - /// [`move_mount`]: crate::mount::move_mount - #[repr(transparent)] - #[derive(Copy, Clone, Eq, PartialEq, Hash, Debug)] - pub struct MoveMountFlags: c::c_uint { - /// `MOVE_MOUNT_F_EMPTY_PATH` - const MOVE_MOUNT_F_SYMLINKS = linux_raw_sys::general::MOVE_MOUNT_F_SYMLINKS; - - /// `MOVE_MOUNT_F_AUTOMOUNTS` - const MOVE_MOUNT_F_AUTOMOUNTS = linux_raw_sys::general::MOVE_MOUNT_F_AUTOMOUNTS; - - /// `MOVE_MOUNT_F_EMPTY_PATH` - const MOVE_MOUNT_F_EMPTY_PATH = linux_raw_sys::general::MOVE_MOUNT_F_EMPTY_PATH; - - /// `MOVE_MOUNT_T_SYMLINKS` - const MOVE_MOUNT_T_SYMLINKS = linux_raw_sys::general::MOVE_MOUNT_T_SYMLINKS; - - /// `MOVE_MOUNT_T_AUTOMOUNTS` - const MOVE_MOUNT_T_AUTOMOUNTS = linux_raw_sys::general::MOVE_MOUNT_T_AUTOMOUNTS; - - /// `MOVE_MOUNT_T_EMPTY_PATH` - const MOVE_MOUNT_T_EMPTY_PATH = linux_raw_sys::general::MOVE_MOUNT_T_EMPTY_PATH; - - /// `MOVE_MOUNT__MASK` - const MOVE_MOUNT_SET_GROUP = linux_raw_sys::general::MOVE_MOUNT_SET_GROUP; - - // TODO: add when Linux 6.5 is released - // /// `MOVE_MOUNT_BENEATH` - // const MOVE_MOUNT_BENEATH = linux_raw_sys::general::MOVE_MOUNT_BENEATH; - - /// `MOVE_MOUNT__MASK` - const MOVE_MOUNT__MASK = linux_raw_sys::general::MOVE_MOUNT__MASK; - - /// <https://docs.rs/bitflags/*/bitflags/#externally-defined-flags> - const _ = !0; - } -} - -#[cfg(feature = "mount")] -bitflags! { - /// `OPENTREE_*` constants for use with [`open_tree`]. - /// - /// [`open_tree`]: crate::mount::open_tree - #[repr(transparent)] - #[derive(Copy, Clone, Eq, PartialEq, Hash, Debug)] - pub struct OpenTreeFlags: c::c_uint { - /// `OPENTREE_CLONE` - const OPEN_TREE_CLONE = linux_raw_sys::general::OPEN_TREE_CLONE; - - /// `OPENTREE_CLOEXEC` - const OPEN_TREE_CLOEXEC = linux_raw_sys::general::OPEN_TREE_CLOEXEC; - - /// `AT_EMPTY_PATH` - const AT_EMPTY_PATH = linux_raw_sys::general::AT_EMPTY_PATH; - - /// `AT_NO_AUTOMOUNT` - const AT_NO_AUTOMOUNT = linux_raw_sys::general::AT_NO_AUTOMOUNT; - - /// `AT_RECURSIVE` - const AT_RECURSIVE = linux_raw_sys::general::AT_RECURSIVE; - - /// `AT_SYMLINK_NOFOLLOW` - const AT_SYMLINK_NOFOLLOW = linux_raw_sys::general::AT_SYMLINK_NOFOLLOW; - - /// <https://docs.rs/bitflags/*/bitflags/#externally-defined-flags> - const _ = !0; - } -} - -#[cfg(feature = "mount")] -bitflags! { - /// `FSPICK_*` constants for use with [`fspick`]. - /// - /// [`fspick`]: crate::mount::fspick - #[repr(transparent)] - #[derive(Copy, Clone, Eq, PartialEq, Hash, Debug)] - pub struct FsPickFlags: c::c_uint { - /// `FSPICK_CLOEXEC` - const FSPICK_CLOEXEC = linux_raw_sys::general::FSPICK_CLOEXEC; - - /// `FSPICK_SYMLINK_NOFOLLOW` - const FSPICK_SYMLINK_NOFOLLOW = linux_raw_sys::general::FSPICK_SYMLINK_NOFOLLOW; - - /// `FSPICK_NO_AUTOMOUNT` - const FSPICK_NO_AUTOMOUNT = linux_raw_sys::general::FSPICK_NO_AUTOMOUNT; - - /// `FSPICK_EMPTY_PATH` - const FSPICK_EMPTY_PATH = linux_raw_sys::general::FSPICK_EMPTY_PATH; - - /// <https://docs.rs/bitflags/*/bitflags/#externally-defined-flags> - const _ = !0; - } -} - -bitflags! { - /// `MS_*` constants for use with [`mount_change`]. - /// - /// [`mount_change`]: crate::mount::mount_change - #[repr(transparent)] - #[derive(Copy, Clone, Eq, PartialEq, Hash, Debug)] - pub struct MountPropagationFlags: c::c_uint { - /// `MS_SILENT` - const SILENT = linux_raw_sys::general::MS_SILENT; - /// `MS_SHARED` - const SHARED = linux_raw_sys::general::MS_SHARED; - /// `MS_PRIVATE` - const PRIVATE = linux_raw_sys::general::MS_PRIVATE; - /// `MS_SLAVE` - const SLAVE = linux_raw_sys::general::MS_SLAVE; - /// `MS_UNBINDABLE` - const UNBINDABLE = linux_raw_sys::general::MS_UNBINDABLE; - /// `MS_REC` - const REC = linux_raw_sys::general::MS_REC; - - /// <https://docs.rs/bitflags/*/bitflags/#externally-defined-flags> - const _ = !0; - } -} - -bitflags! { - #[repr(transparent)] - #[derive(Copy, Clone, Eq, PartialEq, Hash, Debug)] - pub(crate) struct InternalMountFlags: c::c_uint { - const REMOUNT = linux_raw_sys::general::MS_REMOUNT; - const MOVE = linux_raw_sys::general::MS_MOVE; - - /// <https://docs.rs/bitflags/*/bitflags/#externally-defined-flags> - const _ = !0; - } -} - -#[repr(transparent)] -pub(crate) struct MountFlagsArg(pub(crate) c::c_uint); diff --git a/vendor/rustix/src/backend/linux_raw/net/addr.rs b/vendor/rustix/src/backend/linux_raw/net/addr.rs deleted file mode 100644 index 85ba875..0000000 --- a/vendor/rustix/src/backend/linux_raw/net/addr.rs +++ /dev/null @@ -1,178 +0,0 @@ -//! Socket address utilities. -//! -//! # Safety -//! -//! This file uses `CStr::from_bytes_with_nul_unchecked` on a string it knows -//! to be NUL-terminated. -#![allow(unsafe_code)] - -use crate::backend::c; -use crate::ffi::CStr; -use crate::{io, path}; -use core::cmp::Ordering; -use core::fmt; -use core::hash::{Hash, Hasher}; -use core::slice; - -/// `struct sockaddr_un` -#[derive(Clone)] -#[doc(alias = "sockaddr_un")] -pub struct SocketAddrUnix { - pub(crate) unix: c::sockaddr_un, - len: c::socklen_t, -} - -impl SocketAddrUnix { - /// Construct a new Unix-domain address from a filesystem path. - #[inline] - pub fn new<P: path::Arg>(path: P) -> io::Result<Self> { - path.into_with_c_str(Self::_new) - } - - #[inline] - fn _new(path: &CStr) -> io::Result<Self> { - let mut unix = Self::init(); - let bytes = path.to_bytes_with_nul(); - if bytes.len() > unix.sun_path.len() { - return Err(io::Errno::NAMETOOLONG); - } - for (i, b) in bytes.iter().enumerate() { - unix.sun_path[i] = *b as _; - } - let len = offsetof_sun_path() + bytes.len(); - let len = len.try_into().unwrap(); - Ok(Self { unix, len }) - } - - /// Construct a new abstract Unix-domain address from a byte slice. - #[inline] - pub fn new_abstract_name(name: &[u8]) -> io::Result<Self> { - let mut unix = Self::init(); - let id = &mut unix.sun_path[1..]; - - // SAFETY: Convert `&mut [c_char]` to `&mut [u8]`. - let id = unsafe { slice::from_raw_parts_mut(id.as_mut_ptr().cast::<u8>(), id.len()) }; - - if let Some(id) = id.get_mut(..name.len()) { - id.copy_from_slice(name); - let len = offsetof_sun_path() + 1 + name.len(); - let len = len.try_into().unwrap(); - Ok(Self { unix, len }) - } else { - Err(io::Errno::NAMETOOLONG) - } - } - - const fn init() -> c::sockaddr_un { - c::sockaddr_un { - sun_family: c::AF_UNIX as _, - sun_path: [0; 108], - } - } - - /// For a filesystem path address, return the path. - #[inline] - pub fn path(&self) -> Option<&CStr> { - let len = self.len(); - if len != 0 && self.unix.sun_path[0] as u8 != b'\0' { - let end = len as usize - offsetof_sun_path(); - let bytes = &self.unix.sun_path[..end]; - - // SAFETY: Convert `&[c_char]` to `&[u8]`. - let bytes = unsafe { slice::from_raw_parts(bytes.as_ptr().cast::<u8>(), bytes.len()) }; - - // SAFETY: `from_bytes_with_nul_unchecked` since the string is - // NUL-terminated. - unsafe { Some(CStr::from_bytes_with_nul_unchecked(bytes)) } - } else { - None - } - } - - /// For an abstract address, return the identifier. - #[inline] - pub fn abstract_name(&self) -> Option<&[u8]> { - let len = self.len(); - if len != 0 && self.unix.sun_path[0] as u8 == b'\0' { - let end = len as usize - offsetof_sun_path(); - let bytes = &self.unix.sun_path[1..end]; - - // SAFETY: Convert `&[c_char]` to `&[u8]`. - let bytes = unsafe { slice::from_raw_parts(bytes.as_ptr().cast::<u8>(), bytes.len()) }; - - Some(bytes) - } else { - None - } - } - - #[inline] - pub(crate) fn addr_len(&self) -> c::socklen_t { - self.len - } - - #[inline] - pub(crate) fn len(&self) -> usize { - self.addr_len() as usize - } -} - -impl PartialEq for SocketAddrUnix { - #[inline] - fn eq(&self, other: &Self) -> bool { - let self_len = self.len() - offsetof_sun_path(); - let other_len = other.len() - offsetof_sun_path(); - self.unix.sun_path[..self_len].eq(&other.unix.sun_path[..other_len]) - } -} - -impl Eq for SocketAddrUnix {} - -impl PartialOrd for SocketAddrUnix { - #[inline] - fn partial_cmp(&self, other: &Self) -> Option<Ordering> { - Some(self.cmp(other)) - } -} - -impl Ord for SocketAddrUnix { - #[inline] - fn cmp(&self, other: &Self) -> Ordering { - let self_len = self.len() - offsetof_sun_path(); - let other_len = other.len() - offsetof_sun_path(); - self.unix.sun_path[..self_len].cmp(&other.unix.sun_path[..other_len]) - } -} - -impl Hash for SocketAddrUnix { - #[inline] - fn hash<H: Hasher>(&self, state: &mut H) { - let self_len = self.len() - offsetof_sun_path(); - self.unix.sun_path[..self_len].hash(state) - } -} - -impl fmt::Debug for SocketAddrUnix { - fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result { - if let Some(path) = self.path() { - path.fmt(fmt) - } else if let Some(name) = self.abstract_name() { - name.fmt(fmt) - } else { - "(unnamed)".fmt(fmt) - } - } -} - -/// `struct sockaddr_storage` as a raw struct. -pub type SocketAddrStorage = c::sockaddr; - -/// Return the offset of the `sun_path` field of `sockaddr_un`. -#[inline] -pub(crate) fn offsetof_sun_path() -> usize { - let z = c::sockaddr_un { - sun_family: 0_u16, - sun_path: [0; 108], - }; - (crate::utils::as_ptr(&z.sun_path) as usize) - (crate::utils::as_ptr(&z) as usize) -} diff --git a/vendor/rustix/src/backend/linux_raw/net/mod.rs b/vendor/rustix/src/backend/linux_raw/net/mod.rs deleted file mode 100644 index f83c546..0000000 --- a/vendor/rustix/src/backend/linux_raw/net/mod.rs +++ /dev/null @@ -1,7 +0,0 @@ -pub(crate) mod addr; -pub(crate) mod msghdr; -pub(crate) mod read_sockaddr; -pub(crate) mod send_recv; -pub(crate) mod sockopt; -pub(crate) mod syscalls; -pub(crate) mod write_sockaddr; diff --git a/vendor/rustix/src/backend/linux_raw/net/msghdr.rs b/vendor/rustix/src/backend/linux_raw/net/msghdr.rs deleted file mode 100644 index 2b88bfb..0000000 --- a/vendor/rustix/src/backend/linux_raw/net/msghdr.rs +++ /dev/null @@ -1,146 +0,0 @@ -//! Utilities for dealing with message headers. -//! -//! These take closures rather than returning a `c::msghdr` directly because -//! the message headers may reference stack-local data. - -#![allow(unsafe_code)] - -use crate::backend::c; -use crate::backend::net::write_sockaddr::{encode_sockaddr_v4, encode_sockaddr_v6}; - -use crate::io::{self, IoSlice, IoSliceMut}; -use crate::net::{RecvAncillaryBuffer, SendAncillaryBuffer, SocketAddrV4, SocketAddrV6}; -use crate::utils::as_ptr; - -use core::mem::{size_of, MaybeUninit}; -use core::ptr::null_mut; - -fn msg_iov_len(len: usize) -> c::size_t { - // This cast cannot overflow. - len as c::size_t -} - -pub(crate) fn msg_control_len(len: usize) -> c::size_t { - // Same as above. - len as c::size_t -} - -/// Create a message header intended to receive a datagram. -pub(crate) fn with_recv_msghdr<R>( - name: &mut MaybeUninit<c::sockaddr_storage>, - iov: &mut [IoSliceMut<'_>], - control: &mut RecvAncillaryBuffer<'_>, - f: impl FnOnce(&mut c::msghdr) -> io::Result<R>, -) -> io::Result<R> { - control.clear(); - - let namelen = size_of::<c::sockaddr_storage>() as c::c_int; - let mut msghdr = c::msghdr { - msg_name: name.as_mut_ptr().cast(), - msg_namelen: namelen, - msg_iov: iov.as_mut_ptr().cast(), - msg_iovlen: msg_iov_len(iov.len()), - msg_control: control.as_control_ptr().cast(), - msg_controllen: msg_control_len(control.control_len()), - msg_flags: 0, - }; - - let res = f(&mut msghdr); - - // Reset the control length. - if res.is_ok() { - unsafe { - control.set_control_len(msghdr.msg_controllen.try_into().unwrap_or(usize::MAX)); - } - } - - res -} - -/// Create a message header intended to send without an address. -pub(crate) fn with_noaddr_msghdr<R>( - iov: &[IoSlice<'_>], - control: &mut SendAncillaryBuffer<'_, '_, '_>, - f: impl FnOnce(c::msghdr) -> R, -) -> R { - f(c::msghdr { - msg_name: null_mut(), - msg_namelen: 0, - msg_iov: iov.as_ptr() as _, - msg_iovlen: msg_iov_len(iov.len()), - msg_control: control.as_control_ptr().cast(), - msg_controllen: msg_control_len(control.control_len()), - msg_flags: 0, - }) -} - -/// Create a message header intended to send with an IPv4 address. -pub(crate) fn with_v4_msghdr<R>( - addr: &SocketAddrV4, - iov: &[IoSlice<'_>], - control: &mut SendAncillaryBuffer<'_, '_, '_>, - f: impl FnOnce(c::msghdr) -> R, -) -> R { - let encoded = encode_sockaddr_v4(addr); - - f(c::msghdr { - msg_name: as_ptr(&encoded) as _, - msg_namelen: size_of::<SocketAddrV4>() as _, - msg_iov: iov.as_ptr() as _, - msg_iovlen: msg_iov_len(iov.len()), - msg_control: control.as_control_ptr().cast(), - msg_controllen: msg_control_len(control.control_len()), - msg_flags: 0, - }) -} - -/// Create a message header intended to send with an IPv6 address. -pub(crate) fn with_v6_msghdr<R>( - addr: &SocketAddrV6, - iov: &[IoSlice<'_>], - control: &mut SendAncillaryBuffer<'_, '_, '_>, - f: impl FnOnce(c::msghdr) -> R, -) -> R { - let encoded = encode_sockaddr_v6(addr); - - f(c::msghdr { - msg_name: as_ptr(&encoded) as _, - msg_namelen: size_of::<SocketAddrV6>() as _, - msg_iov: iov.as_ptr() as _, - msg_iovlen: msg_iov_len(iov.len()), - msg_control: control.as_control_ptr().cast(), - msg_controllen: msg_control_len(control.control_len()), - msg_flags: 0, - }) -} - -/// Create a message header intended to send with a Unix address. -pub(crate) fn with_unix_msghdr<R>( - addr: &crate::net::SocketAddrUnix, - iov: &[IoSlice<'_>], - control: &mut SendAncillaryBuffer<'_, '_, '_>, - f: impl FnOnce(c::msghdr) -> R, -) -> R { - f(c::msghdr { - msg_name: as_ptr(&addr.unix) as _, - msg_namelen: addr.addr_len() as _, - msg_iov: iov.as_ptr() as _, - msg_iovlen: msg_iov_len(iov.len()), - msg_control: control.as_control_ptr().cast(), - msg_controllen: msg_control_len(control.control_len()), - msg_flags: 0, - }) -} - -/// Create a zero-initialized message header struct value. -pub(crate) fn zero_msghdr() -> c::msghdr { - c::msghdr { - msg_name: null_mut(), - msg_namelen: 0, - msg_iov: null_mut(), - msg_iovlen: 0, - msg_control: null_mut(), - msg_controllen: 0, - msg_flags: 0, - } -} diff --git a/vendor/rustix/src/backend/linux_raw/net/read_sockaddr.rs b/vendor/rustix/src/backend/linux_raw/net/read_sockaddr.rs deleted file mode 100644 index 5a91707..0000000 --- a/vendor/rustix/src/backend/linux_raw/net/read_sockaddr.rs +++ /dev/null @@ -1,195 +0,0 @@ -//! The BSD sockets API requires us to read the `ss_family` field before we can -//! interpret the rest of a `sockaddr` produced by the kernel. -#![allow(unsafe_code)] - -use crate::backend::c; -use crate::io; -use crate::net::{Ipv4Addr, Ipv6Addr, SocketAddrAny, SocketAddrUnix, SocketAddrV4, SocketAddrV6}; -use core::mem::size_of; -use core::slice; - -// This must match the header of `sockaddr`. -#[repr(C)] -struct sockaddr_header { - ss_family: u16, -} - -/// Read the `ss_family` field from a socket address returned from the OS. -/// -/// # Safety -/// -/// `storage` must point to a valid socket address returned from the OS. -#[inline] -unsafe fn read_ss_family(storage: *const c::sockaddr) -> u16 { - // Assert that we know the layout of `sockaddr`. - let _ = c::sockaddr { - __storage: c::sockaddr_storage { - __bindgen_anon_1: linux_raw_sys::net::__kernel_sockaddr_storage__bindgen_ty_1 { - __bindgen_anon_1: - linux_raw_sys::net::__kernel_sockaddr_storage__bindgen_ty_1__bindgen_ty_1 { - ss_family: 0_u16, - __data: [0; 126_usize], - }, - }, - }, - }; - - (*storage.cast::<sockaddr_header>()).ss_family -} - -/// Set the `ss_family` field of a socket address to `AF_UNSPEC`, so that we -/// can test for `AF_UNSPEC` to test whether it was stored to. -#[inline] -pub(crate) unsafe fn initialize_family_to_unspec(storage: *mut c::sockaddr) { - (*storage.cast::<sockaddr_header>()).ss_family = c::AF_UNSPEC as _; -} - -/// Read a socket address encoded in a platform-specific format. -/// -/// # Safety -/// -/// `storage` must point to valid socket address storage. -pub(crate) unsafe fn read_sockaddr( - storage: *const c::sockaddr, - len: usize, -) -> io::Result<SocketAddrAny> { - let offsetof_sun_path = super::addr::offsetof_sun_path(); - - if len < size_of::<c::sa_family_t>() { - return Err(io::Errno::INVAL); - } - match read_ss_family(storage).into() { - c::AF_INET => { - if len < size_of::<c::sockaddr_in>() { - return Err(io::Errno::INVAL); - } - let decode = &*storage.cast::<c::sockaddr_in>(); - Ok(SocketAddrAny::V4(SocketAddrV4::new( - Ipv4Addr::from(u32::from_be(decode.sin_addr.s_addr)), - u16::from_be(decode.sin_port), - ))) - } - c::AF_INET6 => { - if len < size_of::<c::sockaddr_in6>() { - return Err(io::Errno::INVAL); - } - let decode = &*storage.cast::<c::sockaddr_in6>(); - Ok(SocketAddrAny::V6(SocketAddrV6::new( - Ipv6Addr::from(decode.sin6_addr.in6_u.u6_addr8), - u16::from_be(decode.sin6_port), - u32::from_be(decode.sin6_flowinfo), - decode.sin6_scope_id, - ))) - } - c::AF_UNIX => { - if len < offsetof_sun_path { - return Err(io::Errno::INVAL); - } - if len == offsetof_sun_path { - Ok(SocketAddrAny::Unix(SocketAddrUnix::new(&[][..])?)) - } else { - let decode = &*storage.cast::<c::sockaddr_un>(); - - // On Linux check for Linux's [abstract namespace]. - // - // [abstract namespace]: https://man7.org/linux/man-pages/man7/unix.7.html - if decode.sun_path[0] == 0 { - let bytes = &decode.sun_path[1..len - offsetof_sun_path]; - - // SAFETY: Convert `&[c_char]` to `&[u8]`. - let bytes = slice::from_raw_parts(bytes.as_ptr().cast::<u8>(), bytes.len()); - - return SocketAddrUnix::new_abstract_name(bytes).map(SocketAddrAny::Unix); - } - - // Otherwise we expect a NUL-terminated filesystem path. - let bytes = &decode.sun_path[..len - 1 - offsetof_sun_path]; - - // SAFETY: Convert `&[c_char]` to `&[u8]`. - let bytes = slice::from_raw_parts(bytes.as_ptr().cast::<u8>(), bytes.len()); - - assert_eq!(decode.sun_path[len - 1 - offsetof_sun_path], 0); - Ok(SocketAddrAny::Unix(SocketAddrUnix::new(bytes)?)) - } - } - _ => Err(io::Errno::NOTSUP), - } -} - -/// Read an optional socket address returned from the OS. -/// -/// # Safety -/// -/// `storage` must point to a valid socket address returned from the OS. -pub(crate) unsafe fn maybe_read_sockaddr_os( - storage: *const c::sockaddr, - len: usize, -) -> Option<SocketAddrAny> { - if len == 0 { - None - } else { - Some(read_sockaddr_os(storage, len)) - } -} - -/// Read a socket address returned from the OS. -/// -/// # Safety -/// -/// `storage` must point to a valid socket address returned from the OS. -pub(crate) unsafe fn read_sockaddr_os(storage: *const c::sockaddr, len: usize) -> SocketAddrAny { - let offsetof_sun_path = super::addr::offsetof_sun_path(); - - assert!(len >= size_of::<c::sa_family_t>()); - match read_ss_family(storage).into() { - c::AF_INET => { - assert!(len >= size_of::<c::sockaddr_in>()); - let decode = &*storage.cast::<c::sockaddr_in>(); - SocketAddrAny::V4(SocketAddrV4::new( - Ipv4Addr::from(u32::from_be(decode.sin_addr.s_addr)), - u16::from_be(decode.sin_port), - )) - } - c::AF_INET6 => { - assert!(len >= size_of::<c::sockaddr_in6>()); - let decode = &*storage.cast::<c::sockaddr_in6>(); - SocketAddrAny::V6(SocketAddrV6::new( - Ipv6Addr::from(decode.sin6_addr.in6_u.u6_addr8), - u16::from_be(decode.sin6_port), - u32::from_be(decode.sin6_flowinfo), - decode.sin6_scope_id, - )) - } - c::AF_UNIX => { - assert!(len >= offsetof_sun_path); - if len == offsetof_sun_path { - SocketAddrAny::Unix(SocketAddrUnix::new(&[][..]).unwrap()) - } else { - let decode = &*storage.cast::<c::sockaddr_un>(); - - // On Linux check for Linux's [abstract namespace]. - // - // [abstract namespace]: https://man7.org/linux/man-pages/man7/unix.7.html - if decode.sun_path[0] == 0 { - let bytes = &decode.sun_path[1..len - offsetof_sun_path]; - - // SAFETY: Convert `&[c_char]` to `&[u8]`. - let bytes = slice::from_raw_parts(bytes.as_ptr().cast::<u8>(), bytes.len()); - - return SocketAddrAny::Unix(SocketAddrUnix::new_abstract_name(bytes).unwrap()); - } - - // Otherwise we expect a NUL-terminated filesystem path. - assert_eq!(decode.sun_path[len - 1 - offsetof_sun_path], 0); - - let bytes = &decode.sun_path[..len - 1 - offsetof_sun_path]; - - // SAFETY: Convert `&[c_char]` to `&[u8]`. - let bytes = slice::from_raw_parts(bytes.as_ptr().cast::<u8>(), bytes.len()); - - SocketAddrAny::Unix(SocketAddrUnix::new(bytes).unwrap()) - } - } - other => unimplemented!("{:?}", other), - } -} diff --git a/vendor/rustix/src/backend/linux_raw/net/send_recv.rs b/vendor/rustix/src/backend/linux_raw/net/send_recv.rs deleted file mode 100644 index d5cdd07..0000000 --- a/vendor/rustix/src/backend/linux_raw/net/send_recv.rs +++ /dev/null @@ -1,60 +0,0 @@ -use crate::backend::c; -use bitflags::bitflags; - -bitflags! { - /// `MSG_*` flags for use with [`send`], [`send_to`], and related - /// functions. - /// - /// [`send`]: crate::net::send - /// [`sendto`]: crate::net::sendto - #[repr(transparent)] - #[derive(Copy, Clone, Eq, PartialEq, Hash, Debug)] - pub struct SendFlags: u32 { - /// `MSG_CONFIRM` - const CONFIRM = c::MSG_CONFIRM; - /// `MSG_DONTROUTE` - const DONTROUTE = c::MSG_DONTROUTE; - /// `MSG_DONTWAIT` - const DONTWAIT = c::MSG_DONTWAIT; - /// `MSG_EOT` - const EOT = c::MSG_EOR; - /// `MSG_MORE` - const MORE = c::MSG_MORE; - /// `MSG_NOSIGNAL` - const NOSIGNAL = c::MSG_NOSIGNAL; - /// `MSG_OOB` - const OOB = c::MSG_OOB; - - /// <https://docs.rs/bitflags/*/bitflags/#externally-defined-flags> - const _ = !0; - } -} - -bitflags! { - /// `MSG_*` flags for use with [`recv`], [`recvfrom`], and related - /// functions. - /// - /// [`recv`]: crate::net::recv - /// [`recvfrom`]: crate::net::recvfrom - #[repr(transparent)] - #[derive(Copy, Clone, Eq, PartialEq, Hash, Debug)] - pub struct RecvFlags: u32 { - /// `MSG_CMSG_CLOEXEC` - const CMSG_CLOEXEC = c::MSG_CMSG_CLOEXEC; - /// `MSG_DONTWAIT` - const DONTWAIT = c::MSG_DONTWAIT; - /// `MSG_ERRQUEUE` - const ERRQUEUE = c::MSG_ERRQUEUE; - /// `MSG_OOB` - const OOB = c::MSG_OOB; - /// `MSG_PEEK` - const PEEK = c::MSG_PEEK; - /// `MSG_TRUNC` - const TRUNC = c::MSG_TRUNC; - /// `MSG_WAITALL` - const WAITALL = c::MSG_WAITALL; - - /// <https://docs.rs/bitflags/*/bitflags/#externally-defined-flags> - const _ = !0; - } -} diff --git a/vendor/rustix/src/backend/linux_raw/net/sockopt.rs b/vendor/rustix/src/backend/linux_raw/net/sockopt.rs deleted file mode 100644 index 6a740bb..0000000 --- a/vendor/rustix/src/backend/linux_raw/net/sockopt.rs +++ /dev/null @@ -1,879 +0,0 @@ -//! linux_raw syscalls supporting `rustix::net::sockopt`. -//! -//! # Safety -//! -//! See the `rustix::backend` module documentation for details. -#![allow(unsafe_code, clippy::undocumented_unsafe_blocks)] - -use crate::backend::c; -use crate::backend::conv::{by_mut, c_uint, ret, socklen_t}; -use crate::fd::BorrowedFd; -#[cfg(feature = "alloc")] -use crate::ffi::CStr; -use crate::io; -use crate::net::sockopt::Timeout; -use crate::net::{ - AddressFamily, Ipv4Addr, Ipv6Addr, Protocol, RawProtocol, SocketAddrAny, SocketAddrStorage, - SocketAddrV4, SocketAddrV6, SocketType, UCred, -}; -#[cfg(feature = "alloc")] -use alloc::borrow::ToOwned; -#[cfg(feature = "alloc")] -use alloc::string::String; -use core::mem::MaybeUninit; -use core::time::Duration; -use linux_raw_sys::general::{__kernel_old_timeval, __kernel_sock_timeval}; -#[cfg(target_arch = "x86")] -use { - crate::backend::conv::{slice_just_addr, x86_sys}, - crate::backend::reg::{ArgReg, SocketArg}, - linux_raw_sys::net::{SYS_GETSOCKOPT, SYS_SETSOCKOPT}, -}; - -#[inline] -fn getsockopt<T: Copy>(fd: BorrowedFd<'_>, level: u32, optname: u32) -> io::Result<T> { - let mut optlen: c::socklen_t = core::mem::size_of::<T>().try_into().unwrap(); - debug_assert!( - optlen as usize >= core::mem::size_of::<c::c_int>(), - "Socket APIs don't ever use `bool` directly" - ); - - let mut value = MaybeUninit::<T>::uninit(); - getsockopt_raw(fd, level, optname, &mut value, &mut optlen)?; - - assert_eq!( - optlen as usize, - core::mem::size_of::<T>(), - "unexpected getsockopt size" - ); - - unsafe { Ok(value.assume_init()) } -} - -#[inline] -fn getsockopt_raw<T>( - fd: BorrowedFd<'_>, - level: u32, - optname: u32, - value: &mut MaybeUninit<T>, - optlen: &mut c::socklen_t, -) -> io::Result<()> { - #[cfg(not(target_arch = "x86"))] - unsafe { - ret(syscall!( - __NR_getsockopt, - fd, - c_uint(level), - c_uint(optname), - value, - by_mut(optlen) - )) - } - #[cfg(target_arch = "x86")] - unsafe { - ret(syscall!( - __NR_socketcall, - x86_sys(SYS_GETSOCKOPT), - slice_just_addr::<ArgReg<'_, SocketArg>, _>(&[ - fd.into(), - c_uint(level), - c_uint(optname), - value.into(), - by_mut(optlen), - ]) - )) - } -} - -#[inline] -fn setsockopt<T: Copy>(fd: BorrowedFd<'_>, level: u32, optname: u32, value: T) -> io::Result<()> { - let optlen = core::mem::size_of::<T>().try_into().unwrap(); - debug_assert!( - optlen as usize >= core::mem::size_of::<c::c_int>(), - "Socket APIs don't ever use `bool` directly" - ); - setsockopt_raw(fd, level, optname, &value, optlen) -} - -#[inline] -fn setsockopt_raw<T>( - fd: BorrowedFd<'_>, - level: u32, - optname: u32, - ptr: *const T, - optlen: c::socklen_t, -) -> io::Result<()> { - #[cfg(not(target_arch = "x86"))] - unsafe { - ret(syscall_readonly!( - __NR_setsockopt, - fd, - c_uint(level), - c_uint(optname), - ptr, - socklen_t(optlen) - )) - } - #[cfg(target_arch = "x86")] - unsafe { - ret(syscall_readonly!( - __NR_socketcall, - x86_sys(SYS_SETSOCKOPT), - slice_just_addr::<ArgReg<'_, SocketArg>, _>(&[ - fd.into(), - c_uint(level), - c_uint(optname), - ptr.into(), - socklen_t(optlen), - ]) - )) - } -} - -#[inline] -pub(crate) fn get_socket_type(fd: BorrowedFd<'_>) -> io::Result<SocketType> { - getsockopt(fd, c::SOL_SOCKET, c::SO_TYPE) -} - -#[inline] -pub(crate) fn set_socket_reuseaddr(fd: BorrowedFd<'_>, reuseaddr: bool) -> io::Result<()> { - setsockopt(fd, c::SOL_SOCKET, c::SO_REUSEADDR, from_bool(reuseaddr)) -} - -#[inline] -pub(crate) fn get_socket_reuseaddr(fd: BorrowedFd<'_>) -> io::Result<bool> { - getsockopt(fd, c::SOL_SOCKET, c::SO_REUSEADDR).map(to_bool) -} - -#[inline] -pub(crate) fn set_socket_broadcast(fd: BorrowedFd<'_>, broadcast: bool) -> io::Result<()> { - setsockopt(fd, c::SOL_SOCKET, c::SO_BROADCAST, from_bool(broadcast)) -} - -#[inline] -pub(crate) fn get_socket_broadcast(fd: BorrowedFd<'_>) -> io::Result<bool> { - getsockopt(fd, c::SOL_SOCKET, c::SO_BROADCAST).map(to_bool) -} - -#[inline] -pub(crate) fn set_socket_linger(fd: BorrowedFd<'_>, linger: Option<Duration>) -> io::Result<()> { - // Convert `linger` to seconds, rounding up. - let l_linger = if let Some(linger) = linger { - duration_to_secs(linger)? - } else { - 0 - }; - let linger = c::linger { - l_onoff: c::c_int::from(linger.is_some()), - l_linger, - }; - setsockopt(fd, c::SOL_SOCKET, c::SO_LINGER, linger) -} - -#[inline] -pub(crate) fn get_socket_linger(fd: BorrowedFd<'_>) -> io::Result<Option<Duration>> { - let linger: c::linger = getsockopt(fd, c::SOL_SOCKET, c::SO_LINGER)?; - Ok((linger.l_onoff != 0).then(|| Duration::from_secs(linger.l_linger as u64))) -} - -#[inline] -pub(crate) fn set_socket_passcred(fd: BorrowedFd<'_>, passcred: bool) -> io::Result<()> { - setsockopt(fd, c::SOL_SOCKET, c::SO_PASSCRED, from_bool(passcred)) -} - -#[inline] -pub(crate) fn get_socket_passcred(fd: BorrowedFd<'_>) -> io::Result<bool> { - getsockopt(fd, c::SOL_SOCKET, c::SO_PASSCRED).map(to_bool) -} - -#[inline] -pub(crate) fn set_socket_timeout( - fd: BorrowedFd<'_>, - id: Timeout, - timeout: Option<Duration>, -) -> io::Result<()> { - let time = duration_to_linux_sock_timeval(timeout)?; - let optname = match id { - Timeout::Recv => c::SO_RCVTIMEO_NEW, - Timeout::Send => c::SO_SNDTIMEO_NEW, - }; - match setsockopt(fd, c::SOL_SOCKET, optname, time) { - Err(io::Errno::NOPROTOOPT) if c::SO_RCVTIMEO_NEW != c::SO_RCVTIMEO_OLD => { - set_socket_timeout_old(fd, id, timeout) - } - otherwise => otherwise, - } -} - -/// Same as `set_socket_timeout` but uses `__kernel_old_timeval` instead of -/// `__kernel_sock_timeval` and `_OLD` constants instead of `_NEW`. -fn set_socket_timeout_old( - fd: BorrowedFd<'_>, - id: Timeout, - timeout: Option<Duration>, -) -> io::Result<()> { - let time = duration_to_linux_old_timeval(timeout)?; - let optname = match id { - Timeout::Recv => c::SO_RCVTIMEO_OLD, - Timeout::Send => c::SO_SNDTIMEO_OLD, - }; - setsockopt(fd, c::SOL_SOCKET, optname, time) -} - -#[inline] -pub(crate) fn get_socket_timeout(fd: BorrowedFd<'_>, id: Timeout) -> io::Result<Option<Duration>> { - let optname = match id { - Timeout::Recv => c::SO_RCVTIMEO_NEW, - Timeout::Send => c::SO_SNDTIMEO_NEW, - }; - let time: __kernel_sock_timeval = match getsockopt(fd, c::SOL_SOCKET, optname) { - Err(io::Errno::NOPROTOOPT) if c::SO_RCVTIMEO_NEW != c::SO_RCVTIMEO_OLD => { - return get_socket_timeout_old(fd, id) - } - otherwise => otherwise?, - }; - Ok(duration_from_linux_sock_timeval(time)) -} - -/// Same as `get_socket_timeout` but uses `__kernel_old_timeval` instead of -/// `__kernel_sock_timeval` and `_OLD` constants instead of `_NEW`. -fn get_socket_timeout_old(fd: BorrowedFd<'_>, id: Timeout) -> io::Result<Option<Duration>> { - let optname = match id { - Timeout::Recv => c::SO_RCVTIMEO_OLD, - Timeout::Send => c::SO_SNDTIMEO_OLD, - }; - let time: __kernel_old_timeval = getsockopt(fd, c::SOL_SOCKET, optname)?; - Ok(duration_from_linux_old_timeval(time)) -} - -/// Convert a `__linux_sock_timeval` to a Rust `Option<Duration>`. -#[inline] -fn duration_from_linux_sock_timeval(time: __kernel_sock_timeval) -> Option<Duration> { - if time.tv_sec == 0 && time.tv_usec == 0 { - None - } else { - Some(Duration::from_secs(time.tv_sec as u64) + Duration::from_micros(time.tv_usec as u64)) - } -} - -/// Like `duration_from_linux` but uses Linux's old 32-bit -/// `__kernel_old_timeval`. -fn duration_from_linux_old_timeval(time: __kernel_old_timeval) -> Option<Duration> { - if time.tv_sec == 0 && time.tv_usec == 0 { - None - } else { - Some(Duration::from_secs(time.tv_sec as u64) + Duration::from_micros(time.tv_usec as u64)) - } -} - -/// Convert a Rust `Option<Duration>` to a `__kernel_sock_timeval`. -#[inline] -fn duration_to_linux_sock_timeval(timeout: Option<Duration>) -> io::Result<__kernel_sock_timeval> { - Ok(match timeout { - Some(timeout) => { - if timeout == Duration::ZERO { - return Err(io::Errno::INVAL); - } - // `subsec_micros` rounds down, so we use `subsec_nanos` and - // manually round up. - let mut timeout = __kernel_sock_timeval { - tv_sec: timeout.as_secs().try_into().unwrap_or(i64::MAX), - tv_usec: ((timeout.subsec_nanos() + 999) / 1000) as _, - }; - if timeout.tv_sec == 0 && timeout.tv_usec == 0 { - timeout.tv_usec = 1; - } - timeout - } - None => __kernel_sock_timeval { - tv_sec: 0, - tv_usec: 0, - }, - }) -} - -/// Like `duration_to_linux` but uses Linux's old 32-bit -/// `__kernel_old_timeval`. -fn duration_to_linux_old_timeval(timeout: Option<Duration>) -> io::Result<__kernel_old_timeval> { - Ok(match timeout { - Some(timeout) => { - if timeout == Duration::ZERO { - return Err(io::Errno::INVAL); - } - - // `subsec_micros` rounds down, so we use `subsec_nanos` and - // manually round up. - let mut timeout = __kernel_old_timeval { - tv_sec: timeout.as_secs().try_into().unwrap_or(c::c_long::MAX), - tv_usec: ((timeout.subsec_nanos() + 999) / 1000) as _, - }; - if timeout.tv_sec == 0 && timeout.tv_usec == 0 { - timeout.tv_usec = 1; - } - timeout - } - None => __kernel_old_timeval { - tv_sec: 0, - tv_usec: 0, - }, - }) -} - -#[inline] -pub(crate) fn get_socket_error(fd: BorrowedFd<'_>) -> io::Result<Result<(), io::Errno>> { - let err: c::c_int = getsockopt(fd, c::SOL_SOCKET, c::SO_ERROR)?; - Ok(if err == 0 { - Ok(()) - } else { - Err(io::Errno::from_raw_os_error(err)) - }) -} - -#[inline] -pub(crate) fn set_socket_keepalive(fd: BorrowedFd<'_>, keepalive: bool) -> io::Result<()> { - setsockopt(fd, c::SOL_SOCKET, c::SO_KEEPALIVE, from_bool(keepalive)) -} - -#[inline] -pub(crate) fn get_socket_keepalive(fd: BorrowedFd<'_>) -> io::Result<bool> { - getsockopt(fd, c::SOL_SOCKET, c::SO_KEEPALIVE).map(to_bool) -} - -#[inline] -pub(crate) fn set_socket_recv_buffer_size(fd: BorrowedFd<'_>, size: usize) -> io::Result<()> { - let size: c::c_int = size.try_into().map_err(|_| io::Errno::INVAL)?; - setsockopt(fd, c::SOL_SOCKET, c::SO_RCVBUF, size) -} - -#[inline] -pub(crate) fn get_socket_recv_buffer_size(fd: BorrowedFd<'_>) -> io::Result<usize> { - getsockopt(fd, c::SOL_SOCKET, c::SO_RCVBUF).map(|size: u32| size as usize) -} - -#[inline] -pub(crate) fn set_socket_send_buffer_size(fd: BorrowedFd<'_>, size: usize) -> io::Result<()> { - let size: c::c_int = size.try_into().map_err(|_| io::Errno::INVAL)?; - setsockopt(fd, c::SOL_SOCKET, c::SO_SNDBUF, size) -} - -#[inline] -pub(crate) fn get_socket_send_buffer_size(fd: BorrowedFd<'_>) -> io::Result<usize> { - getsockopt(fd, c::SOL_SOCKET, c::SO_SNDBUF).map(|size: u32| size as usize) -} - -#[inline] -pub(crate) fn get_socket_domain(fd: BorrowedFd<'_>) -> io::Result<AddressFamily> { - let domain: c::c_int = getsockopt(fd, c::SOL_SOCKET, c::SO_DOMAIN)?; - Ok(AddressFamily( - domain.try_into().map_err(|_| io::Errno::OPNOTSUPP)?, - )) -} - -#[inline] -pub(crate) fn get_socket_acceptconn(fd: BorrowedFd<'_>) -> io::Result<bool> { - getsockopt(fd, c::SOL_SOCKET, c::SO_ACCEPTCONN).map(to_bool) -} - -#[inline] -pub(crate) fn set_socket_oobinline(fd: BorrowedFd<'_>, value: bool) -> io::Result<()> { - setsockopt(fd, c::SOL_SOCKET, c::SO_OOBINLINE, from_bool(value)) -} - -#[inline] -pub(crate) fn get_socket_oobinline(fd: BorrowedFd<'_>) -> io::Result<bool> { - getsockopt(fd, c::SOL_SOCKET, c::SO_OOBINLINE).map(to_bool) -} - -#[inline] -pub(crate) fn set_socket_reuseport(fd: BorrowedFd<'_>, value: bool) -> io::Result<()> { - setsockopt(fd, c::SOL_SOCKET, c::SO_REUSEPORT, from_bool(value)) -} - -#[inline] -pub(crate) fn get_socket_reuseport(fd: BorrowedFd<'_>) -> io::Result<bool> { - getsockopt(fd, c::SOL_SOCKET, c::SO_REUSEPORT).map(to_bool) -} - -#[inline] -pub(crate) fn get_socket_protocol(fd: BorrowedFd<'_>) -> io::Result<Option<Protocol>> { - getsockopt(fd, c::SOL_SOCKET, c::SO_PROTOCOL) - .map(|raw: u32| RawProtocol::new(raw).map(Protocol::from_raw)) -} - -#[inline] -pub(crate) fn get_socket_cookie(fd: BorrowedFd<'_>) -> io::Result<u64> { - getsockopt(fd, c::SOL_SOCKET, c::SO_COOKIE) -} - -#[inline] -pub(crate) fn get_socket_incoming_cpu(fd: BorrowedFd<'_>) -> io::Result<u32> { - getsockopt(fd, c::SOL_SOCKET, c::SO_INCOMING_CPU) -} - -#[inline] -pub(crate) fn set_socket_incoming_cpu(fd: BorrowedFd<'_>, value: u32) -> io::Result<()> { - setsockopt(fd, c::SOL_SOCKET, c::SO_INCOMING_CPU, value) -} - -#[inline] -pub(crate) fn set_ip_ttl(fd: BorrowedFd<'_>, ttl: u32) -> io::Result<()> { - setsockopt(fd, c::IPPROTO_IP, c::IP_TTL, ttl) -} - -#[inline] -pub(crate) fn get_ip_ttl(fd: BorrowedFd<'_>) -> io::Result<u32> { - getsockopt(fd, c::IPPROTO_IP, c::IP_TTL) -} - -#[inline] -pub(crate) fn set_ipv6_v6only(fd: BorrowedFd<'_>, only_v6: bool) -> io::Result<()> { - setsockopt(fd, c::IPPROTO_IPV6, c::IPV6_V6ONLY, from_bool(only_v6)) -} - -#[inline] -pub(crate) fn get_ipv6_v6only(fd: BorrowedFd<'_>) -> io::Result<bool> { - getsockopt(fd, c::IPPROTO_IPV6, c::IPV6_V6ONLY).map(to_bool) -} - -#[inline] -pub(crate) fn set_ip_multicast_loop(fd: BorrowedFd<'_>, multicast_loop: bool) -> io::Result<()> { - setsockopt( - fd, - c::IPPROTO_IP, - c::IP_MULTICAST_LOOP, - from_bool(multicast_loop), - ) -} - -#[inline] -pub(crate) fn get_ip_multicast_loop(fd: BorrowedFd<'_>) -> io::Result<bool> { - getsockopt(fd, c::IPPROTO_IP, c::IP_MULTICAST_LOOP).map(to_bool) -} - -#[inline] -pub(crate) fn set_ip_multicast_ttl(fd: BorrowedFd<'_>, multicast_ttl: u32) -> io::Result<()> { - setsockopt(fd, c::IPPROTO_IP, c::IP_MULTICAST_TTL, multicast_ttl) -} - -#[inline] -pub(crate) fn get_ip_multicast_ttl(fd: BorrowedFd<'_>) -> io::Result<u32> { - getsockopt(fd, c::IPPROTO_IP, c::IP_MULTICAST_TTL) -} - -#[inline] -pub(crate) fn set_ipv6_multicast_loop(fd: BorrowedFd<'_>, multicast_loop: bool) -> io::Result<()> { - setsockopt( - fd, - c::IPPROTO_IPV6, - c::IPV6_MULTICAST_LOOP, - from_bool(multicast_loop), - ) -} - -#[inline] -pub(crate) fn get_ipv6_multicast_loop(fd: BorrowedFd<'_>) -> io::Result<bool> { - getsockopt(fd, c::IPPROTO_IPV6, c::IPV6_MULTICAST_LOOP).map(to_bool) -} - -#[inline] -pub(crate) fn set_ipv6_multicast_hops(fd: BorrowedFd<'_>, multicast_hops: u32) -> io::Result<()> { - setsockopt(fd, c::IPPROTO_IP, c::IPV6_MULTICAST_HOPS, multicast_hops) -} - -#[inline] -pub(crate) fn get_ipv6_multicast_hops(fd: BorrowedFd<'_>) -> io::Result<u32> { - getsockopt(fd, c::IPPROTO_IP, c::IPV6_MULTICAST_HOPS) -} - -#[inline] -pub(crate) fn set_ip_add_membership( - fd: BorrowedFd<'_>, - multiaddr: &Ipv4Addr, - interface: &Ipv4Addr, -) -> io::Result<()> { - let mreq = to_ip_mreq(multiaddr, interface); - setsockopt(fd, c::IPPROTO_IP, c::IP_ADD_MEMBERSHIP, mreq) -} - -#[inline] -pub(crate) fn set_ip_add_membership_with_ifindex( - fd: BorrowedFd<'_>, - multiaddr: &Ipv4Addr, - address: &Ipv4Addr, - ifindex: i32, -) -> io::Result<()> { - let mreqn = to_ip_mreqn(multiaddr, address, ifindex); - setsockopt(fd, c::IPPROTO_IP, c::IP_ADD_MEMBERSHIP, mreqn) -} - -#[inline] -pub(crate) fn set_ip_add_source_membership( - fd: BorrowedFd<'_>, - multiaddr: &Ipv4Addr, - interface: &Ipv4Addr, - sourceaddr: &Ipv4Addr, -) -> io::Result<()> { - let mreq_source = to_imr_source(multiaddr, interface, sourceaddr); - setsockopt(fd, c::IPPROTO_IP, c::IP_ADD_SOURCE_MEMBERSHIP, mreq_source) -} - -#[inline] -pub(crate) fn set_ip_drop_source_membership( - fd: BorrowedFd<'_>, - multiaddr: &Ipv4Addr, - interface: &Ipv4Addr, - sourceaddr: &Ipv4Addr, -) -> io::Result<()> { - let mreq_source = to_imr_source(multiaddr, interface, sourceaddr); - setsockopt(fd, c::IPPROTO_IP, c::IP_DROP_SOURCE_MEMBERSHIP, mreq_source) -} - -#[inline] -pub(crate) fn set_ipv6_add_membership( - fd: BorrowedFd<'_>, - multiaddr: &Ipv6Addr, - interface: u32, -) -> io::Result<()> { - let mreq = to_ipv6mr(multiaddr, interface); - setsockopt(fd, c::IPPROTO_IPV6, c::IPV6_ADD_MEMBERSHIP, mreq) -} - -#[inline] -pub(crate) fn set_ip_drop_membership( - fd: BorrowedFd<'_>, - multiaddr: &Ipv4Addr, - interface: &Ipv4Addr, -) -> io::Result<()> { - let mreq = to_ip_mreq(multiaddr, interface); - setsockopt(fd, c::IPPROTO_IP, c::IP_DROP_MEMBERSHIP, mreq) -} - -#[inline] -pub(crate) fn set_ip_drop_membership_with_ifindex( - fd: BorrowedFd<'_>, - multiaddr: &Ipv4Addr, - address: &Ipv4Addr, - ifindex: i32, -) -> io::Result<()> { - let mreqn = to_ip_mreqn(multiaddr, address, ifindex); - setsockopt(fd, c::IPPROTO_IP, c::IP_DROP_MEMBERSHIP, mreqn) -} - -#[inline] -pub(crate) fn set_ipv6_drop_membership( - fd: BorrowedFd<'_>, - multiaddr: &Ipv6Addr, - interface: u32, -) -> io::Result<()> { - let mreq = to_ipv6mr(multiaddr, interface); - setsockopt(fd, c::IPPROTO_IPV6, c::IPV6_DROP_MEMBERSHIP, mreq) -} - -#[inline] -pub(crate) fn get_ipv6_unicast_hops(fd: BorrowedFd<'_>) -> io::Result<u8> { - getsockopt(fd, c::IPPROTO_IPV6, c::IPV6_UNICAST_HOPS).map(|hops: c::c_int| hops as u8) -} - -#[inline] -pub(crate) fn set_ipv6_unicast_hops(fd: BorrowedFd<'_>, hops: Option<u8>) -> io::Result<()> { - let hops = match hops { - Some(hops) => hops.into(), - None => -1, - }; - setsockopt(fd, c::IPPROTO_IPV6, c::IPV6_UNICAST_HOPS, hops) -} - -#[inline] -pub(crate) fn set_ip_tos(fd: BorrowedFd<'_>, value: u8) -> io::Result<()> { - setsockopt(fd, c::IPPROTO_IP, c::IP_TOS, i32::from(value)) -} - -#[inline] -pub(crate) fn get_ip_tos(fd: BorrowedFd<'_>) -> io::Result<u8> { - let value: i32 = getsockopt(fd, c::IPPROTO_IP, c::IP_TOS)?; - Ok(value as u8) -} - -#[inline] -pub(crate) fn set_ip_recvtos(fd: BorrowedFd<'_>, value: bool) -> io::Result<()> { - setsockopt(fd, c::IPPROTO_IP, c::IP_RECVTOS, from_bool(value)) -} - -#[inline] -pub(crate) fn get_ip_recvtos(fd: BorrowedFd<'_>) -> io::Result<bool> { - getsockopt(fd, c::IPPROTO_IP, c::IP_RECVTOS).map(to_bool) -} - -#[inline] -pub(crate) fn set_ipv6_recvtclass(fd: BorrowedFd<'_>, value: bool) -> io::Result<()> { - setsockopt(fd, c::IPPROTO_IPV6, c::IPV6_RECVTCLASS, from_bool(value)) -} - -#[inline] -pub(crate) fn get_ipv6_recvtclass(fd: BorrowedFd<'_>) -> io::Result<bool> { - getsockopt(fd, c::IPPROTO_IPV6, c::IPV6_RECVTCLASS).map(to_bool) -} - -#[inline] -pub(crate) fn set_ip_freebind(fd: BorrowedFd<'_>, value: bool) -> io::Result<()> { - setsockopt(fd, c::IPPROTO_IP, c::IP_FREEBIND, from_bool(value)) -} - -#[inline] -pub(crate) fn get_ip_freebind(fd: BorrowedFd<'_>) -> io::Result<bool> { - getsockopt(fd, c::IPPROTO_IP, c::IP_FREEBIND).map(to_bool) -} - -#[inline] -pub(crate) fn set_ipv6_freebind(fd: BorrowedFd<'_>, value: bool) -> io::Result<()> { - setsockopt(fd, c::IPPROTO_IPV6, c::IPV6_FREEBIND, from_bool(value)) -} - -#[inline] -pub(crate) fn get_ipv6_freebind(fd: BorrowedFd<'_>) -> io::Result<bool> { - getsockopt(fd, c::IPPROTO_IPV6, c::IPV6_FREEBIND).map(to_bool) -} - -#[inline] -pub(crate) fn get_ip_original_dst(fd: BorrowedFd<'_>) -> io::Result<SocketAddrV4> { - let level = c::IPPROTO_IP; - let optname = c::SO_ORIGINAL_DST; - let mut value = MaybeUninit::<SocketAddrStorage>::uninit(); - let mut optlen = core::mem::size_of_val(&value).try_into().unwrap(); - - getsockopt_raw(fd, level, optname, &mut value, &mut optlen)?; - - let any = unsafe { SocketAddrAny::read(value.as_ptr(), optlen as usize)? }; - match any { - SocketAddrAny::V4(v4) => Ok(v4), - _ => unreachable!(), - } -} - -#[inline] -pub(crate) fn get_ipv6_original_dst(fd: BorrowedFd<'_>) -> io::Result<SocketAddrV6> { - let level = c::IPPROTO_IPV6; - let optname = c::IP6T_SO_ORIGINAL_DST; - let mut value = MaybeUninit::<SocketAddrStorage>::uninit(); - let mut optlen = core::mem::size_of_val(&value).try_into().unwrap(); - - getsockopt_raw(fd, level, optname, &mut value, &mut optlen)?; - - let any = unsafe { SocketAddrAny::read(value.as_ptr(), optlen as usize)? }; - match any { - SocketAddrAny::V6(v6) => Ok(v6), - _ => unreachable!(), - } -} - -#[inline] -pub(crate) fn set_ipv6_tclass(fd: BorrowedFd<'_>, value: u32) -> io::Result<()> { - setsockopt(fd, c::IPPROTO_IPV6, c::IPV6_TCLASS, value) -} - -#[inline] -pub(crate) fn get_ipv6_tclass(fd: BorrowedFd<'_>) -> io::Result<u32> { - getsockopt(fd, c::IPPROTO_IPV6, c::IPV6_TCLASS) -} - -#[inline] -pub(crate) fn set_tcp_nodelay(fd: BorrowedFd<'_>, nodelay: bool) -> io::Result<()> { - setsockopt(fd, c::IPPROTO_TCP, c::TCP_NODELAY, from_bool(nodelay)) -} - -#[inline] -pub(crate) fn get_tcp_nodelay(fd: BorrowedFd<'_>) -> io::Result<bool> { - getsockopt(fd, c::IPPROTO_TCP, c::TCP_NODELAY).map(to_bool) -} - -#[inline] -pub(crate) fn set_tcp_keepcnt(fd: BorrowedFd<'_>, count: u32) -> io::Result<()> { - setsockopt(fd, c::IPPROTO_TCP, c::TCP_KEEPCNT, count) -} - -#[inline] -pub(crate) fn get_tcp_keepcnt(fd: BorrowedFd<'_>) -> io::Result<u32> { - getsockopt(fd, c::IPPROTO_TCP, c::TCP_KEEPCNT) -} - -#[inline] -pub(crate) fn set_tcp_keepidle(fd: BorrowedFd<'_>, duration: Duration) -> io::Result<()> { - let secs: c::c_uint = duration_to_secs(duration)?; - setsockopt(fd, c::IPPROTO_TCP, c::TCP_KEEPIDLE, secs) -} - -#[inline] -pub(crate) fn get_tcp_keepidle(fd: BorrowedFd<'_>) -> io::Result<Duration> { - let secs: c::c_uint = getsockopt(fd, c::IPPROTO_TCP, c::TCP_KEEPIDLE)?; - Ok(Duration::from_secs(secs as u64)) -} - -#[inline] -pub(crate) fn set_tcp_keepintvl(fd: BorrowedFd<'_>, duration: Duration) -> io::Result<()> { - let secs: c::c_uint = duration_to_secs(duration)?; - setsockopt(fd, c::IPPROTO_TCP, c::TCP_KEEPINTVL, secs) -} - -#[inline] -pub(crate) fn get_tcp_keepintvl(fd: BorrowedFd<'_>) -> io::Result<Duration> { - let secs: c::c_uint = getsockopt(fd, c::IPPROTO_TCP, c::TCP_KEEPINTVL)?; - Ok(Duration::from_secs(secs as u64)) -} - -#[inline] -pub(crate) fn set_tcp_user_timeout(fd: BorrowedFd<'_>, value: u32) -> io::Result<()> { - setsockopt(fd, c::IPPROTO_TCP, c::TCP_USER_TIMEOUT, value) -} - -#[inline] -pub(crate) fn get_tcp_user_timeout(fd: BorrowedFd<'_>) -> io::Result<u32> { - getsockopt(fd, c::IPPROTO_TCP, c::TCP_USER_TIMEOUT) -} - -#[inline] -pub(crate) fn set_tcp_quickack(fd: BorrowedFd<'_>, value: bool) -> io::Result<()> { - setsockopt(fd, c::IPPROTO_TCP, c::TCP_QUICKACK, from_bool(value)) -} - -#[inline] -pub(crate) fn get_tcp_quickack(fd: BorrowedFd<'_>) -> io::Result<bool> { - getsockopt(fd, c::IPPROTO_TCP, c::TCP_QUICKACK).map(to_bool) -} - -#[inline] -pub(crate) fn set_tcp_congestion(fd: BorrowedFd<'_>, value: &str) -> io::Result<()> { - let level = c::IPPROTO_TCP; - let optname = c::TCP_CONGESTION; - let optlen = value.len().try_into().unwrap(); - setsockopt_raw(fd, level, optname, value.as_ptr(), optlen) -} - -#[cfg(feature = "alloc")] -#[inline] -pub(crate) fn get_tcp_congestion(fd: BorrowedFd<'_>) -> io::Result<String> { - let level = c::IPPROTO_TCP; - let optname = c::TCP_CONGESTION; - const OPTLEN: c::socklen_t = 16; - let mut value = MaybeUninit::<[MaybeUninit<u8>; OPTLEN as usize]>::uninit(); - let mut optlen = OPTLEN; - getsockopt_raw(fd, level, optname, &mut value, &mut optlen)?; - unsafe { - let value = value.assume_init(); - let slice: &[u8] = core::mem::transmute(&value[..optlen as usize]); - assert!(slice.iter().any(|b| *b == b'\0')); - Ok( - core::str::from_utf8(CStr::from_ptr(slice.as_ptr().cast()).to_bytes()) - .unwrap() - .to_owned(), - ) - } -} - -#[inline] -pub(crate) fn set_tcp_thin_linear_timeouts(fd: BorrowedFd<'_>, value: bool) -> io::Result<()> { - setsockopt( - fd, - c::IPPROTO_TCP, - c::TCP_THIN_LINEAR_TIMEOUTS, - from_bool(value), - ) -} - -#[inline] -pub(crate) fn get_tcp_thin_linear_timeouts(fd: BorrowedFd<'_>) -> io::Result<bool> { - getsockopt(fd, c::IPPROTO_TCP, c::TCP_THIN_LINEAR_TIMEOUTS).map(to_bool) -} - -#[inline] -pub(crate) fn set_tcp_cork(fd: BorrowedFd<'_>, value: bool) -> io::Result<()> { - setsockopt(fd, c::IPPROTO_TCP, c::TCP_CORK, from_bool(value)) -} - -#[inline] -pub(crate) fn get_tcp_cork(fd: BorrowedFd<'_>) -> io::Result<bool> { - getsockopt(fd, c::IPPROTO_TCP, c::TCP_CORK).map(to_bool) -} - -#[inline] -pub(crate) fn get_socket_peercred(fd: BorrowedFd<'_>) -> io::Result<UCred> { - getsockopt(fd, c::SOL_SOCKET, linux_raw_sys::net::SO_PEERCRED) -} - -#[inline] -fn to_ip_mreq(multiaddr: &Ipv4Addr, interface: &Ipv4Addr) -> c::ip_mreq { - c::ip_mreq { - imr_multiaddr: to_imr_addr(multiaddr), - imr_interface: to_imr_addr(interface), - } -} - -#[inline] -fn to_ip_mreqn(multiaddr: &Ipv4Addr, address: &Ipv4Addr, ifindex: i32) -> c::ip_mreqn { - c::ip_mreqn { - imr_multiaddr: to_imr_addr(multiaddr), - imr_address: to_imr_addr(address), - imr_ifindex: ifindex, - } -} - -#[inline] -fn to_imr_source( - multiaddr: &Ipv4Addr, - interface: &Ipv4Addr, - sourceaddr: &Ipv4Addr, -) -> c::ip_mreq_source { - c::ip_mreq_source { - imr_multiaddr: to_imr_addr(multiaddr).s_addr, - imr_interface: to_imr_addr(interface).s_addr, - imr_sourceaddr: to_imr_addr(sourceaddr).s_addr, - } -} - -#[inline] -fn to_imr_addr(addr: &Ipv4Addr) -> c::in_addr { - c::in_addr { - s_addr: u32::from_ne_bytes(addr.octets()), - } -} - -#[inline] -fn to_ipv6mr(multiaddr: &Ipv6Addr, interface: u32) -> c::ipv6_mreq { - c::ipv6_mreq { - ipv6mr_multiaddr: to_ipv6mr_multiaddr(multiaddr), - ipv6mr_ifindex: to_ipv6mr_interface(interface), - } -} - -#[inline] -fn to_ipv6mr_multiaddr(multiaddr: &Ipv6Addr) -> c::in6_addr { - c::in6_addr { - in6_u: linux_raw_sys::net::in6_addr__bindgen_ty_1 { - u6_addr8: multiaddr.octets(), - }, - } -} - -#[inline] -fn to_ipv6mr_interface(interface: u32) -> c::c_int { - interface as c::c_int -} - -#[inline] -fn from_bool(value: bool) -> c::c_uint { - c::c_uint::from(value) -} - -#[inline] -fn to_bool(value: c::c_uint) -> bool { - value != 0 -} - -/// Convert to seconds, rounding up if necessary. -#[inline] -fn duration_to_secs<T: TryFrom<u64>>(duration: Duration) -> io::Result<T> { - let mut secs = duration.as_secs(); - if duration.subsec_nanos() != 0 { - secs = secs.checked_add(1).ok_or(io::Errno::INVAL)?; - } - T::try_from(secs).map_err(|_e| io::Errno::INVAL) -} diff --git a/vendor/rustix/src/backend/linux_raw/net/syscalls.rs b/vendor/rustix/src/backend/linux_raw/net/syscalls.rs deleted file mode 100644 index 726f022..0000000 --- a/vendor/rustix/src/backend/linux_raw/net/syscalls.rs +++ /dev/null @@ -1,949 +0,0 @@ -//! linux_raw syscalls supporting `rustix::net`. -//! -//! # Safety -//! -//! See the `rustix::backend` module documentation for details. -#![allow(unsafe_code, clippy::undocumented_unsafe_blocks)] - -use super::msghdr::{ - with_noaddr_msghdr, with_recv_msghdr, with_unix_msghdr, with_v4_msghdr, with_v6_msghdr, -}; -use super::read_sockaddr::{initialize_family_to_unspec, maybe_read_sockaddr_os, read_sockaddr_os}; -use super::send_recv::{RecvFlags, SendFlags}; -use super::write_sockaddr::{encode_sockaddr_v4, encode_sockaddr_v6}; -use crate::backend::c; -use crate::backend::conv::{ - by_mut, by_ref, c_int, c_uint, pass_usize, ret, ret_owned_fd, ret_usize, size_of, slice, - socklen_t, zero, -}; -use crate::fd::{BorrowedFd, OwnedFd}; -use crate::io::{self, IoSlice, IoSliceMut}; -use crate::net::{ - AddressFamily, Protocol, RecvAncillaryBuffer, RecvMsgReturn, SendAncillaryBuffer, Shutdown, - SocketAddrAny, SocketAddrUnix, SocketAddrV4, SocketAddrV6, SocketFlags, SocketType, -}; -use c::{sockaddr, sockaddr_in, sockaddr_in6, socklen_t}; -use core::mem::MaybeUninit; -#[cfg(target_arch = "x86")] -use { - crate::backend::conv::{slice_just_addr, x86_sys}, - crate::backend::reg::{ArgReg, SocketArg}, - linux_raw_sys::net::{ - SYS_ACCEPT, SYS_ACCEPT4, SYS_BIND, SYS_CONNECT, SYS_GETPEERNAME, SYS_GETSOCKNAME, - SYS_LISTEN, SYS_RECV, SYS_RECVFROM, SYS_RECVMSG, SYS_SEND, SYS_SENDMSG, SYS_SENDTO, - SYS_SHUTDOWN, SYS_SOCKET, SYS_SOCKETPAIR, - }, -}; - -#[inline] -pub(crate) fn socket( - family: AddressFamily, - type_: SocketType, - protocol: Option<Protocol>, -) -> io::Result<OwnedFd> { - #[cfg(not(target_arch = "x86"))] - unsafe { - ret_owned_fd(syscall_readonly!(__NR_socket, family, type_, protocol)) - } - #[cfg(target_arch = "x86")] - unsafe { - ret_owned_fd(syscall_readonly!( - __NR_socketcall, - x86_sys(SYS_SOCKET), - slice_just_addr::<ArgReg<'_, SocketArg>, _>(&[ - family.into(), - type_.into(), - protocol.into(), - ]) - )) - } -} - -#[inline] -pub(crate) fn socket_with( - family: AddressFamily, - type_: SocketType, - flags: SocketFlags, - protocol: Option<Protocol>, -) -> io::Result<OwnedFd> { - #[cfg(not(target_arch = "x86"))] - unsafe { - ret_owned_fd(syscall_readonly!( - __NR_socket, - family, - (type_, flags), - protocol - )) - } - #[cfg(target_arch = "x86")] - unsafe { - ret_owned_fd(syscall_readonly!( - __NR_socketcall, - x86_sys(SYS_SOCKET), - slice_just_addr::<ArgReg<'_, SocketArg>, _>(&[ - family.into(), - (type_, flags).into(), - protocol.into(), - ]) - )) - } -} - -#[inline] -pub(crate) fn socketpair( - family: AddressFamily, - type_: SocketType, - flags: SocketFlags, - protocol: Option<Protocol>, -) -> io::Result<(OwnedFd, OwnedFd)> { - #[cfg(not(target_arch = "x86"))] - unsafe { - let mut result = MaybeUninit::<[OwnedFd; 2]>::uninit(); - ret(syscall!( - __NR_socketpair, - family, - (type_, flags), - protocol, - &mut result - ))?; - let [fd0, fd1] = result.assume_init(); - Ok((fd0, fd1)) - } - #[cfg(target_arch = "x86")] - unsafe { - let mut result = MaybeUninit::<[OwnedFd; 2]>::uninit(); - ret(syscall!( - __NR_socketcall, - x86_sys(SYS_SOCKETPAIR), - slice_just_addr::<ArgReg<'_, SocketArg>, _>(&[ - family.into(), - (type_, flags).into(), - protocol.into(), - (&mut result).into(), - ]) - ))?; - let [fd0, fd1] = result.assume_init(); - Ok((fd0, fd1)) - } -} - -#[inline] -pub(crate) fn accept(fd: BorrowedFd<'_>) -> io::Result<OwnedFd> { - #[cfg(not(target_arch = "x86"))] - unsafe { - let fd = ret_owned_fd(syscall_readonly!(__NR_accept, fd, zero(), zero()))?; - Ok(fd) - } - #[cfg(target_arch = "x86")] - unsafe { - let fd = ret_owned_fd(syscall_readonly!( - __NR_socketcall, - x86_sys(SYS_ACCEPT), - slice_just_addr::<ArgReg<'_, SocketArg>, _>(&[fd.into(), zero(), zero()]) - ))?; - Ok(fd) - } -} - -#[inline] -pub(crate) fn accept_with(fd: BorrowedFd<'_>, flags: SocketFlags) -> io::Result<OwnedFd> { - #[cfg(not(target_arch = "x86"))] - unsafe { - let fd = ret_owned_fd(syscall_readonly!(__NR_accept4, fd, zero(), zero(), flags))?; - Ok(fd) - } - #[cfg(target_arch = "x86")] - unsafe { - let fd = ret_owned_fd(syscall_readonly!( - __NR_socketcall, - x86_sys(SYS_ACCEPT4), - slice_just_addr::<ArgReg<'_, SocketArg>, _>(&[fd.into(), zero(), zero(), flags.into()]) - ))?; - Ok(fd) - } -} - -#[inline] -pub(crate) fn acceptfrom(fd: BorrowedFd<'_>) -> io::Result<(OwnedFd, Option<SocketAddrAny>)> { - #[cfg(not(target_arch = "x86"))] - unsafe { - let mut addrlen = core::mem::size_of::<sockaddr>() as socklen_t; - let mut storage = MaybeUninit::<sockaddr>::uninit(); - let fd = ret_owned_fd(syscall!( - __NR_accept, - fd, - &mut storage, - by_mut(&mut addrlen) - ))?; - Ok(( - fd, - maybe_read_sockaddr_os(&storage.assume_init(), addrlen.try_into().unwrap()), - )) - } - #[cfg(target_arch = "x86")] - unsafe { - let mut addrlen = core::mem::size_of::<sockaddr>() as socklen_t; - let mut storage = MaybeUninit::<sockaddr>::uninit(); - let fd = ret_owned_fd(syscall!( - __NR_socketcall, - x86_sys(SYS_ACCEPT), - slice_just_addr::<ArgReg<'_, SocketArg>, _>(&[ - fd.into(), - (&mut storage).into(), - by_mut(&mut addrlen), - ]) - ))?; - Ok(( - fd, - maybe_read_sockaddr_os(&storage.assume_init(), addrlen.try_into().unwrap()), - )) - } -} - -#[inline] -pub(crate) fn acceptfrom_with( - fd: BorrowedFd<'_>, - flags: SocketFlags, -) -> io::Result<(OwnedFd, Option<SocketAddrAny>)> { - #[cfg(not(target_arch = "x86"))] - unsafe { - let mut addrlen = core::mem::size_of::<sockaddr>() as socklen_t; - let mut storage = MaybeUninit::<sockaddr>::uninit(); - let fd = ret_owned_fd(syscall!( - __NR_accept4, - fd, - &mut storage, - by_mut(&mut addrlen), - flags - ))?; - Ok(( - fd, - maybe_read_sockaddr_os(&storage.assume_init(), addrlen.try_into().unwrap()), - )) - } - #[cfg(target_arch = "x86")] - unsafe { - let mut addrlen = core::mem::size_of::<sockaddr>() as socklen_t; - let mut storage = MaybeUninit::<sockaddr>::uninit(); - let fd = ret_owned_fd(syscall!( - __NR_socketcall, - x86_sys(SYS_ACCEPT4), - slice_just_addr::<ArgReg<'_, SocketArg>, _>(&[ - fd.into(), - (&mut storage).into(), - by_mut(&mut addrlen), - flags.into(), - ]) - ))?; - Ok(( - fd, - maybe_read_sockaddr_os(&storage.assume_init(), addrlen.try_into().unwrap()), - )) - } -} - -#[inline] -pub(crate) fn recvmsg( - sockfd: BorrowedFd<'_>, - iov: &mut [IoSliceMut<'_>], - control: &mut RecvAncillaryBuffer<'_>, - msg_flags: RecvFlags, -) -> io::Result<RecvMsgReturn> { - let mut storage = MaybeUninit::<c::sockaddr_storage>::uninit(); - - with_recv_msghdr(&mut storage, iov, control, |msghdr| { - #[cfg(not(target_arch = "x86"))] - let result = - unsafe { ret_usize(syscall!(__NR_recvmsg, sockfd, by_mut(msghdr), msg_flags)) }; - - #[cfg(target_arch = "x86")] - let result = unsafe { - ret_usize(syscall!( - __NR_socketcall, - x86_sys(SYS_RECVMSG), - slice_just_addr::<ArgReg<'_, SocketArg>, _>(&[ - sockfd.into(), - by_mut(msghdr), - msg_flags.into(), - ]) - )) - }; - - result.map(|bytes| { - // Get the address of the sender, if any. - let addr = - unsafe { maybe_read_sockaddr_os(msghdr.msg_name as _, msghdr.msg_namelen as _) }; - - RecvMsgReturn { - bytes, - address: addr, - flags: RecvFlags::from_bits_retain(msghdr.msg_flags), - } - }) - }) -} - -#[inline] -pub(crate) fn sendmsg( - sockfd: BorrowedFd<'_>, - iov: &[IoSlice<'_>], - control: &mut SendAncillaryBuffer<'_, '_, '_>, - msg_flags: SendFlags, -) -> io::Result<usize> { - with_noaddr_msghdr(iov, control, |msghdr| { - #[cfg(not(target_arch = "x86"))] - let result = - unsafe { ret_usize(syscall!(__NR_sendmsg, sockfd, by_ref(&msghdr), msg_flags)) }; - - #[cfg(target_arch = "x86")] - let result = unsafe { - ret_usize(syscall!( - __NR_socketcall, - x86_sys(SYS_SENDMSG), - slice_just_addr::<ArgReg<'_, SocketArg>, _>(&[ - sockfd.into(), - by_ref(&msghdr), - msg_flags.into() - ]) - )) - }; - - result - }) -} - -#[inline] -pub(crate) fn sendmsg_v4( - sockfd: BorrowedFd<'_>, - addr: &SocketAddrV4, - iov: &[IoSlice<'_>], - control: &mut SendAncillaryBuffer<'_, '_, '_>, - msg_flags: SendFlags, -) -> io::Result<usize> { - with_v4_msghdr(addr, iov, control, |msghdr| { - #[cfg(not(target_arch = "x86"))] - let result = - unsafe { ret_usize(syscall!(__NR_sendmsg, sockfd, by_ref(&msghdr), msg_flags)) }; - - #[cfg(target_arch = "x86")] - let result = unsafe { - ret_usize(syscall!( - __NR_socketcall, - x86_sys(SYS_SENDMSG), - slice_just_addr::<ArgReg<'_, SocketArg>, _>(&[ - sockfd.into(), - by_ref(&msghdr), - msg_flags.into(), - ]) - )) - }; - - result - }) -} - -#[inline] -pub(crate) fn sendmsg_v6( - sockfd: BorrowedFd<'_>, - addr: &SocketAddrV6, - iov: &[IoSlice<'_>], - control: &mut SendAncillaryBuffer<'_, '_, '_>, - msg_flags: SendFlags, -) -> io::Result<usize> { - with_v6_msghdr(addr, iov, control, |msghdr| { - #[cfg(not(target_arch = "x86"))] - let result = - unsafe { ret_usize(syscall!(__NR_sendmsg, sockfd, by_ref(&msghdr), msg_flags)) }; - - #[cfg(target_arch = "x86")] - let result = unsafe { - ret_usize(syscall!( - __NR_socketcall, - x86_sys(SYS_SENDMSG), - slice_just_addr::<ArgReg<'_, SocketArg>, _>(&[ - sockfd.into(), - by_ref(&msghdr), - msg_flags.into() - ]) - )) - }; - - result - }) -} - -#[inline] -pub(crate) fn sendmsg_unix( - sockfd: BorrowedFd<'_>, - addr: &SocketAddrUnix, - iov: &[IoSlice<'_>], - control: &mut SendAncillaryBuffer<'_, '_, '_>, - msg_flags: SendFlags, -) -> io::Result<usize> { - with_unix_msghdr(addr, iov, control, |msghdr| { - #[cfg(not(target_arch = "x86"))] - let result = - unsafe { ret_usize(syscall!(__NR_sendmsg, sockfd, by_ref(&msghdr), msg_flags)) }; - - #[cfg(target_arch = "x86")] - let result = unsafe { - ret_usize(syscall!( - __NR_socketcall, - x86_sys(SYS_SENDMSG), - slice_just_addr::<ArgReg<'_, SocketArg>, _>(&[ - sockfd.into(), - by_ref(&msghdr), - msg_flags.into() - ]) - )) - }; - - result - }) -} - -#[inline] -pub(crate) fn shutdown(fd: BorrowedFd<'_>, how: Shutdown) -> io::Result<()> { - #[cfg(not(target_arch = "x86"))] - unsafe { - ret(syscall_readonly!( - __NR_shutdown, - fd, - c_uint(how as c::c_uint) - )) - } - #[cfg(target_arch = "x86")] - unsafe { - ret(syscall_readonly!( - __NR_socketcall, - x86_sys(SYS_SHUTDOWN), - slice_just_addr::<ArgReg<'_, SocketArg>, _>(&[fd.into(), c_uint(how as c::c_uint)]) - )) - } -} - -#[inline] -pub(crate) fn send(fd: BorrowedFd<'_>, buf: &[u8], flags: SendFlags) -> io::Result<usize> { - let (buf_addr, buf_len) = slice(buf); - - #[cfg(not(any( - target_arch = "aarch64", - target_arch = "mips64", - target_arch = "mips64r6", - target_arch = "riscv64", - target_arch = "x86", - target_arch = "x86_64", - )))] - unsafe { - ret_usize(syscall_readonly!(__NR_send, fd, buf_addr, buf_len, flags)) - } - #[cfg(any( - target_arch = "aarch64", - target_arch = "mips64", - target_arch = "mips64r6", - target_arch = "riscv64", - target_arch = "x86_64", - ))] - unsafe { - ret_usize(syscall_readonly!( - __NR_sendto, - fd, - buf_addr, - buf_len, - flags, - zero(), - zero() - )) - } - #[cfg(target_arch = "x86")] - unsafe { - ret_usize(syscall_readonly!( - __NR_socketcall, - x86_sys(SYS_SEND), - slice_just_addr::<ArgReg<'_, SocketArg>, _>(&[ - fd.into(), - buf_addr, - buf_len, - flags.into() - ]) - )) - } -} - -#[inline] -pub(crate) fn sendto_v4( - fd: BorrowedFd<'_>, - buf: &[u8], - flags: SendFlags, - addr: &SocketAddrV4, -) -> io::Result<usize> { - let (buf_addr, buf_len) = slice(buf); - - #[cfg(not(target_arch = "x86"))] - unsafe { - ret_usize(syscall_readonly!( - __NR_sendto, - fd, - buf_addr, - buf_len, - flags, - by_ref(&encode_sockaddr_v4(addr)), - size_of::<sockaddr_in, _>() - )) - } - #[cfg(target_arch = "x86")] - unsafe { - ret_usize(syscall_readonly!( - __NR_socketcall, - x86_sys(SYS_SENDTO), - slice_just_addr::<ArgReg<'_, SocketArg>, _>(&[ - fd.into(), - buf_addr, - buf_len, - flags.into(), - by_ref(&encode_sockaddr_v4(addr)), - size_of::<sockaddr_in, _>(), - ]) - )) - } -} - -#[inline] -pub(crate) fn sendto_v6( - fd: BorrowedFd<'_>, - buf: &[u8], - flags: SendFlags, - addr: &SocketAddrV6, -) -> io::Result<usize> { - let (buf_addr, buf_len) = slice(buf); - - #[cfg(not(target_arch = "x86"))] - unsafe { - ret_usize(syscall_readonly!( - __NR_sendto, - fd, - buf_addr, - buf_len, - flags, - by_ref(&encode_sockaddr_v6(addr)), - size_of::<sockaddr_in6, _>() - )) - } - #[cfg(target_arch = "x86")] - unsafe { - ret_usize(syscall_readonly!( - __NR_socketcall, - x86_sys(SYS_SENDTO), - slice_just_addr::<ArgReg<'_, SocketArg>, _>(&[ - fd.into(), - buf_addr, - buf_len, - flags.into(), - by_ref(&encode_sockaddr_v6(addr)), - size_of::<sockaddr_in6, _>(), - ]) - )) - } -} - -#[inline] -pub(crate) fn sendto_unix( - fd: BorrowedFd<'_>, - buf: &[u8], - flags: SendFlags, - addr: &SocketAddrUnix, -) -> io::Result<usize> { - let (buf_addr, buf_len) = slice(buf); - - #[cfg(not(target_arch = "x86"))] - unsafe { - ret_usize(syscall_readonly!( - __NR_sendto, - fd, - buf_addr, - buf_len, - flags, - by_ref(&addr.unix), - socklen_t(addr.addr_len()) - )) - } - #[cfg(target_arch = "x86")] - unsafe { - ret_usize(syscall_readonly!( - __NR_socketcall, - x86_sys(SYS_SENDTO), - slice_just_addr::<ArgReg<'_, SocketArg>, _>(&[ - fd.into(), - buf_addr, - buf_len, - flags.into(), - by_ref(&addr.unix), - socklen_t(addr.addr_len()), - ]) - )) - } -} - -#[inline] -pub(crate) unsafe fn recv( - fd: BorrowedFd<'_>, - buf: *mut u8, - len: usize, - flags: RecvFlags, -) -> io::Result<usize> { - #[cfg(not(any( - target_arch = "aarch64", - target_arch = "mips64", - target_arch = "mips64r6", - target_arch = "riscv64", - target_arch = "x86", - target_arch = "x86_64", - )))] - { - ret_usize(syscall!(__NR_recv, fd, buf, pass_usize(len), flags)) - } - #[cfg(any( - target_arch = "aarch64", - target_arch = "mips64", - target_arch = "mips64r6", - target_arch = "riscv64", - target_arch = "x86_64", - ))] - { - ret_usize(syscall!( - __NR_recvfrom, - fd, - buf, - pass_usize(len), - flags, - zero(), - zero() - )) - } - #[cfg(target_arch = "x86")] - { - ret_usize(syscall!( - __NR_socketcall, - x86_sys(SYS_RECV), - slice_just_addr::<ArgReg<'_, SocketArg>, _>(&[ - fd.into(), - buf.into(), - pass_usize(len), - flags.into(), - ]) - )) - } -} - -#[inline] -pub(crate) unsafe fn recvfrom( - fd: BorrowedFd<'_>, - buf: *mut u8, - len: usize, - flags: RecvFlags, -) -> io::Result<(usize, Option<SocketAddrAny>)> { - let mut addrlen = core::mem::size_of::<sockaddr>() as socklen_t; - let mut storage = MaybeUninit::<sockaddr>::uninit(); - - // `recvfrom` does not write to the storage if the socket is - // connection-oriented sockets, so we initialize the family field to - // `AF_UNSPEC` so that we can detect this case. - initialize_family_to_unspec(storage.as_mut_ptr()); - - #[cfg(not(target_arch = "x86"))] - let nread = ret_usize(syscall!( - __NR_recvfrom, - fd, - buf, - pass_usize(len), - flags, - &mut storage, - by_mut(&mut addrlen) - ))?; - #[cfg(target_arch = "x86")] - let nread = ret_usize(syscall!( - __NR_socketcall, - x86_sys(SYS_RECVFROM), - slice_just_addr::<ArgReg<'_, SocketArg>, _>(&[ - fd.into(), - buf.into(), - pass_usize(len), - flags.into(), - (&mut storage).into(), - by_mut(&mut addrlen), - ]) - ))?; - - Ok(( - nread, - maybe_read_sockaddr_os(&storage.assume_init(), addrlen.try_into().unwrap()), - )) -} - -#[inline] -pub(crate) fn getpeername(fd: BorrowedFd<'_>) -> io::Result<Option<SocketAddrAny>> { - #[cfg(not(target_arch = "x86"))] - unsafe { - let mut addrlen = core::mem::size_of::<sockaddr>() as socklen_t; - let mut storage = MaybeUninit::<sockaddr>::uninit(); - ret(syscall!( - __NR_getpeername, - fd, - &mut storage, - by_mut(&mut addrlen) - ))?; - Ok(maybe_read_sockaddr_os( - &storage.assume_init(), - addrlen.try_into().unwrap(), - )) - } - #[cfg(target_arch = "x86")] - unsafe { - let mut addrlen = core::mem::size_of::<sockaddr>() as socklen_t; - let mut storage = MaybeUninit::<sockaddr>::uninit(); - ret(syscall!( - __NR_socketcall, - x86_sys(SYS_GETPEERNAME), - slice_just_addr::<ArgReg<'_, SocketArg>, _>(&[ - fd.into(), - (&mut storage).into(), - by_mut(&mut addrlen), - ]) - ))?; - Ok(maybe_read_sockaddr_os( - &storage.assume_init(), - addrlen.try_into().unwrap(), - )) - } -} - -#[inline] -pub(crate) fn getsockname(fd: BorrowedFd<'_>) -> io::Result<SocketAddrAny> { - #[cfg(not(target_arch = "x86"))] - unsafe { - let mut addrlen = core::mem::size_of::<sockaddr>() as socklen_t; - let mut storage = MaybeUninit::<sockaddr>::uninit(); - ret(syscall!( - __NR_getsockname, - fd, - &mut storage, - by_mut(&mut addrlen) - ))?; - Ok(read_sockaddr_os( - &storage.assume_init(), - addrlen.try_into().unwrap(), - )) - } - #[cfg(target_arch = "x86")] - unsafe { - let mut addrlen = core::mem::size_of::<sockaddr>() as socklen_t; - let mut storage = MaybeUninit::<sockaddr>::uninit(); - ret(syscall!( - __NR_socketcall, - x86_sys(SYS_GETSOCKNAME), - slice_just_addr::<ArgReg<'_, SocketArg>, _>(&[ - fd.into(), - (&mut storage).into(), - by_mut(&mut addrlen), - ]) - ))?; - Ok(read_sockaddr_os( - &storage.assume_init(), - addrlen.try_into().unwrap(), - )) - } -} - -#[inline] -pub(crate) fn bind_v4(fd: BorrowedFd<'_>, addr: &SocketAddrV4) -> io::Result<()> { - #[cfg(not(target_arch = "x86"))] - unsafe { - ret(syscall_readonly!( - __NR_bind, - fd, - by_ref(&encode_sockaddr_v4(addr)), - size_of::<sockaddr_in, _>() - )) - } - #[cfg(target_arch = "x86")] - unsafe { - ret(syscall_readonly!( - __NR_socketcall, - x86_sys(SYS_BIND), - slice_just_addr::<ArgReg<'_, SocketArg>, _>(&[ - fd.into(), - by_ref(&encode_sockaddr_v4(addr)), - size_of::<sockaddr_in, _>(), - ]) - )) - } -} - -#[inline] -pub(crate) fn bind_v6(fd: BorrowedFd<'_>, addr: &SocketAddrV6) -> io::Result<()> { - #[cfg(not(target_arch = "x86"))] - unsafe { - ret(syscall_readonly!( - __NR_bind, - fd, - by_ref(&encode_sockaddr_v6(addr)), - size_of::<sockaddr_in6, _>() - )) - } - #[cfg(target_arch = "x86")] - unsafe { - ret(syscall_readonly!( - __NR_socketcall, - x86_sys(SYS_BIND), - slice_just_addr::<ArgReg<'_, SocketArg>, _>(&[ - fd.into(), - by_ref(&encode_sockaddr_v6(addr)), - size_of::<sockaddr_in6, _>(), - ]) - )) - } -} - -#[inline] -pub(crate) fn bind_unix(fd: BorrowedFd<'_>, addr: &SocketAddrUnix) -> io::Result<()> { - #[cfg(not(target_arch = "x86"))] - unsafe { - ret(syscall_readonly!( - __NR_bind, - fd, - by_ref(&addr.unix), - socklen_t(addr.addr_len()) - )) - } - #[cfg(target_arch = "x86")] - unsafe { - ret(syscall_readonly!( - __NR_socketcall, - x86_sys(SYS_BIND), - slice_just_addr::<ArgReg<'_, SocketArg>, _>(&[ - fd.into(), - by_ref(&addr.unix), - socklen_t(addr.addr_len()), - ]) - )) - } -} - -#[inline] -pub(crate) fn connect_v4(fd: BorrowedFd<'_>, addr: &SocketAddrV4) -> io::Result<()> { - #[cfg(not(target_arch = "x86"))] - unsafe { - ret(syscall_readonly!( - __NR_connect, - fd, - by_ref(&encode_sockaddr_v4(addr)), - size_of::<sockaddr_in, _>() - )) - } - #[cfg(target_arch = "x86")] - unsafe { - ret(syscall_readonly!( - __NR_socketcall, - x86_sys(SYS_CONNECT), - slice_just_addr::<ArgReg<'_, SocketArg>, _>(&[ - fd.into(), - by_ref(&encode_sockaddr_v4(addr)), - size_of::<sockaddr_in, _>(), - ]) - )) - } -} - -#[inline] -pub(crate) fn connect_v6(fd: BorrowedFd<'_>, addr: &SocketAddrV6) -> io::Result<()> { - #[cfg(not(target_arch = "x86"))] - unsafe { - ret(syscall_readonly!( - __NR_connect, - fd, - by_ref(&encode_sockaddr_v6(addr)), - size_of::<sockaddr_in6, _>() - )) - } - #[cfg(target_arch = "x86")] - unsafe { - ret(syscall_readonly!( - __NR_socketcall, - x86_sys(SYS_CONNECT), - slice_just_addr::<ArgReg<'_, SocketArg>, _>(&[ - fd.into(), - by_ref(&encode_sockaddr_v6(addr)), - size_of::<sockaddr_in6, _>(), - ]) - )) - } -} - -#[inline] -pub(crate) fn connect_unix(fd: BorrowedFd<'_>, addr: &SocketAddrUnix) -> io::Result<()> { - #[cfg(not(target_arch = "x86"))] - unsafe { - ret(syscall_readonly!( - __NR_connect, - fd, - by_ref(&addr.unix), - socklen_t(addr.addr_len()) - )) - } - #[cfg(target_arch = "x86")] - unsafe { - ret(syscall_readonly!( - __NR_socketcall, - x86_sys(SYS_CONNECT), - slice_just_addr::<ArgReg<'_, SocketArg>, _>(&[ - fd.into(), - by_ref(&addr.unix), - socklen_t(addr.addr_len()), - ]) - )) - } -} - -#[inline] -pub(crate) fn connect_unspec(fd: BorrowedFd<'_>) -> io::Result<()> { - debug_assert_eq!(c::AF_UNSPEC, 0); - let addr = MaybeUninit::<c::sockaddr_storage>::zeroed(); - - #[cfg(not(target_arch = "x86"))] - unsafe { - ret(syscall_readonly!( - __NR_connect, - fd, - by_ref(&addr), - size_of::<c::sockaddr_storage, _>() - )) - } - #[cfg(target_arch = "x86")] - unsafe { - ret(syscall_readonly!( - __NR_socketcall, - x86_sys(SYS_CONNECT), - slice_just_addr::<ArgReg<'_, SocketArg>, _>(&[ - fd.into(), - by_ref(&addr), - size_of::<c::sockaddr_storage, _>(), - ]) - )) - } -} - -#[inline] -pub(crate) fn listen(fd: BorrowedFd<'_>, backlog: c::c_int) -> io::Result<()> { - #[cfg(not(target_arch = "x86"))] - unsafe { - ret(syscall_readonly!(__NR_listen, fd, c_int(backlog))) - } - #[cfg(target_arch = "x86")] - unsafe { - ret(syscall_readonly!( - __NR_socketcall, - x86_sys(SYS_LISTEN), - slice_just_addr::<ArgReg<'_, SocketArg>, _>(&[fd.into(), c_int(backlog)]) - )) - } -} diff --git a/vendor/rustix/src/backend/linux_raw/net/write_sockaddr.rs b/vendor/rustix/src/backend/linux_raw/net/write_sockaddr.rs deleted file mode 100644 index 24edd49..0000000 --- a/vendor/rustix/src/backend/linux_raw/net/write_sockaddr.rs +++ /dev/null @@ -1,60 +0,0 @@ -//! The BSD sockets API requires us to read the `ss_family` field before we can -//! interpret the rest of a `sockaddr` produced by the kernel. -#![allow(unsafe_code)] - -use crate::backend::c; -use crate::net::{SocketAddrAny, SocketAddrStorage, SocketAddrUnix, SocketAddrV4, SocketAddrV6}; -use core::mem::size_of; - -pub(crate) unsafe fn write_sockaddr( - addr: &SocketAddrAny, - storage: *mut SocketAddrStorage, -) -> usize { - match addr { - SocketAddrAny::V4(v4) => write_sockaddr_v4(v4, storage), - SocketAddrAny::V6(v6) => write_sockaddr_v6(v6, storage), - SocketAddrAny::Unix(unix) => write_sockaddr_unix(unix, storage), - } -} - -pub(crate) fn encode_sockaddr_v4(v4: &SocketAddrV4) -> c::sockaddr_in { - c::sockaddr_in { - sin_family: c::AF_INET as _, - sin_port: u16::to_be(v4.port()), - sin_addr: c::in_addr { - s_addr: u32::from_ne_bytes(v4.ip().octets()), - }, - __pad: [0_u8; 8], - } -} - -unsafe fn write_sockaddr_v4(v4: &SocketAddrV4, storage: *mut SocketAddrStorage) -> usize { - let encoded = encode_sockaddr_v4(v4); - core::ptr::write(storage.cast(), encoded); - size_of::<c::sockaddr_in>() -} - -pub(crate) fn encode_sockaddr_v6(v6: &SocketAddrV6) -> c::sockaddr_in6 { - c::sockaddr_in6 { - sin6_family: c::AF_INET6 as _, - sin6_port: u16::to_be(v6.port()), - sin6_flowinfo: u32::to_be(v6.flowinfo()), - sin6_addr: c::in6_addr { - in6_u: linux_raw_sys::net::in6_addr__bindgen_ty_1 { - u6_addr8: v6.ip().octets(), - }, - }, - sin6_scope_id: v6.scope_id(), - } -} - -unsafe fn write_sockaddr_v6(v6: &SocketAddrV6, storage: *mut SocketAddrStorage) -> usize { - let encoded = encode_sockaddr_v6(v6); - core::ptr::write(storage.cast(), encoded); - size_of::<c::sockaddr_in6>() -} - -unsafe fn write_sockaddr_unix(unix: &SocketAddrUnix, storage: *mut SocketAddrStorage) -> usize { - core::ptr::write(storage.cast(), unix.unix); - unix.len() -} diff --git a/vendor/rustix/src/backend/linux_raw/param/auxv.rs b/vendor/rustix/src/backend/linux_raw/param/auxv.rs deleted file mode 100644 index b9ac27e..0000000 --- a/vendor/rustix/src/backend/linux_raw/param/auxv.rs +++ /dev/null @@ -1,507 +0,0 @@ -//! Linux auxv support. -//! -//! # Safety -//! -//! This uses raw pointers to locate and read the kernel-provided auxv array. -#![allow(unsafe_code)] - -use crate::backend::c; -use crate::fd::OwnedFd; -#[cfg(feature = "param")] -use crate::ffi::CStr; -use crate::fs::{Mode, OFlags}; -use crate::utils::{as_ptr, check_raw_pointer}; -#[cfg(feature = "alloc")] -use alloc::vec::Vec; -use core::mem::size_of; -use core::ptr::{null_mut, read_unaligned, NonNull}; -#[cfg(feature = "runtime")] -use core::sync::atomic::AtomicU8; -use core::sync::atomic::Ordering::Relaxed; -use core::sync::atomic::{AtomicPtr, AtomicUsize}; -use linux_raw_sys::elf::*; -use linux_raw_sys::general::{ - AT_BASE, AT_CLKTCK, AT_EXECFN, AT_HWCAP, AT_HWCAP2, AT_NULL, AT_PAGESZ, AT_SYSINFO_EHDR, -}; -#[cfg(feature = "runtime")] -use linux_raw_sys::general::{ - AT_EGID, AT_ENTRY, AT_EUID, AT_GID, AT_PHDR, AT_PHENT, AT_PHNUM, AT_RANDOM, AT_SECURE, AT_UID, -}; - -#[cfg(feature = "param")] -#[inline] -pub(crate) fn page_size() -> usize { - let mut page_size = PAGE_SIZE.load(Relaxed); - - if page_size == 0 { - init_auxv(); - page_size = PAGE_SIZE.load(Relaxed); - } - - page_size -} - -#[cfg(feature = "param")] -#[inline] -pub(crate) fn clock_ticks_per_second() -> u64 { - let mut ticks = CLOCK_TICKS_PER_SECOND.load(Relaxed); - - if ticks == 0 { - init_auxv(); - ticks = CLOCK_TICKS_PER_SECOND.load(Relaxed); - } - - ticks as u64 -} - -#[cfg(feature = "param")] -#[inline] -pub(crate) fn linux_hwcap() -> (usize, usize) { - let mut hwcap = HWCAP.load(Relaxed); - let mut hwcap2 = HWCAP2.load(Relaxed); - - if hwcap == 0 || hwcap2 == 0 { - init_auxv(); - hwcap = HWCAP.load(Relaxed); - hwcap2 = HWCAP2.load(Relaxed); - } - - (hwcap, hwcap2) -} - -#[cfg(feature = "param")] -#[inline] -pub(crate) fn linux_execfn() -> &'static CStr { - let mut execfn = EXECFN.load(Relaxed); - - if execfn.is_null() { - init_auxv(); - execfn = EXECFN.load(Relaxed); - } - - // SAFETY: We assume the `AT_EXECFN` value provided by the kernel is a - // valid pointer to a valid NUL-terminated array of bytes. - unsafe { CStr::from_ptr(execfn.cast()) } -} - -#[cfg(feature = "runtime")] -#[inline] -pub(crate) fn linux_secure() -> bool { - let mut secure = SECURE.load(Relaxed); - - // 0 means not initialized yet. - if secure == 0 { - init_auxv(); - secure = SECURE.load(Relaxed); - } - - // 0 means not present. Libc `getauxval(AT_SECURE)` would return 0. - // 1 means not in secure mode. - // 2 means in secure mode. - secure > 1 -} - -#[cfg(feature = "runtime")] -#[inline] -pub(crate) fn exe_phdrs() -> (*const c::c_void, usize, usize) { - let mut phdr = PHDR.load(Relaxed); - let mut phent = PHENT.load(Relaxed); - let mut phnum = PHNUM.load(Relaxed); - - if phdr.is_null() || phnum == 0 { - init_auxv(); - phdr = PHDR.load(Relaxed); - phent = PHENT.load(Relaxed); - phnum = PHNUM.load(Relaxed); - } - - (phdr.cast(), phent, phnum) -} - -/// `AT_SYSINFO_EHDR` isn't present on all platforms in all configurations, so -/// if we don't see it, this function returns a null pointer. -#[inline] -pub(in super::super) fn sysinfo_ehdr() -> *const Elf_Ehdr { - let mut ehdr = SYSINFO_EHDR.load(Relaxed); - - if ehdr.is_null() { - init_auxv(); - ehdr = SYSINFO_EHDR.load(Relaxed); - } - - ehdr -} - -#[cfg(feature = "runtime")] -#[inline] -pub(crate) fn entry() -> usize { - let mut entry = ENTRY.load(Relaxed); - - if entry == 0 { - init_auxv(); - entry = ENTRY.load(Relaxed); - } - - entry -} - -#[cfg(feature = "runtime")] -#[inline] -pub(crate) fn random() -> *const [u8; 16] { - let mut random = RANDOM.load(Relaxed); - - if random.is_null() { - init_auxv(); - random = RANDOM.load(Relaxed); - } - - random -} - -static PAGE_SIZE: AtomicUsize = AtomicUsize::new(0); -static CLOCK_TICKS_PER_SECOND: AtomicUsize = AtomicUsize::new(0); -static HWCAP: AtomicUsize = AtomicUsize::new(0); -static HWCAP2: AtomicUsize = AtomicUsize::new(0); -static EXECFN: AtomicPtr<c::c_char> = AtomicPtr::new(null_mut()); -static SYSINFO_EHDR: AtomicPtr<Elf_Ehdr> = AtomicPtr::new(null_mut()); -#[cfg(feature = "runtime")] -static SECURE: AtomicU8 = AtomicU8::new(0); -#[cfg(feature = "runtime")] -static PHDR: AtomicPtr<Elf_Phdr> = AtomicPtr::new(null_mut()); -#[cfg(feature = "runtime")] -static PHENT: AtomicUsize = AtomicUsize::new(0); -#[cfg(feature = "runtime")] -static PHNUM: AtomicUsize = AtomicUsize::new(0); -#[cfg(feature = "runtime")] -static ENTRY: AtomicUsize = AtomicUsize::new(0); -#[cfg(feature = "runtime")] -static RANDOM: AtomicPtr<[u8; 16]> = AtomicPtr::new(null_mut()); - -#[cfg(feature = "alloc")] -fn pr_get_auxv() -> crate::io::Result<Vec<u8>> { - use super::super::conv::{c_int, pass_usize, ret_usize}; - const PR_GET_AUXV: c::c_int = 0x4155_5856; - let mut buffer = alloc::vec![0u8; 512]; - let len = unsafe { - ret_usize(syscall_always_asm!( - __NR_prctl, - c_int(PR_GET_AUXV), - buffer.as_ptr(), - pass_usize(buffer.len()), - pass_usize(0), - pass_usize(0) - ))? - }; - if len <= buffer.len() { - buffer.truncate(len); - return Ok(buffer); - } - buffer.resize(len, 0); - let len = unsafe { - ret_usize(syscall_always_asm!( - __NR_prctl, - c_int(PR_GET_AUXV), - buffer.as_ptr(), - pass_usize(buffer.len()), - pass_usize(0), - pass_usize(0) - ))? - }; - assert_eq!(len, buffer.len()); - return Ok(buffer); -} - -/// If we don't have "use-explicitly-provided-auxv" or "use-libc-auxv", we -/// read the aux vector via the `prctl` `PR_GET_AUXV`, with a fallback to -/// /proc/self/auxv for kernels that don't support `PR_GET_AUXV`. -#[cold] -fn init_auxv() { - #[cfg(feature = "alloc")] - { - match pr_get_auxv() { - Ok(buffer) => { - // SAFETY: We assume the kernel returns a valid auxv. - unsafe { - init_from_aux_iter(AuxPointer(buffer.as_ptr().cast())).unwrap(); - } - return; - } - Err(_) => { - // Fall back to /proc/self/auxv on error. - } - } - } - - // Open "/proc/self/auxv", either because we trust "/proc", or because - // we're running inside QEMU and `proc_self_auxv`'s extra checking foils - // QEMU's emulation so we need to do a plain open to get the right - // auxv records. - let file = crate::fs::open("/proc/self/auxv", OFlags::RDONLY, Mode::empty()).unwrap(); - - #[cfg(feature = "alloc")] - init_from_auxv_file(file).unwrap(); - - #[cfg(not(feature = "alloc"))] - unsafe { - init_from_aux_iter(AuxFile(file)).unwrap(); - } -} - -/// Process auxv entries from the open file `auxv`. -#[cfg(feature = "alloc")] -#[cold] -#[must_use] -fn init_from_auxv_file(auxv: OwnedFd) -> Option<()> { - let mut buffer = Vec::<u8>::with_capacity(512); - loop { - let cur = buffer.len(); - - // Request one extra byte; `Vec` will often allocate more. - buffer.reserve(1); - - // Use all the space it allocated. - buffer.resize(buffer.capacity(), 0); - - // Read up to that many bytes. - let n = match crate::io::read(&auxv, &mut buffer[cur..]) { - Err(crate::io::Errno::INTR) => 0, - Err(_err) => panic!(), - Ok(0) => break, - Ok(n) => n, - }; - - // Account for the number of bytes actually read. - buffer.resize(cur + n, 0_u8); - } - - // SAFETY: We loaded from an auxv file into the buffer. - unsafe { init_from_aux_iter(AuxPointer(buffer.as_ptr().cast())) } -} - -/// Process auxv entries from the auxv array pointed to by `auxp`. -/// -/// # Safety -/// -/// This must be passed a pointer to an auxv array. -/// -/// The buffer contains `Elf_aux_t` elements, though it need not be aligned; -/// function uses `read_unaligned` to read from it. -#[cold] -#[must_use] -unsafe fn init_from_aux_iter(aux_iter: impl Iterator<Item = Elf_auxv_t>) -> Option<()> { - let mut pagesz = 0; - let mut clktck = 0; - let mut hwcap = 0; - let mut hwcap2 = 0; - let mut execfn = null_mut(); - let mut sysinfo_ehdr = null_mut(); - #[cfg(feature = "runtime")] - let mut secure = 0; - #[cfg(feature = "runtime")] - let mut phdr = null_mut(); - #[cfg(feature = "runtime")] - let mut phnum = 0; - #[cfg(feature = "runtime")] - let mut phent = 0; - #[cfg(feature = "runtime")] - let mut entry = 0; - #[cfg(feature = "runtime")] - let mut uid = None; - #[cfg(feature = "runtime")] - let mut euid = None; - #[cfg(feature = "runtime")] - let mut gid = None; - #[cfg(feature = "runtime")] - let mut egid = None; - #[cfg(feature = "runtime")] - let mut random = null_mut(); - - for Elf_auxv_t { a_type, a_val } in aux_iter { - match a_type as _ { - AT_PAGESZ => pagesz = a_val as usize, - AT_CLKTCK => clktck = a_val as usize, - AT_HWCAP => hwcap = a_val as usize, - AT_HWCAP2 => hwcap2 = a_val as usize, - AT_EXECFN => execfn = check_raw_pointer::<c::c_char>(a_val as *mut _)?.as_ptr(), - AT_SYSINFO_EHDR => sysinfo_ehdr = check_elf_base(a_val as *mut _)?.as_ptr(), - - AT_BASE => { - // The `AT_BASE` value can be NULL in a static executable that - // doesn't use a dynamic linker. If so, ignore it. - if !a_val.is_null() { - let _ = check_elf_base(a_val.cast())?; - } - } - - #[cfg(feature = "runtime")] - AT_SECURE => secure = (a_val as usize != 0) as u8 + 1, - #[cfg(feature = "runtime")] - AT_UID => uid = Some(a_val), - #[cfg(feature = "runtime")] - AT_EUID => euid = Some(a_val), - #[cfg(feature = "runtime")] - AT_GID => gid = Some(a_val), - #[cfg(feature = "runtime")] - AT_EGID => egid = Some(a_val), - #[cfg(feature = "runtime")] - AT_PHDR => phdr = check_raw_pointer::<Elf_Phdr>(a_val as *mut _)?.as_ptr(), - #[cfg(feature = "runtime")] - AT_PHNUM => phnum = a_val as usize, - #[cfg(feature = "runtime")] - AT_PHENT => phent = a_val as usize, - #[cfg(feature = "runtime")] - AT_ENTRY => entry = a_val as usize, - #[cfg(feature = "runtime")] - AT_RANDOM => random = check_raw_pointer::<[u8; 16]>(a_val as *mut _)?.as_ptr(), - - AT_NULL => break, - _ => (), - } - } - - #[cfg(feature = "runtime")] - assert_eq!(phent, size_of::<Elf_Phdr>()); - - // If we're running set-uid or set-gid, enable “secure execution” mode, - // which doesn't do much, but users may be depending on the things that - // it does do. - #[cfg(feature = "runtime")] - if uid != euid || gid != egid { - secure = 2; - } - - // The base and sysinfo_ehdr (if present) matches our platform. Accept the - // aux values. - PAGE_SIZE.store(pagesz, Relaxed); - CLOCK_TICKS_PER_SECOND.store(clktck, Relaxed); - HWCAP.store(hwcap, Relaxed); - HWCAP2.store(hwcap2, Relaxed); - EXECFN.store(execfn, Relaxed); - SYSINFO_EHDR.store(sysinfo_ehdr, Relaxed); - #[cfg(feature = "runtime")] - SECURE.store(secure, Relaxed); - #[cfg(feature = "runtime")] - PHDR.store(phdr, Relaxed); - #[cfg(feature = "runtime")] - PHNUM.store(phnum, Relaxed); - #[cfg(feature = "runtime")] - ENTRY.store(entry, Relaxed); - #[cfg(feature = "runtime")] - RANDOM.store(random, Relaxed); - - Some(()) -} - -/// Check that `base` is a valid pointer to the kernel-provided vDSO. -/// -/// `base` is some value we got from a `AT_SYSINFO_EHDR` aux record somewhere, -/// which hopefully holds the value of the kernel-provided vDSO in memory. Do a -/// series of checks to be as sure as we can that it's safe to use. -#[cold] -#[must_use] -unsafe fn check_elf_base(base: *const Elf_Ehdr) -> Option<NonNull<Elf_Ehdr>> { - // If we're reading a 64-bit auxv on a 32-bit platform, we'll see a zero - // `a_val` because `AT_*` values are never greater than `u32::MAX`. Zero is - // used by libc's `getauxval` to indicate errors, so it should never be a - // valid value. - if base.is_null() { - return None; - } - - let hdr = match check_raw_pointer::<Elf_Ehdr>(base as *mut _) { - Some(hdr) => hdr, - None => return None, - }; - - let hdr = hdr.as_ref(); - if hdr.e_ident[..SELFMAG] != ELFMAG { - return None; // Wrong ELF magic - } - if !matches!(hdr.e_ident[EI_OSABI], ELFOSABI_SYSV | ELFOSABI_LINUX) { - return None; // Unrecognized ELF OS ABI - } - if hdr.e_ident[EI_ABIVERSION] != ELFABIVERSION { - return None; // Unrecognized ELF ABI version - } - if hdr.e_type != ET_DYN { - return None; // Wrong ELF type - } - - // If ELF is extended, we'll need to adjust. - if hdr.e_ident[EI_VERSION] != EV_CURRENT - || hdr.e_ehsize as usize != size_of::<Elf_Ehdr>() - || hdr.e_phentsize as usize != size_of::<Elf_Phdr>() - { - return None; - } - // We don't currently support extra-large numbers of segments. - if hdr.e_phnum == PN_XNUM { - return None; - } - - // If `e_phoff` is zero, it's more likely that we're looking at memory that - // has been zeroed than that the kernel has somehow aliased the `Ehdr` and - // the `Phdr`. - if hdr.e_phoff < size_of::<Elf_Ehdr>() { - return None; - } - - // Verify that the `EI_CLASS`/`EI_DATA`/`e_machine` fields match the - // architecture we're running as. This helps catch cases where we're - // running under QEMU. - if hdr.e_ident[EI_CLASS] != ELFCLASS { - return None; // Wrong ELF class - } - if hdr.e_ident[EI_DATA] != ELFDATA { - return None; // Wrong ELF data - } - if hdr.e_machine != EM_CURRENT { - return None; // Wrong machine type - } - - Some(NonNull::new_unchecked(as_ptr(hdr) as *mut _)) -} - -// Aux reading utilities - -// Read auxv records from an array in memory. -struct AuxPointer(*const Elf_auxv_t); - -impl Iterator for AuxPointer { - type Item = Elf_auxv_t; - - #[cold] - fn next(&mut self) -> Option<Self::Item> { - unsafe { - let value = read_unaligned(self.0); - self.0 = self.0.add(1); - Some(value) - } - } -} - -// Read auxv records from a file. -#[cfg(not(feature = "alloc"))] -struct AuxFile(OwnedFd); - -#[cfg(not(feature = "alloc"))] -impl Iterator for AuxFile { - type Item = Elf_auxv_t; - - // This implementation does lots of `read`s and it isn't amazing, but - // hopefully we won't use it often. - #[cold] - fn next(&mut self) -> Option<Self::Item> { - let mut buf = [0_u8; size_of::<Self::Item>()]; - let mut slice = &mut buf[..]; - while !slice.is_empty() { - match crate::io::read(&self.0, slice) { - Ok(0) => panic!("unexpected end of auxv file"), - Ok(n) => slice = &mut slice[n..], - Err(crate::io::Errno::INTR) => continue, - Err(err) => panic!("{:?}", err), - } - } - Some(unsafe { read_unaligned(buf.as_ptr().cast()) }) - } -} diff --git a/vendor/rustix/src/backend/linux_raw/param/init.rs b/vendor/rustix/src/backend/linux_raw/param/init.rs deleted file mode 100644 index fe29e9c..0000000 --- a/vendor/rustix/src/backend/linux_raw/param/init.rs +++ /dev/null @@ -1,171 +0,0 @@ -//! Linux auxv `init` function, for "use-explicitly-provided-auxv" mode. -//! -//! # Safety -//! -//! This uses raw pointers to locate and read the kernel-provided auxv array. -#![allow(unsafe_code)] - -use crate::backend::c; -#[cfg(feature = "param")] -use crate::ffi::CStr; -use core::ffi::c_void; -use core::ptr::{null_mut, read, NonNull}; -#[cfg(feature = "runtime")] -use core::sync::atomic::AtomicBool; -use core::sync::atomic::{AtomicPtr, AtomicUsize, Ordering}; -use linux_raw_sys::elf::*; -use linux_raw_sys::general::{ - AT_CLKTCK, AT_EXECFN, AT_HWCAP, AT_HWCAP2, AT_NULL, AT_PAGESZ, AT_SYSINFO_EHDR, -}; -#[cfg(feature = "runtime")] -use linux_raw_sys::general::{AT_ENTRY, AT_PHDR, AT_PHENT, AT_PHNUM, AT_RANDOM, AT_SECURE}; - -#[cfg(feature = "param")] -#[inline] -pub(crate) fn page_size() -> usize { - unsafe { PAGE_SIZE.load(Ordering::Relaxed) } -} - -#[cfg(feature = "param")] -#[inline] -pub(crate) fn clock_ticks_per_second() -> u64 { - unsafe { CLOCK_TICKS_PER_SECOND.load(Ordering::Relaxed) as u64 } -} - -#[cfg(feature = "param")] -#[inline] -pub(crate) fn linux_hwcap() -> (usize, usize) { - unsafe { - ( - HWCAP.load(Ordering::Relaxed), - HWCAP2.load(Ordering::Relaxed), - ) - } -} - -#[cfg(feature = "param")] -#[inline] -pub(crate) fn linux_execfn() -> &'static CStr { - let execfn = unsafe { EXECFN.load(Ordering::Relaxed) }; - - // SAFETY: We initialize `EXECFN` to a valid `CStr` pointer, and we assume - // the `AT_EXECFN` value provided by the kernel points to a valid C string. - unsafe { CStr::from_ptr(execfn.cast()) } -} - -#[cfg(feature = "runtime")] -#[inline] -pub(crate) fn linux_secure() -> bool { - unsafe { SECURE.load(Ordering::Relaxed) } -} - -#[cfg(feature = "runtime")] -#[inline] -pub(crate) fn exe_phdrs() -> (*const c_void, usize, usize) { - unsafe { - ( - PHDR.load(Ordering::Relaxed).cast(), - PHENT.load(Ordering::Relaxed), - PHNUM.load(Ordering::Relaxed), - ) - } -} - -/// `AT_SYSINFO_EHDR` isn't present on all platforms in all configurations, so -/// if we don't see it, this function returns a null pointer. -#[inline] -pub(in super::super) fn sysinfo_ehdr() -> *const Elf_Ehdr { - unsafe { SYSINFO_EHDR.load(Ordering::Relaxed) } -} - -#[cfg(feature = "runtime")] -#[inline] -pub(crate) fn entry() -> usize { - unsafe { ENTRY.load(Ordering::Relaxed) } -} - -#[cfg(feature = "runtime")] -#[inline] -pub(crate) fn random() -> *const [u8; 16] { - unsafe { RANDOM.load(Ordering::Relaxed) } -} - -static mut PAGE_SIZE: AtomicUsize = AtomicUsize::new(0); -static mut CLOCK_TICKS_PER_SECOND: AtomicUsize = AtomicUsize::new(0); -static mut HWCAP: AtomicUsize = AtomicUsize::new(0); -static mut HWCAP2: AtomicUsize = AtomicUsize::new(0); -static mut SYSINFO_EHDR: AtomicPtr<Elf_Ehdr> = AtomicPtr::new(null_mut()); -// Initialize `EXECFN` to a valid `CStr` pointer so that we don't need to check -// for null on every `execfn` call. -static mut EXECFN: AtomicPtr<c::c_char> = AtomicPtr::new(b"\0".as_ptr() as _); -#[cfg(feature = "runtime")] -static mut SECURE: AtomicBool = AtomicBool::new(false); -// Use `dangling` so that we can always treat it like an empty slice. -#[cfg(feature = "runtime")] -static mut PHDR: AtomicPtr<Elf_Phdr> = AtomicPtr::new(NonNull::dangling().as_ptr()); -#[cfg(feature = "runtime")] -static mut PHENT: AtomicUsize = AtomicUsize::new(0); -#[cfg(feature = "runtime")] -static mut PHNUM: AtomicUsize = AtomicUsize::new(0); -#[cfg(feature = "runtime")] -static mut ENTRY: AtomicUsize = AtomicUsize::new(0); -#[cfg(feature = "runtime")] -static mut RANDOM: AtomicPtr<[u8; 16]> = AtomicPtr::new(NonNull::dangling().as_ptr()); - -/// When "use-explicitly-provided-auxv" is enabled, we export a function to be -/// called during initialization, and passed a pointer to the original -/// environment variable block set up by the OS. -pub(crate) unsafe fn init(envp: *mut *mut u8) { - init_from_envp(envp); -} - -/// # Safety -/// -/// This must be passed a pointer to the environment variable buffer -/// provided by the kernel, which is followed in memory by the auxv array. -unsafe fn init_from_envp(mut envp: *mut *mut u8) { - while !(*envp).is_null() { - envp = envp.add(1); - } - init_from_auxp(envp.add(1).cast()) -} - -/// Process auxv entries from the auxv array pointed to by `auxp`. -/// -/// # Safety -/// -/// This must be passed a pointer to an auxv array. -/// -/// The buffer contains `Elf_aux_t` elements, though it need not be aligned; -/// function uses `read_unaligned` to read from it. -unsafe fn init_from_auxp(mut auxp: *const Elf_auxv_t) { - loop { - let Elf_auxv_t { a_type, a_val } = read(auxp); - - match a_type as _ { - AT_PAGESZ => PAGE_SIZE.store(a_val as usize, Ordering::Relaxed), - AT_CLKTCK => CLOCK_TICKS_PER_SECOND.store(a_val as usize, Ordering::Relaxed), - AT_HWCAP => HWCAP.store(a_val as usize, Ordering::Relaxed), - AT_HWCAP2 => HWCAP2.store(a_val as usize, Ordering::Relaxed), - AT_EXECFN => EXECFN.store(a_val.cast::<c::c_char>(), Ordering::Relaxed), - AT_SYSINFO_EHDR => SYSINFO_EHDR.store(a_val.cast::<Elf_Ehdr>(), Ordering::Relaxed), - - #[cfg(feature = "runtime")] - AT_SECURE => SECURE.store(a_val as usize != 0, Ordering::Relaxed), - #[cfg(feature = "runtime")] - AT_PHDR => PHDR.store(a_val.cast::<Elf_Phdr>(), Ordering::Relaxed), - #[cfg(feature = "runtime")] - AT_PHNUM => PHNUM.store(a_val as usize, Ordering::Relaxed), - #[cfg(feature = "runtime")] - AT_PHENT => PHENT.store(a_val as usize, Ordering::Relaxed), - #[cfg(feature = "runtime")] - AT_ENTRY => ENTRY.store(a_val as usize, Ordering::Relaxed), - #[cfg(feature = "runtime")] - AT_RANDOM => RANDOM.store(a_val.cast::<[u8; 16]>(), Ordering::Relaxed), - - AT_NULL => break, - _ => (), - } - auxp = auxp.add(1); - } -} diff --git a/vendor/rustix/src/backend/linux_raw/param/libc_auxv.rs b/vendor/rustix/src/backend/linux_raw/param/libc_auxv.rs deleted file mode 100644 index cfdd7a5..0000000 --- a/vendor/rustix/src/backend/linux_raw/param/libc_auxv.rs +++ /dev/null @@ -1,175 +0,0 @@ -//! Linux auxv support, using libc. -//! -//! # Safety -//! -//! This uses raw pointers to locate and read the kernel-provided auxv array. -#![allow(unsafe_code)] - -use crate::backend::c; -#[cfg(feature = "param")] -use crate::ffi::CStr; -#[cfg(not(feature = "runtime"))] -use core::ptr::null; -use linux_raw_sys::elf::*; - -// `getauxval` wasn't supported in glibc until 2.16. Also this lets us use -// `*mut` as the return type to preserve strict provenance. -#[cfg(not(feature = "runtime"))] -weak!(fn getauxval(c::c_ulong) -> *mut c::c_void); - -// With the "runtime" feature, go ahead and depend on `getauxval` existing so -// that we never fail. -#[cfg(feature = "runtime")] -extern "C" { - fn getauxval(type_: c::c_ulong) -> *mut c::c_void; -} - -#[cfg(feature = "runtime")] -const AT_PHDR: c::c_ulong = 3; -#[cfg(feature = "runtime")] -const AT_PHENT: c::c_ulong = 4; -#[cfg(feature = "runtime")] -const AT_PHNUM: c::c_ulong = 5; -#[cfg(feature = "runtime")] -const AT_ENTRY: c::c_ulong = 9; -const AT_HWCAP: c::c_ulong = 16; -#[cfg(feature = "runtime")] -const AT_RANDOM: c::c_ulong = 25; -const AT_HWCAP2: c::c_ulong = 26; -const AT_SECURE: c::c_ulong = 23; -const AT_EXECFN: c::c_ulong = 31; -const AT_SYSINFO_EHDR: c::c_ulong = 33; - -// Declare `sysconf` ourselves so that we don't depend on all of libc just for -// this. -extern "C" { - fn sysconf(name: c::c_int) -> c::c_long; -} - -#[cfg(target_os = "android")] -const _SC_PAGESIZE: c::c_int = 39; -#[cfg(target_os = "linux")] -const _SC_PAGESIZE: c::c_int = 30; -#[cfg(target_os = "android")] -const _SC_CLK_TCK: c::c_int = 6; -#[cfg(target_os = "linux")] -const _SC_CLK_TCK: c::c_int = 2; - -#[test] -fn test_abi() { - const_assert_eq!(self::_SC_PAGESIZE, ::libc::_SC_PAGESIZE); - const_assert_eq!(self::_SC_CLK_TCK, ::libc::_SC_CLK_TCK); - const_assert_eq!(self::AT_HWCAP, ::libc::AT_HWCAP); - const_assert_eq!(self::AT_HWCAP2, ::libc::AT_HWCAP2); - const_assert_eq!(self::AT_EXECFN, ::libc::AT_EXECFN); - const_assert_eq!(self::AT_SECURE, ::libc::AT_SECURE); - const_assert_eq!(self::AT_SYSINFO_EHDR, ::libc::AT_SYSINFO_EHDR); - #[cfg(feature = "runtime")] - const_assert_eq!(self::AT_PHDR, ::libc::AT_PHDR); - #[cfg(feature = "runtime")] - const_assert_eq!(self::AT_PHNUM, ::libc::AT_PHNUM); - #[cfg(feature = "runtime")] - const_assert_eq!(self::AT_ENTRY, ::libc::AT_ENTRY); - #[cfg(feature = "runtime")] - const_assert_eq!(self::AT_RANDOM, ::libc::AT_RANDOM); -} - -#[cfg(feature = "param")] -#[inline] -pub(crate) fn page_size() -> usize { - unsafe { sysconf(_SC_PAGESIZE) as usize } -} - -#[cfg(feature = "param")] -#[inline] -pub(crate) fn clock_ticks_per_second() -> u64 { - unsafe { sysconf(_SC_CLK_TCK) as u64 } -} - -#[cfg(feature = "param")] -#[inline] -pub(crate) fn linux_hwcap() -> (usize, usize) { - #[cfg(not(feature = "runtime"))] - unsafe { - if let Some(libc_getauxval) = getauxval.get() { - let hwcap = libc_getauxval(AT_HWCAP) as usize; - let hwcap2 = libc_getauxval(AT_HWCAP2) as usize; - (hwcap, hwcap2) - } else { - (0, 0) - } - } - - #[cfg(feature = "runtime")] - unsafe { - let hwcap = getauxval(AT_HWCAP) as usize; - let hwcap2 = getauxval(AT_HWCAP2) as usize; - (hwcap, hwcap2) - } -} - -#[cfg(feature = "param")] -#[inline] -pub(crate) fn linux_execfn() -> &'static CStr { - #[cfg(not(feature = "runtime"))] - unsafe { - if let Some(libc_getauxval) = getauxval.get() { - CStr::from_ptr(libc_getauxval(AT_EXECFN).cast()) - } else { - cstr!("") - } - } - - #[cfg(feature = "runtime")] - unsafe { - CStr::from_ptr(getauxval(AT_EXECFN).cast()) - } -} - -#[cfg(feature = "runtime")] -#[inline] -pub(crate) fn linux_secure() -> bool { - unsafe { getauxval(AT_SECURE) as usize != 0 } -} - -#[cfg(feature = "runtime")] -#[inline] -pub(crate) fn exe_phdrs() -> (*const c::c_void, usize, usize) { - unsafe { - let phdr = getauxval(AT_PHDR) as *const c::c_void; - let phent = getauxval(AT_PHENT) as usize; - let phnum = getauxval(AT_PHNUM) as usize; - (phdr, phent, phnum) - } -} - -/// `AT_SYSINFO_EHDR` isn't present on all platforms in all configurations, so -/// if we don't see it, this function returns a null pointer. -#[inline] -pub(in super::super) fn sysinfo_ehdr() -> *const Elf_Ehdr { - #[cfg(not(feature = "runtime"))] - unsafe { - if let Some(libc_getauxval) = getauxval.get() { - libc_getauxval(AT_SYSINFO_EHDR) as *const Elf_Ehdr - } else { - null() - } - } - - #[cfg(feature = "runtime")] - unsafe { - getauxval(AT_SYSINFO_EHDR) as *const Elf_Ehdr - } -} - -#[cfg(feature = "runtime")] -#[inline] -pub(crate) fn entry() -> usize { - unsafe { getauxval(AT_ENTRY) as usize } -} - -#[cfg(feature = "runtime")] -#[inline] -pub(crate) fn random() -> *const [u8; 16] { - unsafe { getauxval(AT_RANDOM) as *const [u8; 16] } -} diff --git a/vendor/rustix/src/backend/linux_raw/param/mod.rs b/vendor/rustix/src/backend/linux_raw/param/mod.rs deleted file mode 100644 index 365f016..0000000 --- a/vendor/rustix/src/backend/linux_raw/param/mod.rs +++ /dev/null @@ -1,15 +0,0 @@ -// With "use-explicitly-provided-auxv" enabled, we expect to be initialized -// with an explicit `rustix::param::init` call. -// -// With "use-libc-auxv" enabled, use libc's `getauxval`. -// -// Otherwise, we read aux values from /proc/self/auxv. -#[cfg_attr(feature = "use-explicitly-provided-auxv", path = "init.rs")] -#[cfg_attr( - all( - not(feature = "use-explicitly-provided-auxv"), - feature = "use-libc-auxv" - ), - path = "libc_auxv.rs" -)] -pub(crate) mod auxv; diff --git a/vendor/rustix/src/backend/linux_raw/pid/mod.rs b/vendor/rustix/src/backend/linux_raw/pid/mod.rs deleted file mode 100644 index ef944f0..0000000 --- a/vendor/rustix/src/backend/linux_raw/pid/mod.rs +++ /dev/null @@ -1 +0,0 @@ -pub(crate) mod syscalls; diff --git a/vendor/rustix/src/backend/linux_raw/pid/syscalls.rs b/vendor/rustix/src/backend/linux_raw/pid/syscalls.rs deleted file mode 100644 index 9665ab3..0000000 --- a/vendor/rustix/src/backend/linux_raw/pid/syscalls.rs +++ /dev/null @@ -1,17 +0,0 @@ -//! linux_raw syscalls for PIDs -//! -//! # Safety -//! -//! See the `rustix::backend` module documentation for details. -#![allow(unsafe_code, clippy::undocumented_unsafe_blocks)] - -use crate::backend::conv::ret_usize_infallible; -use crate::pid::{Pid, RawPid}; - -#[inline] -pub(crate) fn getpid() -> Pid { - unsafe { - let pid = ret_usize_infallible(syscall_readonly!(__NR_getpid)) as RawPid; - Pid::from_raw_unchecked(pid) - } -} diff --git a/vendor/rustix/src/backend/linux_raw/pipe/mod.rs b/vendor/rustix/src/backend/linux_raw/pipe/mod.rs deleted file mode 100644 index 1e0181a..0000000 --- a/vendor/rustix/src/backend/linux_raw/pipe/mod.rs +++ /dev/null @@ -1,2 +0,0 @@ -pub(crate) mod syscalls; -pub(crate) mod types; diff --git a/vendor/rustix/src/backend/linux_raw/pipe/syscalls.rs b/vendor/rustix/src/backend/linux_raw/pipe/syscalls.rs deleted file mode 100644 index ec3e459..0000000 --- a/vendor/rustix/src/backend/linux_raw/pipe/syscalls.rs +++ /dev/null @@ -1,135 +0,0 @@ -//! linux_raw syscalls supporting `rustix::pipe`. -//! -//! # Safety -//! -//! See the `rustix::backend` module documentation for details. -#![allow(unsafe_code, clippy::undocumented_unsafe_blocks)] - -use crate::backend::conv::{c_int, c_uint, opt_mut, pass_usize, ret, ret_usize, slice}; -use crate::backend::{c, MAX_IOV}; -use crate::fd::{BorrowedFd, OwnedFd}; -use crate::io; -use crate::pipe::{IoSliceRaw, PipeFlags, SpliceFlags}; -use core::cmp; -use core::mem::MaybeUninit; -use linux_raw_sys::general::{F_GETPIPE_SZ, F_SETPIPE_SZ}; - -#[inline] -pub(crate) fn pipe() -> io::Result<(OwnedFd, OwnedFd)> { - // aarch64 and risc64 omit `__NR_pipe`. On mips, `__NR_pipe` uses a special - // calling convention, but using it is not worth complicating our syscall - // wrapping infrastructure at this time. - #[cfg(any( - target_arch = "aarch64", - target_arch = "mips", - target_arch = "mips32r6", - target_arch = "mips64", - target_arch = "mips64r6", - target_arch = "riscv64", - ))] - { - pipe_with(PipeFlags::empty()) - } - #[cfg(not(any( - target_arch = "aarch64", - target_arch = "mips", - target_arch = "mips32r6", - target_arch = "mips64", - target_arch = "mips64r6", - target_arch = "riscv64", - )))] - unsafe { - let mut result = MaybeUninit::<[OwnedFd; 2]>::uninit(); - ret(syscall!(__NR_pipe, &mut result))?; - let [p0, p1] = result.assume_init(); - Ok((p0, p1)) - } -} - -#[inline] -pub(crate) fn pipe_with(flags: PipeFlags) -> io::Result<(OwnedFd, OwnedFd)> { - unsafe { - let mut result = MaybeUninit::<[OwnedFd; 2]>::uninit(); - ret(syscall!(__NR_pipe2, &mut result, flags))?; - let [p0, p1] = result.assume_init(); - Ok((p0, p1)) - } -} - -#[inline] -pub fn splice( - fd_in: BorrowedFd<'_>, - off_in: Option<&mut u64>, - fd_out: BorrowedFd<'_>, - off_out: Option<&mut u64>, - len: usize, - flags: SpliceFlags, -) -> io::Result<usize> { - unsafe { - ret_usize(syscall!( - __NR_splice, - fd_in, - opt_mut(off_in), - fd_out, - opt_mut(off_out), - pass_usize(len), - flags - )) - } -} - -#[inline] -pub unsafe fn vmsplice( - fd: BorrowedFd<'_>, - bufs: &[IoSliceRaw<'_>], - flags: SpliceFlags, -) -> io::Result<usize> { - let (bufs_addr, bufs_len) = slice(&bufs[..cmp::min(bufs.len(), MAX_IOV)]); - ret_usize(syscall!(__NR_vmsplice, fd, bufs_addr, bufs_len, flags)) -} - -#[inline] -pub fn tee( - fd_in: BorrowedFd<'_>, - fd_out: BorrowedFd<'_>, - len: usize, - flags: SpliceFlags, -) -> io::Result<usize> { - unsafe { ret_usize(syscall!(__NR_tee, fd_in, fd_out, pass_usize(len), flags)) } -} - -#[inline] -pub(crate) fn fcntl_getpipe_sz(fd: BorrowedFd<'_>) -> io::Result<usize> { - #[cfg(target_pointer_width = "32")] - unsafe { - ret_usize(syscall_readonly!(__NR_fcntl64, fd, c_uint(F_GETPIPE_SZ))) - } - #[cfg(target_pointer_width = "64")] - unsafe { - ret_usize(syscall_readonly!(__NR_fcntl, fd, c_uint(F_GETPIPE_SZ))) - } -} - -#[inline] -pub(crate) fn fcntl_setpipe_sz(fd: BorrowedFd<'_>, size: usize) -> io::Result<()> { - let size: c::c_int = size.try_into().map_err(|_| io::Errno::PERM)?; - - #[cfg(target_pointer_width = "32")] - unsafe { - ret(syscall_readonly!( - __NR_fcntl64, - fd, - c_uint(F_SETPIPE_SZ), - c_int(size) - )) - } - #[cfg(target_pointer_width = "64")] - unsafe { - ret(syscall_readonly!( - __NR_fcntl, - fd, - c_uint(F_SETPIPE_SZ), - c_int(size) - )) - } -} diff --git a/vendor/rustix/src/backend/linux_raw/pipe/types.rs b/vendor/rustix/src/backend/linux_raw/pipe/types.rs deleted file mode 100644 index 2d1ed9a..0000000 --- a/vendor/rustix/src/backend/linux_raw/pipe/types.rs +++ /dev/null @@ -1,80 +0,0 @@ -use crate::backend::c; -use bitflags::bitflags; -use core::marker::PhantomData; - -bitflags! { - /// `O_*` constants for use with [`pipe_with`]. - /// - /// [`pipe_with`]: crate::pipe::pipe_with - #[repr(transparent)] - #[derive(Copy, Clone, Eq, PartialEq, Hash, Debug)] - pub struct PipeFlags: c::c_uint { - /// `O_CLOEXEC` - const CLOEXEC = linux_raw_sys::general::O_CLOEXEC; - /// `O_DIRECT` - const DIRECT = linux_raw_sys::general::O_DIRECT; - /// `O_NONBLOCK` - const NONBLOCK = linux_raw_sys::general::O_NONBLOCK; - - /// <https://docs.rs/bitflags/*/bitflags/#externally-defined-flags> - const _ = !0; - } -} - -bitflags! { - /// `SPLICE_F_*` constants for use with [`splice`], [`vmsplice`], and - /// [`tee`]. - #[repr(transparent)] - #[derive(Copy, Clone, Eq, PartialEq, Hash, Debug)] - pub struct SpliceFlags: c::c_uint { - /// `SPLICE_F_MOVE` - const MOVE = linux_raw_sys::general::SPLICE_F_MOVE; - /// `SPLICE_F_NONBLOCK` - const NONBLOCK = linux_raw_sys::general::SPLICE_F_NONBLOCK; - /// `SPLICE_F_MORE` - const MORE = linux_raw_sys::general::SPLICE_F_MORE; - /// `SPLICE_F_GIFT` - const GIFT = linux_raw_sys::general::SPLICE_F_GIFT; - - /// <https://docs.rs/bitflags/*/bitflags/#externally-defined-flags> - const _ = !0; - } -} - -/// A buffer type for use with [`vmsplice`]. -/// -/// It is guaranteed to be ABI compatible with the iovec type on Unix platforms -/// and `WSABUF` on Windows. Unlike `IoSlice` and `IoSliceMut` it is -/// semantically like a raw pointer, and therefore can be shared or mutated as -/// needed. -/// -/// [`vmsplice`]: crate::pipe::vmsplice -#[repr(transparent)] -pub struct IoSliceRaw<'a> { - _buf: c::iovec, - _lifetime: PhantomData<&'a ()>, -} - -impl<'a> IoSliceRaw<'a> { - /// Creates a new `IoSlice` wrapping a byte slice. - pub fn from_slice(buf: &'a [u8]) -> Self { - IoSliceRaw { - _buf: c::iovec { - iov_base: (buf.as_ptr() as *mut u8).cast::<c::c_void>(), - iov_len: buf.len() as _, - }, - _lifetime: PhantomData, - } - } - - /// Creates a new `IoSlice` wrapping a mutable byte slice. - pub fn from_slice_mut(buf: &'a mut [u8]) -> Self { - IoSliceRaw { - _buf: c::iovec { - iov_base: buf.as_mut_ptr().cast::<c::c_void>(), - iov_len: buf.len() as _, - }, - _lifetime: PhantomData, - } - } -} diff --git a/vendor/rustix/src/backend/linux_raw/prctl/mod.rs b/vendor/rustix/src/backend/linux_raw/prctl/mod.rs deleted file mode 100644 index ef944f0..0000000 --- a/vendor/rustix/src/backend/linux_raw/prctl/mod.rs +++ /dev/null @@ -1 +0,0 @@ -pub(crate) mod syscalls; diff --git a/vendor/rustix/src/backend/linux_raw/prctl/syscalls.rs b/vendor/rustix/src/backend/linux_raw/prctl/syscalls.rs deleted file mode 100644 index 1410d51..0000000 --- a/vendor/rustix/src/backend/linux_raw/prctl/syscalls.rs +++ /dev/null @@ -1,21 +0,0 @@ -//! linux_raw syscalls supporting modules that use `prctl`. -//! -//! # Safety -//! -//! See the `rustix::backend` module documentation for details. -#![allow(unsafe_code, clippy::undocumented_unsafe_blocks)] - -use crate::backend::c; -use crate::backend::conv::{c_int, ret_c_int}; -use crate::io; - -#[inline] -pub(crate) unsafe fn prctl( - option: c::c_int, - arg2: *mut c::c_void, - arg3: *mut c::c_void, - arg4: *mut c::c_void, - arg5: *mut c::c_void, -) -> io::Result<c::c_int> { - ret_c_int(syscall!(__NR_prctl, c_int(option), arg2, arg3, arg4, arg5)) -} diff --git a/vendor/rustix/src/backend/linux_raw/process/cpu_set.rs b/vendor/rustix/src/backend/linux_raw/process/cpu_set.rs deleted file mode 100644 index 35146cf..0000000 --- a/vendor/rustix/src/backend/linux_raw/process/cpu_set.rs +++ /dev/null @@ -1,46 +0,0 @@ -//! Rust implementation of the `CPU_*` macro API. - -#![allow(non_snake_case)] - -use super::types::RawCpuSet; -use core::mem::size_of_val; - -#[inline] -pub(crate) fn CPU_SET(cpu: usize, cpuset: &mut RawCpuSet) { - let size_in_bits = 8 * size_of_val(&cpuset.bits[0]); // 32, 64 etc - let (idx, offset) = (cpu / size_in_bits, cpu % size_in_bits); - cpuset.bits[idx] |= 1 << offset -} - -#[inline] -pub(crate) fn CPU_ZERO(cpuset: &mut RawCpuSet) { - cpuset.bits.fill(0) -} - -#[inline] -pub(crate) fn CPU_CLR(cpu: usize, cpuset: &mut RawCpuSet) { - let size_in_bits = 8 * size_of_val(&cpuset.bits[0]); // 32, 64 etc - let (idx, offset) = (cpu / size_in_bits, cpu % size_in_bits); - cpuset.bits[idx] &= !(1 << offset) -} - -#[inline] -pub(crate) fn CPU_ISSET(cpu: usize, cpuset: &RawCpuSet) -> bool { - let size_in_bits = 8 * size_of_val(&cpuset.bits[0]); - let (idx, offset) = (cpu / size_in_bits, cpu % size_in_bits); - (cpuset.bits[idx] & (1 << offset)) != 0 -} - -#[inline] -pub(crate) fn CPU_COUNT_S(size_in_bytes: usize, cpuset: &RawCpuSet) -> u32 { - let size_of_mask = size_of_val(&cpuset.bits[0]); - let idx = size_in_bytes / size_of_mask; - cpuset.bits[..idx] - .iter() - .fold(0, |acc, i| acc + i.count_ones()) -} - -#[inline] -pub(crate) fn CPU_COUNT(cpuset: &RawCpuSet) -> u32 { - CPU_COUNT_S(core::mem::size_of::<RawCpuSet>(), cpuset) -} diff --git a/vendor/rustix/src/backend/linux_raw/process/mod.rs b/vendor/rustix/src/backend/linux_raw/process/mod.rs deleted file mode 100644 index 9b2c25f..0000000 --- a/vendor/rustix/src/backend/linux_raw/process/mod.rs +++ /dev/null @@ -1,4 +0,0 @@ -pub(crate) mod cpu_set; -pub(crate) mod syscalls; -pub(crate) mod types; -pub(crate) mod wait; diff --git a/vendor/rustix/src/backend/linux_raw/process/syscalls.rs b/vendor/rustix/src/backend/linux_raw/process/syscalls.rs deleted file mode 100644 index bc00af9..0000000 --- a/vendor/rustix/src/backend/linux_raw/process/syscalls.rs +++ /dev/null @@ -1,603 +0,0 @@ -//! linux_raw syscalls supporting `rustix::process`. -//! -//! # Safety -//! -//! See the `rustix::backend` module documentation for details. -#![allow(unsafe_code, clippy::undocumented_unsafe_blocks)] - -use super::types::RawCpuSet; -use crate::backend::c; -#[cfg(all(feature = "alloc", feature = "fs"))] -use crate::backend::conv::slice_mut; -use crate::backend::conv::{ - by_mut, by_ref, c_int, c_uint, negative_pid, pass_usize, raw_fd, ret, ret_c_int, - ret_c_int_infallible, ret_c_uint, ret_infallible, ret_owned_fd, ret_usize, size_of, - slice_just_addr, zero, -}; -use crate::fd::{AsRawFd, BorrowedFd, OwnedFd, RawFd}; -#[cfg(feature = "fs")] -use crate::ffi::CStr; -use crate::io; -use crate::pid::RawPid; -use crate::process::{ - Cpuid, MembarrierCommand, MembarrierQuery, Pid, PidfdFlags, PidfdGetfdFlags, Resource, Rlimit, - Uid, WaitId, WaitOptions, WaitStatus, WaitidOptions, WaitidStatus, -}; -use crate::signal::Signal; -use crate::utils::as_mut_ptr; -use core::mem::MaybeUninit; -use core::ptr::{null, null_mut}; -use linux_raw_sys::general::{ - membarrier_cmd, membarrier_cmd_flag, rlimit64, PRIO_PGRP, PRIO_PROCESS, PRIO_USER, - RLIM64_INFINITY, -}; -#[cfg(feature = "fs")] -use {crate::backend::conv::ret_c_uint_infallible, crate::fs::Mode}; -#[cfg(feature = "alloc")] -use {crate::backend::conv::slice_just_addr_mut, crate::process::Gid}; - -// `sched_getcpu` has special optimizations via the vDSO on some architectures. -#[cfg(any( - target_arch = "x86_64", - target_arch = "x86", - target_arch = "riscv64", - target_arch = "powerpc64" -))] -pub(crate) use crate::backend::vdso_wrappers::sched_getcpu; - -// `sched_getcpu` on platforms without a vDSO entry for it. -#[cfg(not(any( - target_arch = "x86_64", - target_arch = "x86", - target_arch = "riscv64", - target_arch = "powerpc64" -)))] -#[inline] -pub(crate) fn sched_getcpu() -> usize { - let mut cpu = MaybeUninit::<u32>::uninit(); - unsafe { - let r = ret(syscall!(__NR_getcpu, &mut cpu, zero(), zero())); - debug_assert!(r.is_ok()); - cpu.assume_init() as usize - } -} - -#[cfg(feature = "fs")] -#[inline] -pub(crate) fn chdir(filename: &CStr) -> io::Result<()> { - unsafe { ret(syscall_readonly!(__NR_chdir, filename)) } -} - -#[inline] -pub(crate) fn fchdir(fd: BorrowedFd<'_>) -> io::Result<()> { - unsafe { ret(syscall_readonly!(__NR_fchdir, fd)) } -} - -#[cfg(feature = "fs")] -#[inline] -pub(crate) fn chroot(filename: &CStr) -> io::Result<()> { - unsafe { ret(syscall_readonly!(__NR_chroot, filename)) } -} - -#[cfg(all(feature = "alloc", feature = "fs"))] -#[inline] -pub(crate) fn getcwd(buf: &mut [MaybeUninit<u8>]) -> io::Result<usize> { - let (buf_addr_mut, buf_len) = slice_mut(buf); - unsafe { ret_usize(syscall!(__NR_getcwd, buf_addr_mut, buf_len)) } -} - -#[inline] -pub(crate) fn membarrier_query() -> MembarrierQuery { - unsafe { - match ret_c_uint(syscall!( - __NR_membarrier, - c_int(membarrier_cmd::MEMBARRIER_CMD_QUERY as _), - c_uint(0) - )) { - Ok(query) => MembarrierQuery::from_bits_retain(query), - Err(_) => MembarrierQuery::empty(), - } - } -} - -#[inline] -pub(crate) fn membarrier(cmd: MembarrierCommand) -> io::Result<()> { - unsafe { ret(syscall!(__NR_membarrier, cmd, c_uint(0))) } -} - -#[inline] -pub(crate) fn membarrier_cpu(cmd: MembarrierCommand, cpu: Cpuid) -> io::Result<()> { - unsafe { - ret(syscall!( - __NR_membarrier, - cmd, - c_uint(membarrier_cmd_flag::MEMBARRIER_CMD_FLAG_CPU as _), - cpu - )) - } -} - -#[inline] -pub(crate) fn getppid() -> Option<Pid> { - unsafe { - let ppid = ret_c_int_infallible(syscall_readonly!(__NR_getppid)); - Pid::from_raw(ppid) - } -} - -#[inline] -pub(crate) fn getpgid(pid: Option<Pid>) -> io::Result<Pid> { - unsafe { - let pgid = ret_c_int(syscall_readonly!(__NR_getpgid, c_int(Pid::as_raw(pid))))?; - debug_assert!(pgid > 0); - Ok(Pid::from_raw_unchecked(pgid)) - } -} - -#[inline] -pub(crate) fn setpgid(pid: Option<Pid>, pgid: Option<Pid>) -> io::Result<()> { - unsafe { - ret(syscall_readonly!( - __NR_setpgid, - c_int(Pid::as_raw(pid)), - c_int(Pid::as_raw(pgid)) - )) - } -} - -#[inline] -pub(crate) fn getpgrp() -> Pid { - // Use the `getpgrp` syscall if available. - #[cfg(not(any(target_arch = "aarch64", target_arch = "riscv64")))] - unsafe { - let pgid = ret_c_int_infallible(syscall_readonly!(__NR_getpgrp)); - debug_assert!(pgid > 0); - Pid::from_raw_unchecked(pgid) - } - - // Otherwise use `getpgrp` and pass it zero. - #[cfg(any(target_arch = "aarch64", target_arch = "riscv64"))] - unsafe { - let pgid = ret_c_int_infallible(syscall_readonly!(__NR_getpgid, c_uint(0))); - debug_assert!(pgid > 0); - Pid::from_raw_unchecked(pgid) - } -} - -#[inline] -pub(crate) fn sched_getaffinity(pid: Option<Pid>, cpuset: &mut RawCpuSet) -> io::Result<()> { - unsafe { - // The raw Linux syscall returns the size (in bytes) of the `cpumask_t` - // data type that is used internally by the kernel to represent the CPU - // set bit mask. - let size = ret_usize(syscall!( - __NR_sched_getaffinity, - c_int(Pid::as_raw(pid)), - size_of::<RawCpuSet, _>(), - by_mut(&mut cpuset.bits) - ))?; - let bytes = as_mut_ptr(cpuset).cast::<u8>(); - let rest = bytes.wrapping_add(size); - // Zero every byte in the cpuset not set by the kernel. - rest.write_bytes(0, core::mem::size_of::<RawCpuSet>() - size); - Ok(()) - } -} - -#[inline] -pub(crate) fn sched_setaffinity(pid: Option<Pid>, cpuset: &RawCpuSet) -> io::Result<()> { - unsafe { - ret(syscall_readonly!( - __NR_sched_setaffinity, - c_int(Pid::as_raw(pid)), - size_of::<RawCpuSet, _>(), - slice_just_addr(&cpuset.bits) - )) - } -} - -#[inline] -pub(crate) fn sched_yield() { - unsafe { - // See the documentation for [`crate::process::sched_yield`] for why - // errors are ignored. - syscall_readonly!(__NR_sched_yield).decode_void(); - } -} - -#[cfg(feature = "fs")] -#[inline] -pub(crate) fn umask(mode: Mode) -> Mode { - unsafe { Mode::from_bits_retain(ret_c_uint_infallible(syscall_readonly!(__NR_umask, mode))) } -} - -#[inline] -pub(crate) fn nice(inc: i32) -> io::Result<i32> { - let priority = (if inc > -40 && inc < 40 { - inc + getpriority_process(None)? - } else { - inc - }) - .clamp(-20, 19); - setpriority_process(None, priority)?; - Ok(priority) -} - -#[inline] -pub(crate) fn getpriority_user(uid: Uid) -> io::Result<i32> { - unsafe { - Ok(20 - - ret_c_int(syscall_readonly!( - __NR_getpriority, - c_uint(PRIO_USER), - c_uint(uid.as_raw()) - ))?) - } -} - -#[inline] -pub(crate) fn getpriority_pgrp(pgid: Option<Pid>) -> io::Result<i32> { - unsafe { - Ok(20 - - ret_c_int(syscall_readonly!( - __NR_getpriority, - c_uint(PRIO_PGRP), - c_int(Pid::as_raw(pgid)) - ))?) - } -} - -#[inline] -pub(crate) fn getpriority_process(pid: Option<Pid>) -> io::Result<i32> { - unsafe { - Ok(20 - - ret_c_int(syscall_readonly!( - __NR_getpriority, - c_uint(PRIO_PROCESS), - c_int(Pid::as_raw(pid)) - ))?) - } -} - -#[inline] -pub(crate) fn setpriority_user(uid: Uid, priority: i32) -> io::Result<()> { - unsafe { - ret(syscall_readonly!( - __NR_setpriority, - c_uint(PRIO_USER), - c_uint(uid.as_raw()), - c_int(priority) - )) - } -} - -#[inline] -pub(crate) fn setpriority_pgrp(pgid: Option<Pid>, priority: i32) -> io::Result<()> { - unsafe { - ret(syscall_readonly!( - __NR_setpriority, - c_uint(PRIO_PGRP), - c_int(Pid::as_raw(pgid)), - c_int(priority) - )) - } -} - -#[inline] -pub(crate) fn setpriority_process(pid: Option<Pid>, priority: i32) -> io::Result<()> { - unsafe { - ret(syscall_readonly!( - __NR_setpriority, - c_uint(PRIO_PROCESS), - c_int(Pid::as_raw(pid)), - c_int(priority) - )) - } -} - -#[inline] -pub(crate) fn getrlimit(limit: Resource) -> Rlimit { - let mut result = MaybeUninit::<rlimit64>::uninit(); - unsafe { - ret_infallible(syscall!( - __NR_prlimit64, - c_uint(0), - limit, - null::<c::c_void>(), - &mut result - )); - rlimit_from_linux(result.assume_init()) - } -} - -#[inline] -pub(crate) fn setrlimit(limit: Resource, new: Rlimit) -> io::Result<()> { - unsafe { - let lim = rlimit_to_linux(new.clone()); - match ret(syscall_readonly!( - __NR_prlimit64, - c_uint(0), - limit, - by_ref(&lim), - null_mut::<c::c_void>() - )) { - Ok(()) => Ok(()), - Err(err) => Err(err), - } - } -} - -#[inline] -pub(crate) fn prlimit(pid: Option<Pid>, limit: Resource, new: Rlimit) -> io::Result<Rlimit> { - let lim = rlimit_to_linux(new); - let mut result = MaybeUninit::<rlimit64>::uninit(); - unsafe { - match ret(syscall!( - __NR_prlimit64, - c_int(Pid::as_raw(pid)), - limit, - by_ref(&lim), - &mut result - )) { - Ok(()) => Ok(rlimit_from_linux(result.assume_init())), - Err(err) => Err(err), - } - } -} - -/// Convert a Rust [`Rlimit`] to a C `rlimit64`. -#[inline] -fn rlimit_from_linux(lim: rlimit64) -> Rlimit { - let current = if lim.rlim_cur == RLIM64_INFINITY as _ { - None - } else { - Some(lim.rlim_cur) - }; - let maximum = if lim.rlim_max == RLIM64_INFINITY as _ { - None - } else { - Some(lim.rlim_max) - }; - Rlimit { current, maximum } -} - -/// Convert a C `rlimit64` to a Rust `Rlimit`. -#[inline] -fn rlimit_to_linux(lim: Rlimit) -> rlimit64 { - let rlim_cur = match lim.current { - Some(r) => r, - None => RLIM64_INFINITY as _, - }; - let rlim_max = match lim.maximum { - Some(r) => r, - None => RLIM64_INFINITY as _, - }; - rlimit64 { rlim_cur, rlim_max } -} - -#[inline] -pub(crate) fn wait(waitopts: WaitOptions) -> io::Result<Option<(Pid, WaitStatus)>> { - _waitpid(!0, waitopts) -} - -#[inline] -pub(crate) fn waitpid( - pid: Option<Pid>, - waitopts: WaitOptions, -) -> io::Result<Option<(Pid, WaitStatus)>> { - _waitpid(Pid::as_raw(pid), waitopts) -} - -#[inline] -pub(crate) fn waitpgid(pgid: Pid, waitopts: WaitOptions) -> io::Result<Option<(Pid, WaitStatus)>> { - _waitpid(-pgid.as_raw_nonzero().get(), waitopts) -} - -#[inline] -pub(crate) fn _waitpid( - pid: RawPid, - waitopts: WaitOptions, -) -> io::Result<Option<(Pid, WaitStatus)>> { - unsafe { - let mut status = MaybeUninit::<u32>::uninit(); - let pid = ret_c_int(syscall!( - __NR_wait4, - c_int(pid as _), - &mut status, - c_int(waitopts.bits() as _), - zero() - ))?; - Ok(Pid::from_raw(pid).map(|pid| (pid, WaitStatus::new(status.assume_init())))) - } -} - -#[inline] -pub(crate) fn waitid(id: WaitId<'_>, options: WaitidOptions) -> io::Result<Option<WaitidStatus>> { - // Get the id to wait on. - match id { - WaitId::All => _waitid_all(options), - WaitId::Pid(pid) => _waitid_pid(pid, options), - WaitId::Pgid(pid) => _waitid_pgid(pid, options), - WaitId::PidFd(fd) => _waitid_pidfd(fd, options), - } -} - -#[inline] -fn _waitid_all(options: WaitidOptions) -> io::Result<Option<WaitidStatus>> { - // `waitid` can return successfully without initializing the struct (no - // children found when using `WNOHANG`) - let mut status = MaybeUninit::<c::siginfo_t>::zeroed(); - unsafe { - ret(syscall!( - __NR_waitid, - c_uint(c::P_ALL), - c_uint(0), - by_mut(&mut status), - c_int(options.bits() as _), - zero() - ))? - }; - - Ok(unsafe { cvt_waitid_status(status) }) -} - -#[inline] -fn _waitid_pid(pid: Pid, options: WaitidOptions) -> io::Result<Option<WaitidStatus>> { - // `waitid` can return successfully without initializing the struct (no - // children found when using `WNOHANG`) - let mut status = MaybeUninit::<c::siginfo_t>::zeroed(); - unsafe { - ret(syscall!( - __NR_waitid, - c_uint(c::P_PID), - c_int(Pid::as_raw(Some(pid))), - by_mut(&mut status), - c_int(options.bits() as _), - zero() - ))? - }; - - Ok(unsafe { cvt_waitid_status(status) }) -} - -#[inline] -fn _waitid_pgid(pgid: Option<Pid>, options: WaitidOptions) -> io::Result<Option<WaitidStatus>> { - // `waitid` can return successfully without initializing the struct (no - // children found when using `WNOHANG`) - let mut status = MaybeUninit::<c::siginfo_t>::zeroed(); - unsafe { - ret(syscall!( - __NR_waitid, - c_uint(c::P_PGID), - c_int(Pid::as_raw(pgid)), - by_mut(&mut status), - c_int(options.bits() as _), - zero() - ))? - }; - - Ok(unsafe { cvt_waitid_status(status) }) -} - -#[inline] -fn _waitid_pidfd(fd: BorrowedFd<'_>, options: WaitidOptions) -> io::Result<Option<WaitidStatus>> { - // `waitid` can return successfully without initializing the struct (no - // children found when using `WNOHANG`) - let mut status = MaybeUninit::<c::siginfo_t>::zeroed(); - unsafe { - ret(syscall!( - __NR_waitid, - c_uint(c::P_PIDFD), - c_uint(fd.as_raw_fd() as _), - by_mut(&mut status), - c_int(options.bits() as _), - zero() - ))? - }; - - Ok(unsafe { cvt_waitid_status(status) }) -} - -/// Convert a `siginfo_t` to a `WaitidStatus`. -/// -/// # Safety -/// -/// The caller must ensure that `status` is initialized and that `waitid` -/// returned successfully. -#[inline] -#[rustfmt::skip] -unsafe fn cvt_waitid_status(status: MaybeUninit<c::siginfo_t>) -> Option<WaitidStatus> { - let status = status.assume_init(); - if status.__bindgen_anon_1.__bindgen_anon_1._sifields._sigchld._pid == 0 { - None - } else { - Some(WaitidStatus(status)) - } -} - -#[inline] -pub(crate) fn getsid(pid: Option<Pid>) -> io::Result<Pid> { - unsafe { - let pid = ret_c_int(syscall_readonly!(__NR_getsid, c_int(Pid::as_raw(pid))))?; - Ok(Pid::from_raw_unchecked(pid)) - } -} - -#[inline] -pub(crate) fn setsid() -> io::Result<Pid> { - unsafe { - let pid = ret_c_int(syscall_readonly!(__NR_setsid))?; - Ok(Pid::from_raw_unchecked(pid)) - } -} - -#[inline] -pub(crate) fn kill_process(pid: Pid, sig: Signal) -> io::Result<()> { - unsafe { ret(syscall_readonly!(__NR_kill, pid, sig)) } -} - -#[inline] -pub(crate) fn kill_process_group(pid: Pid, sig: Signal) -> io::Result<()> { - unsafe { ret(syscall_readonly!(__NR_kill, negative_pid(pid), sig)) } -} - -#[inline] -pub(crate) fn kill_current_process_group(sig: Signal) -> io::Result<()> { - unsafe { ret(syscall_readonly!(__NR_kill, pass_usize(0), sig)) } -} - -#[inline] -pub(crate) fn test_kill_process(pid: Pid) -> io::Result<()> { - unsafe { ret(syscall_readonly!(__NR_kill, pid, pass_usize(0))) } -} - -#[inline] -pub(crate) fn test_kill_process_group(pid: Pid) -> io::Result<()> { - unsafe { - ret(syscall_readonly!( - __NR_kill, - negative_pid(pid), - pass_usize(0) - )) - } -} - -#[inline] -pub(crate) fn test_kill_current_process_group() -> io::Result<()> { - unsafe { ret(syscall_readonly!(__NR_kill, pass_usize(0), pass_usize(0))) } -} - -#[inline] -pub(crate) fn pidfd_getfd( - pidfd: BorrowedFd<'_>, - targetfd: RawFd, - flags: PidfdGetfdFlags, -) -> io::Result<OwnedFd> { - unsafe { - ret_owned_fd(syscall_readonly!( - __NR_pidfd_getfd, - pidfd, - raw_fd(targetfd), - c_int(flags.bits() as _) - )) - } -} - -#[inline] -pub(crate) fn pidfd_open(pid: Pid, flags: PidfdFlags) -> io::Result<OwnedFd> { - unsafe { ret_owned_fd(syscall_readonly!(__NR_pidfd_open, pid, flags)) } -} - -#[cfg(feature = "alloc")] -#[inline] -pub(crate) fn getgroups(buf: &mut [Gid]) -> io::Result<usize> { - let len = buf.len().try_into().map_err(|_| io::Errno::NOMEM)?; - - unsafe { - ret_usize(syscall!( - __NR_getgroups, - c_int(len), - slice_just_addr_mut(buf) - )) - } -} diff --git a/vendor/rustix/src/backend/linux_raw/process/types.rs b/vendor/rustix/src/backend/linux_raw/process/types.rs deleted file mode 100644 index 841668a..0000000 --- a/vendor/rustix/src/backend/linux_raw/process/types.rs +++ /dev/null @@ -1,104 +0,0 @@ -use linux_raw_sys::general::membarrier_cmd; - -/// A command for use with [`membarrier`] and [`membarrier_cpu`]. -/// -/// For `MEMBARRIER_CMD_QUERY`, see [`membarrier_query`]. -/// -/// [`membarrier`]: crate::process::membarrier -/// [`membarrier_cpu`]: crate::process::membarrier_cpu -/// [`membarrier_query`]: crate::process::membarrier_query -#[derive(Copy, Clone, Eq, PartialEq, Debug)] -#[repr(u32)] -pub enum MembarrierCommand { - /// `MEMBARRIER_CMD_GLOBAL` - #[doc(alias = "Shared")] - #[doc(alias = "MEMBARRIER_CMD_SHARED")] - Global = membarrier_cmd::MEMBARRIER_CMD_GLOBAL as _, - /// `MEMBARRIER_CMD_GLOBAL_EXPEDITED` - GlobalExpedited = membarrier_cmd::MEMBARRIER_CMD_GLOBAL_EXPEDITED as _, - /// `MEMBARRIER_CMD_REGISTER_GLOBAL_EXPEDITED` - RegisterGlobalExpedited = membarrier_cmd::MEMBARRIER_CMD_REGISTER_GLOBAL_EXPEDITED as _, - /// `MEMBARRIER_CMD_PRIVATE_EXPEDITED` - PrivateExpedited = membarrier_cmd::MEMBARRIER_CMD_PRIVATE_EXPEDITED as _, - /// `MEMBARRIER_CMD_REGISTER_PRIVATE_EXPEDITED` - RegisterPrivateExpedited = membarrier_cmd::MEMBARRIER_CMD_REGISTER_PRIVATE_EXPEDITED as _, - /// `MEMBARRIER_CMD_PRIVATE_EXPEDITED_SYNC_CORE` - PrivateExpeditedSyncCore = membarrier_cmd::MEMBARRIER_CMD_PRIVATE_EXPEDITED_SYNC_CORE as _, - /// `MEMBARRIER_CMD_REGISTER_PRIVATE_EXPEDITED_SYNC_CORE` - RegisterPrivateExpeditedSyncCore = - membarrier_cmd::MEMBARRIER_CMD_REGISTER_PRIVATE_EXPEDITED_SYNC_CORE as _, - /// `MEMBARRIER_CMD_PRIVATE_EXPEDITED_RSEQ` (since Linux 5.10) - PrivateExpeditedRseq = membarrier_cmd::MEMBARRIER_CMD_PRIVATE_EXPEDITED_RSEQ as _, - /// `MEMBARRIER_CMD_REGISTER_PRIVATE_EXPEDITED_RSEQ` (since Linux 5.10) - RegisterPrivateExpeditedRseq = - membarrier_cmd::MEMBARRIER_CMD_REGISTER_PRIVATE_EXPEDITED_RSEQ as _, -} - -/// A resource value for use with [`getrlimit`], [`setrlimit`], and -/// [`prlimit`]. -/// -/// [`getrlimit`]: crate::process::getrlimit -/// [`setrlimit`]: crate::process::setrlimit -/// [`prlimit`]: crate::process::prlimit -#[derive(Copy, Clone, Debug, Eq, PartialEq)] -#[repr(u32)] -pub enum Resource { - /// `RLIMIT_CPU` - Cpu = linux_raw_sys::general::RLIMIT_CPU, - /// `RLIMIT_FSIZE` - Fsize = linux_raw_sys::general::RLIMIT_FSIZE, - /// `RLIMIT_DATA` - Data = linux_raw_sys::general::RLIMIT_DATA, - /// `RLIMIT_STACK` - Stack = linux_raw_sys::general::RLIMIT_STACK, - /// `RLIMIT_CORE` - Core = linux_raw_sys::general::RLIMIT_CORE, - /// `RLIMIT_RSS` - Rss = linux_raw_sys::general::RLIMIT_RSS, - /// `RLIMIT_NPROC` - Nproc = linux_raw_sys::general::RLIMIT_NPROC, - /// `RLIMIT_NOFILE` - Nofile = linux_raw_sys::general::RLIMIT_NOFILE, - /// `RLIMIT_MEMLOCK` - Memlock = linux_raw_sys::general::RLIMIT_MEMLOCK, - /// `RLIMIT_AS` - As = linux_raw_sys::general::RLIMIT_AS, - /// `RLIMIT_LOCKS` - Locks = linux_raw_sys::general::RLIMIT_LOCKS, - /// `RLIMIT_SIGPENDING` - Sigpending = linux_raw_sys::general::RLIMIT_SIGPENDING, - /// `RLIMIT_MSGQUEUE` - Msgqueue = linux_raw_sys::general::RLIMIT_MSGQUEUE, - /// `RLIMIT_NICE` - Nice = linux_raw_sys::general::RLIMIT_NICE, - /// `RLIMIT_RTPRIO` - Rtprio = linux_raw_sys::general::RLIMIT_RTPRIO, - /// `RLIMIT_RTTIME` - Rttime = linux_raw_sys::general::RLIMIT_RTTIME, -} - -/// A CPU identifier as a raw integer. -pub type RawCpuid = u32; - -#[repr(C)] -#[derive(Clone, Copy, Debug, Eq, Hash, PartialEq)] -pub(crate) struct RawCpuSet { - #[cfg(all(target_pointer_width = "32", not(target_arch = "x86_64")))] - pub(crate) bits: [u32; 32], - #[cfg(not(all(target_pointer_width = "32", not(target_arch = "x86_64"))))] - pub(crate) bits: [u64; 16], -} - -#[inline] -pub(crate) fn raw_cpu_set_new() -> RawCpuSet { - #[cfg(all(target_pointer_width = "32", not(target_arch = "x86_64")))] - { - RawCpuSet { bits: [0; 32] } - } - #[cfg(not(all(target_pointer_width = "32", not(target_arch = "x86_64"))))] - { - RawCpuSet { bits: [0; 16] } - } -} - -pub(crate) const CPU_SETSIZE: usize = 8 * core::mem::size_of::<RawCpuSet>(); diff --git a/vendor/rustix/src/backend/linux_raw/process/wait.rs b/vendor/rustix/src/backend/linux_raw/process/wait.rs deleted file mode 100644 index 9af7f2b..0000000 --- a/vendor/rustix/src/backend/linux_raw/process/wait.rs +++ /dev/null @@ -1,68 +0,0 @@ -// The functions replacing the C macros use the same names as in libc. -#![allow(non_snake_case, unsafe_code)] - -use linux_raw_sys::ctypes::c_int; -pub(crate) use linux_raw_sys::general::{ - siginfo_t, WCONTINUED, WEXITED, WNOHANG, WNOWAIT, WSTOPPED, WUNTRACED, -}; - -#[inline] -pub(crate) fn WIFSTOPPED(status: u32) -> bool { - (status & 0xff) == 0x7f -} - -#[inline] -pub(crate) fn WSTOPSIG(status: u32) -> u32 { - (status >> 8) & 0xff -} - -#[inline] -pub(crate) fn WIFCONTINUED(status: u32) -> bool { - status == 0xffff -} - -#[inline] -pub(crate) fn WIFSIGNALED(status: u32) -> bool { - ((status & 0x7f) + 1) as i8 >= 2 -} - -#[inline] -pub(crate) fn WTERMSIG(status: u32) -> u32 { - status & 0x7f -} - -#[inline] -pub(crate) fn WIFEXITED(status: u32) -> bool { - (status & 0x7f) == 0 -} - -#[inline] -pub(crate) fn WEXITSTATUS(status: u32) -> u32 { - (status >> 8) & 0xff -} - -pub(crate) trait SiginfoExt { - fn si_code(&self) -> c_int; - unsafe fn si_status(&self) -> c_int; -} - -impl SiginfoExt for siginfo_t { - #[inline] - fn si_code(&self) -> c_int { - // SAFETY: This is technically a union access, but it's only a union - // with padding. - unsafe { self.__bindgen_anon_1.__bindgen_anon_1.si_code } - } - - /// Return the exit status or signal number recorded in a `siginfo_t`. - /// - /// # Safety - /// - /// `si_signo` must equal `SIGCHLD` (as it is guaranteed to do after a - /// `waitid` call). - #[inline] - #[rustfmt::skip] - unsafe fn si_status(&self) -> c_int { - self.__bindgen_anon_1.__bindgen_anon_1._sifields._sigchld._status - } -} diff --git a/vendor/rustix/src/backend/linux_raw/pty/mod.rs b/vendor/rustix/src/backend/linux_raw/pty/mod.rs deleted file mode 100644 index ef944f0..0000000 --- a/vendor/rustix/src/backend/linux_raw/pty/mod.rs +++ /dev/null @@ -1 +0,0 @@ -pub(crate) mod syscalls; diff --git a/vendor/rustix/src/backend/linux_raw/pty/syscalls.rs b/vendor/rustix/src/backend/linux_raw/pty/syscalls.rs deleted file mode 100644 index b64344f..0000000 --- a/vendor/rustix/src/backend/linux_raw/pty/syscalls.rs +++ /dev/null @@ -1,43 +0,0 @@ -//! linux_raw syscalls supporting `rustix::pty`. -//! -//! # Safety -//! -//! See the `rustix::backend` module documentation for details. -#![allow(unsafe_code, clippy::undocumented_unsafe_blocks)] - -use crate::backend::conv::{by_ref, c_uint, ret}; -use crate::fd::BorrowedFd; -use crate::io; -use linux_raw_sys::ioctl::TIOCSPTLCK; -#[cfg(feature = "alloc")] -use { - crate::backend::c, crate::ffi::CString, crate::path::DecInt, alloc::vec::Vec, - core::mem::MaybeUninit, linux_raw_sys::ioctl::TIOCGPTN, -}; - -#[cfg(feature = "alloc")] -#[inline] -pub(crate) fn ptsname(fd: BorrowedFd<'_>, mut buffer: Vec<u8>) -> io::Result<CString> { - unsafe { - let mut n = MaybeUninit::<c::c_int>::uninit(); - ret(syscall!(__NR_ioctl, fd, c_uint(TIOCGPTN), &mut n))?; - - buffer.clear(); - buffer.extend_from_slice(b"/dev/pts/"); - buffer.extend_from_slice(DecInt::new(n.assume_init()).as_bytes()); - buffer.push(b'\0'); - Ok(CString::from_vec_with_nul_unchecked(buffer)) - } -} - -#[inline] -pub(crate) fn unlockpt(fd: BorrowedFd<'_>) -> io::Result<()> { - unsafe { - ret(syscall_readonly!( - __NR_ioctl, - fd, - c_uint(TIOCSPTLCK), - by_ref(&0) - )) - } -} diff --git a/vendor/rustix/src/backend/linux_raw/rand/mod.rs b/vendor/rustix/src/backend/linux_raw/rand/mod.rs deleted file mode 100644 index 1e0181a..0000000 --- a/vendor/rustix/src/backend/linux_raw/rand/mod.rs +++ /dev/null @@ -1,2 +0,0 @@ -pub(crate) mod syscalls; -pub(crate) mod types; diff --git a/vendor/rustix/src/backend/linux_raw/rand/syscalls.rs b/vendor/rustix/src/backend/linux_raw/rand/syscalls.rs deleted file mode 100644 index c0f497b..0000000 --- a/vendor/rustix/src/backend/linux_raw/rand/syscalls.rs +++ /dev/null @@ -1,19 +0,0 @@ -//! linux_raw syscalls supporting `rustix::rand`. -//! -//! # Safety -//! -//! See the `rustix::backend` module documentation for details. -#![allow(unsafe_code, clippy::undocumented_unsafe_blocks)] - -use crate::backend::conv::{pass_usize, ret_usize}; -use crate::io; -use crate::rand::GetRandomFlags; - -#[inline] -pub(crate) unsafe fn getrandom( - buf: *mut u8, - cap: usize, - flags: GetRandomFlags, -) -> io::Result<usize> { - ret_usize(syscall!(__NR_getrandom, buf, pass_usize(cap), flags)) -} diff --git a/vendor/rustix/src/backend/linux_raw/rand/types.rs b/vendor/rustix/src/backend/linux_raw/rand/types.rs deleted file mode 100644 index 9bc857f..0000000 --- a/vendor/rustix/src/backend/linux_raw/rand/types.rs +++ /dev/null @@ -1,20 +0,0 @@ -use bitflags::bitflags; - -bitflags! { - /// `GRND_*` flags for use with [`getrandom`]. - /// - /// [`getrandom`]: crate::rand::getrandom - #[repr(transparent)] - #[derive(Copy, Clone, Eq, PartialEq, Hash, Debug)] - pub struct GetRandomFlags: u32 { - /// `GRND_RANDOM` - const RANDOM = linux_raw_sys::general::GRND_RANDOM; - /// `GRND_NONBLOCK` - const NONBLOCK = linux_raw_sys::general::GRND_NONBLOCK; - /// `GRND_INSECURE` - const INSECURE = linux_raw_sys::general::GRND_INSECURE; - - /// <https://docs.rs/bitflags/*/bitflags/#externally-defined-flags> - const _ = !0; - } -} diff --git a/vendor/rustix/src/backend/linux_raw/reg.rs b/vendor/rustix/src/backend/linux_raw/reg.rs deleted file mode 100644 index 10f95a5..0000000 --- a/vendor/rustix/src/backend/linux_raw/reg.rs +++ /dev/null @@ -1,258 +0,0 @@ -//! Encapsulation for system call arguments and return values. -//! -//! The inline-asm code paths do some amount of reordering of arguments; to -//! ensure that we don't accidentally misroute an argument or return value, we -//! use distinct types for each argument index and return value. -//! -//! # Safety -//! -//! The `ToAsm` and `FromAsm` traits are unsafe to use; they should only be -//! used by the syscall code which executes actual syscall machine -//! instructions. - -#![allow(unsafe_code)] - -use super::c; -use super::fd::RawFd; -use core::marker::PhantomData; -use core::ops::Range; - -pub(super) trait ToAsm: private::Sealed { - /// Convert `self` to a `usize` ready to be passed to a syscall - /// machine instruction. - /// - /// # Safety - /// - /// This should be used immediately before the syscall instruction, and the - /// returned value shouldn't be used for any other purpose. - #[must_use] - unsafe fn to_asm(self) -> *mut Opaque; -} - -pub(super) trait FromAsm: private::Sealed { - /// Convert `raw` from a value produced by a syscall machine instruction - /// into a `Self`. - /// - /// # Safety - /// - /// This should be used immediately after the syscall instruction, and the - /// operand value shouldn't be used for any other purpose. - #[must_use] - unsafe fn from_asm(raw: *mut Opaque) -> Self; -} - -/// To preserve provenance, syscall arguments and return values are passed as -/// pointer types. They need a type to point to, so we define a custom private -/// type, to prevent it from being used for anything else. -#[repr(transparent)] -pub(super) struct Opaque(c::c_void); - -// Argument numbers. -pub(super) struct A0(()); -pub(super) struct A1(()); -pub(super) struct A2(()); -pub(super) struct A3(()); -pub(super) struct A4(()); -pub(super) struct A5(()); -#[cfg(any(target_arch = "mips", target_arch = "mips32r6"))] -pub(super) struct A6(()); -#[cfg(target_arch = "x86")] -pub(super) struct SocketArg; - -pub(super) trait ArgNumber: private::Sealed {} -impl ArgNumber for A0 {} -impl ArgNumber for A1 {} -impl ArgNumber for A2 {} -impl ArgNumber for A3 {} -impl ArgNumber for A4 {} -impl ArgNumber for A5 {} -#[cfg(any(target_arch = "mips", target_arch = "mips32r6"))] -impl ArgNumber for A6 {} -#[cfg(target_arch = "x86")] -impl ArgNumber for SocketArg {} - -// Return value numbers. -pub(super) struct R0(()); - -pub(super) trait RetNumber: private::Sealed {} -impl RetNumber for R0 {} - -/// Syscall arguments use register-sized types. We use a newtype to -/// discourage accidental misuse of the raw integer values. -/// -/// This type doesn't implement `Clone` or `Copy`; it should be used exactly -/// once. And it has a lifetime to ensure that it doesn't outlive any resources -/// it might be pointing to. -#[repr(transparent)] -#[must_use] -pub(super) struct ArgReg<'a, Num: ArgNumber> { - raw: *mut Opaque, - _phantom: PhantomData<(&'a (), Num)>, -} - -impl<'a, Num: ArgNumber> ToAsm for ArgReg<'a, Num> { - #[inline] - unsafe fn to_asm(self) -> *mut Opaque { - self.raw - } -} - -/// Syscall return values use register-sized types. We use a newtype to -/// discourage accidental misuse of the raw integer values. -/// -/// This type doesn't implement `Clone` or `Copy`; it should be used exactly -/// once. -#[repr(transparent)] -#[must_use] -pub(super) struct RetReg<Num: RetNumber> { - raw: *mut Opaque, - _phantom: PhantomData<Num>, -} - -impl<Num: RetNumber> RetReg<Num> { - #[inline] - pub(super) fn decode_usize(self) -> usize { - debug_assert!(!(-4095..0).contains(&(self.raw as isize))); - self.raw as usize - } - - #[inline] - pub(super) fn decode_raw_fd(self) -> RawFd { - let bits = self.decode_usize(); - let raw_fd = bits as RawFd; - - // Converting `raw` to `RawFd` should be lossless. - debug_assert_eq!(raw_fd as usize, bits); - - raw_fd - } - - #[inline] - pub(super) fn decode_c_int(self) -> c::c_int { - let bits = self.decode_usize(); - let c_int_ = bits as c::c_int; - - // Converting `raw` to `c_int` should be lossless. - debug_assert_eq!(c_int_ as usize, bits); - - c_int_ - } - - #[inline] - pub(super) fn decode_c_uint(self) -> c::c_uint { - let bits = self.decode_usize(); - let c_uint_ = bits as c::c_uint; - - // Converting `raw` to `c_uint` should be lossless. - debug_assert_eq!(c_uint_ as usize, bits); - - c_uint_ - } - - #[inline] - pub(super) fn decode_void_star(self) -> *mut c::c_void { - self.raw.cast() - } - - #[cfg(target_pointer_width = "64")] - #[inline] - pub(super) fn decode_u64(self) -> u64 { - self.decode_usize() as u64 - } - - #[inline] - pub(super) fn decode_void(self) { - let ignore = self.decode_usize(); - debug_assert_eq!(ignore, 0); - } - - #[inline] - pub(super) fn decode_error_code(self) -> u16 { - let bits = self.raw as usize; - - // `raw` must be in `-4095..0`. Linux always returns errors in - // `-4095..0`, and we double-check it here. - debug_assert!((-4095..0).contains(&(bits as isize))); - - bits as u16 - } - - #[inline] - pub(super) fn is_nonzero(&self) -> bool { - !self.raw.is_null() - } - - #[inline] - pub(super) fn is_negative(&self) -> bool { - (self.raw as isize) < 0 - } - - #[inline] - pub(super) fn is_in_range(&self, range: Range<isize>) -> bool { - range.contains(&(self.raw as isize)) - } -} - -impl<Num: RetNumber> FromAsm for RetReg<Num> { - #[inline] - unsafe fn from_asm(raw: *mut Opaque) -> Self { - Self { - raw, - _phantom: PhantomData, - } - } -} - -#[repr(transparent)] -pub(super) struct SyscallNumber<'a> { - nr: usize, - _phantom: PhantomData<&'a ()>, -} - -impl<'a> ToAsm for SyscallNumber<'a> { - #[inline] - unsafe fn to_asm(self) -> *mut Opaque { - self.nr as usize as *mut Opaque - } -} - -/// Encode a system call argument as an `ArgReg`. -#[inline] -pub(super) fn raw_arg<'a, Num: ArgNumber>(raw: *mut Opaque) -> ArgReg<'a, Num> { - ArgReg { - raw, - _phantom: PhantomData, - } -} - -/// Encode a system call number (a `__NR_*` constant) as a `SyscallNumber`. -#[inline] -pub(super) const fn nr<'a>(nr: u32) -> SyscallNumber<'a> { - SyscallNumber { - nr: nr as usize, - _phantom: PhantomData, - } -} - -/// Seal our various traits using the technique documented [here]. -/// -/// [here]: https://rust-lang.github.io/api-guidelines/future-proofing.html -mod private { - pub trait Sealed {} - - // Implement for those same types, but no others. - impl<'a, Num: super::ArgNumber> Sealed for super::ArgReg<'a, Num> {} - impl<Num: super::RetNumber> Sealed for super::RetReg<Num> {} - impl<'a> Sealed for super::SyscallNumber<'a> {} - impl Sealed for super::A0 {} - impl Sealed for super::A1 {} - impl Sealed for super::A2 {} - impl Sealed for super::A3 {} - impl Sealed for super::A4 {} - impl Sealed for super::A5 {} - #[cfg(any(target_arch = "mips", target_arch = "mips32r6"))] - impl Sealed for super::A6 {} - #[cfg(target_arch = "x86")] - impl Sealed for super::SocketArg {} - impl Sealed for super::R0 {} -} diff --git a/vendor/rustix/src/backend/linux_raw/runtime/mod.rs b/vendor/rustix/src/backend/linux_raw/runtime/mod.rs deleted file mode 100644 index 0b48649..0000000 --- a/vendor/rustix/src/backend/linux_raw/runtime/mod.rs +++ /dev/null @@ -1,2 +0,0 @@ -pub(crate) mod syscalls; -pub(crate) mod tls; diff --git a/vendor/rustix/src/backend/linux_raw/runtime/syscalls.rs b/vendor/rustix/src/backend/linux_raw/runtime/syscalls.rs deleted file mode 100644 index e00acc6..0000000 --- a/vendor/rustix/src/backend/linux_raw/runtime/syscalls.rs +++ /dev/null @@ -1,318 +0,0 @@ -//! linux_raw syscalls supporting `rustix::runtime`. -//! -//! # Safety -//! -//! See the `rustix::backend` module documentation for details. -#![allow(unsafe_code, clippy::undocumented_unsafe_blocks)] - -use crate::backend::c; -#[cfg(target_arch = "x86")] -use crate::backend::conv::by_mut; -#[cfg(target_arch = "x86_64")] -use crate::backend::conv::c_uint; -use crate::backend::conv::{ - by_ref, c_int, ret, ret_c_int, ret_c_int_infallible, ret_error, ret_infallible, ret_void_star, - size_of, zero, -}; -#[cfg(feature = "fs")] -use crate::fd::BorrowedFd; -use crate::ffi::CStr; -#[cfg(feature = "fs")] -use crate::fs::AtFlags; -use crate::io; -use crate::pid::{Pid, RawPid}; -use crate::runtime::{Fork, How, Sigaction, Siginfo, Sigset, Stack}; -use crate::signal::Signal; -use crate::timespec::Timespec; -use crate::utils::option_as_ptr; -use core::ffi::c_void; -use core::mem::MaybeUninit; -#[cfg(target_pointer_width = "32")] -use linux_raw_sys::general::__kernel_old_timespec; -use linux_raw_sys::general::kernel_sigset_t; -#[cfg(target_arch = "x86_64")] -use linux_raw_sys::general::ARCH_SET_FS; - -#[inline] -pub(crate) unsafe fn fork() -> io::Result<Fork> { - let mut child_pid = MaybeUninit::<RawPid>::uninit(); - - // Unix `fork` only returns the child PID in the parent; we'd like it in - // the child too, so set `CLONE_CHILD_SETTID` and pass in the address of - // a memory location to store it to in the child. - // - // Architectures differ on the order of the parameters. - #[cfg(target_arch = "x86_64")] - let pid = ret_c_int(syscall_readonly!( - __NR_clone, - c_int(c::SIGCHLD | c::CLONE_CHILD_SETTID), - zero(), - zero(), - &mut child_pid, - zero() - ))?; - #[cfg(any( - target_arch = "aarch64", - target_arch = "arm", - target_arch = "mips", - target_arch = "mips32r6", - target_arch = "mips64", - target_arch = "mips64r6", - target_arch = "powerpc64", - target_arch = "riscv64", - target_arch = "x86" - ))] - let pid = ret_c_int(syscall_readonly!( - __NR_clone, - c_int(c::SIGCHLD | c::CLONE_CHILD_SETTID), - zero(), - zero(), - zero(), - &mut child_pid - ))?; - - Ok(if let Some(pid) = Pid::from_raw(pid) { - Fork::Parent(pid) - } else { - Fork::Child(Pid::from_raw_unchecked(child_pid.assume_init())) - }) -} - -#[cfg(feature = "fs")] -pub(crate) unsafe fn execveat( - dirfd: BorrowedFd<'_>, - path: &CStr, - args: *const *const u8, - env_vars: *const *const u8, - flags: AtFlags, -) -> io::Errno { - ret_error(syscall_readonly!( - __NR_execveat, - dirfd, - path, - args, - env_vars, - flags - )) -} - -pub(crate) unsafe fn execve( - path: &CStr, - args: *const *const u8, - env_vars: *const *const u8, -) -> io::Errno { - ret_error(syscall_readonly!(__NR_execve, path, args, env_vars)) -} - -pub(crate) mod tls { - use super::*; - #[cfg(target_arch = "x86")] - use crate::backend::runtime::tls::UserDesc; - - #[cfg(target_arch = "x86")] - #[inline] - pub(crate) unsafe fn set_thread_area(u_info: &mut UserDesc) -> io::Result<()> { - ret(syscall!(__NR_set_thread_area, by_mut(u_info))) - } - - #[cfg(target_arch = "arm")] - #[inline] - pub(crate) unsafe fn arm_set_tls(data: *mut c::c_void) -> io::Result<()> { - ret(syscall_readonly!(__ARM_NR_set_tls, data)) - } - - #[cfg(target_arch = "x86_64")] - #[inline] - pub(crate) unsafe fn set_fs(data: *mut c::c_void) { - ret_infallible(syscall_readonly!( - __NR_arch_prctl, - c_uint(ARCH_SET_FS), - data, - zero(), - zero(), - zero() - )) - } - - #[inline] - pub(crate) unsafe fn set_tid_address(data: *mut c::c_void) -> Pid { - let tid: i32 = ret_c_int_infallible(syscall_readonly!(__NR_set_tid_address, data)); - Pid::from_raw_unchecked(tid) - } - - #[inline] - pub(crate) fn exit_thread(code: c::c_int) -> ! { - unsafe { syscall_noreturn!(__NR_exit, c_int(code)) } - } -} - -#[inline] -pub(crate) unsafe fn sigaction(signal: Signal, new: Option<Sigaction>) -> io::Result<Sigaction> { - let mut old = MaybeUninit::<Sigaction>::uninit(); - let new = option_as_ptr(new.as_ref()); - ret(syscall!( - __NR_rt_sigaction, - signal, - new, - &mut old, - size_of::<kernel_sigset_t, _>() - ))?; - Ok(old.assume_init()) -} - -#[inline] -pub(crate) unsafe fn sigaltstack(new: Option<Stack>) -> io::Result<Stack> { - let mut old = MaybeUninit::<Stack>::uninit(); - let new = option_as_ptr(new.as_ref()); - ret(syscall!(__NR_sigaltstack, new, &mut old))?; - Ok(old.assume_init()) -} - -#[inline] -pub(crate) unsafe fn tkill(tid: Pid, sig: Signal) -> io::Result<()> { - ret(syscall_readonly!(__NR_tkill, tid, sig)) -} - -#[inline] -pub(crate) unsafe fn sigprocmask(how: How, new: Option<&Sigset>) -> io::Result<Sigset> { - let mut old = MaybeUninit::<Sigset>::uninit(); - let new = option_as_ptr(new); - ret(syscall!( - __NR_rt_sigprocmask, - how, - new, - &mut old, - size_of::<kernel_sigset_t, _>() - ))?; - Ok(old.assume_init()) -} - -#[inline] -pub(crate) fn sigpending() -> Sigset { - let mut pending = MaybeUninit::<Sigset>::uninit(); - unsafe { - ret_infallible(syscall!( - __NR_rt_sigpending, - &mut pending, - size_of::<kernel_sigset_t, _>() - )); - pending.assume_init() - } -} - -#[inline] -pub(crate) fn sigsuspend(set: &Sigset) -> io::Result<()> { - unsafe { - ret(syscall_readonly!( - __NR_rt_sigsuspend, - by_ref(set), - size_of::<kernel_sigset_t, _>() - )) - } -} - -#[inline] -pub(crate) fn sigwait(set: &Sigset) -> io::Result<Signal> { - unsafe { - match Signal::from_raw(ret_c_int(syscall_readonly!( - __NR_rt_sigtimedwait, - by_ref(set), - zero(), - zero(), - size_of::<kernel_sigset_t, _>() - ))?) { - Some(signum) => Ok(signum), - None => Err(io::Errno::NOTSUP), - } - } -} - -#[inline] -pub(crate) fn sigwaitinfo(set: &Sigset) -> io::Result<Siginfo> { - let mut info = MaybeUninit::<Siginfo>::uninit(); - unsafe { - let _signum = ret_c_int(syscall!( - __NR_rt_sigtimedwait, - by_ref(set), - &mut info, - zero(), - size_of::<kernel_sigset_t, _>() - ))?; - Ok(info.assume_init()) - } -} - -#[inline] -pub(crate) fn sigtimedwait(set: &Sigset, timeout: Option<Timespec>) -> io::Result<Siginfo> { - let mut info = MaybeUninit::<Siginfo>::uninit(); - let timeout_ptr = option_as_ptr(timeout.as_ref()); - - // `rt_sigtimedwait_time64` was introduced in Linux 5.1. The old - // `rt_sigtimedwait` syscall is not y2038-compatible on 32-bit - // architectures. - #[cfg(target_pointer_width = "32")] - unsafe { - match ret_c_int(syscall!( - __NR_rt_sigtimedwait_time64, - by_ref(set), - &mut info, - timeout_ptr, - size_of::<kernel_sigset_t, _>() - )) { - Ok(_signum) => (), - Err(io::Errno::NOSYS) => sigtimedwait_old(set, timeout, &mut info)?, - Err(err) => return Err(err), - } - Ok(info.assume_init()) - } - - #[cfg(target_pointer_width = "64")] - unsafe { - let _signum = ret_c_int(syscall!( - __NR_rt_sigtimedwait, - by_ref(set), - &mut info, - timeout_ptr, - size_of::<kernel_sigset_t, _>() - ))?; - Ok(info.assume_init()) - } -} - -#[cfg(target_pointer_width = "32")] -unsafe fn sigtimedwait_old( - set: &Sigset, - timeout: Option<Timespec>, - info: &mut MaybeUninit<Siginfo>, -) -> io::Result<()> { - let old_timeout = match timeout { - Some(timeout) => Some(__kernel_old_timespec { - tv_sec: timeout.tv_sec.try_into().map_err(|_| io::Errno::OVERFLOW)?, - tv_nsec: timeout.tv_nsec as _, - }), - None => None, - }; - - let old_timeout_ptr = option_as_ptr(old_timeout.as_ref()); - - let _signum = ret_c_int(syscall!( - __NR_rt_sigtimedwait, - by_ref(set), - info, - old_timeout_ptr, - size_of::<kernel_sigset_t, _>() - ))?; - - Ok(()) -} - -#[inline] -pub(crate) fn exit_group(code: c::c_int) -> ! { - unsafe { syscall_noreturn!(__NR_exit_group, c_int(code)) } -} - -#[inline] -pub(crate) unsafe fn brk(addr: *mut c::c_void) -> io::Result<*mut c_void> { - // This is non-`readonly`, to prevent loads from being reordered past it. - ret_void_star(syscall!(__NR_brk, addr)) -} diff --git a/vendor/rustix/src/backend/linux_raw/runtime/tls.rs b/vendor/rustix/src/backend/linux_raw/runtime/tls.rs deleted file mode 100644 index 69bd5ce..0000000 --- a/vendor/rustix/src/backend/linux_raw/runtime/tls.rs +++ /dev/null @@ -1,98 +0,0 @@ -//! TLS utilities. -//! -//! # Safety -//! -//! This file contains code that reads the raw phdr array pointed to by the -//! kernel-provided AUXV values. -#![allow(unsafe_code)] - -use crate::backend::c; -use crate::backend::param::auxv::exe_phdrs; -use core::arch::global_asm; -use core::ptr::{null, NonNull}; -use linux_raw_sys::elf::*; - -/// For use with [`set_thread_area`]. -/// -/// [`set_thread_area`]: crate::runtime::set_thread_area -#[cfg(target_arch = "x86")] -pub type UserDesc = linux_raw_sys::general::user_desc; - -pub(crate) fn startup_tls_info() -> StartupTlsInfo { - let mut base = null(); - let mut tls_phdr = null(); - let mut stack_size = 0; - - let (first_phdr, phent, phnum) = exe_phdrs(); - let mut current_phdr = first_phdr.cast::<Elf_Phdr>(); - - // The dynamic address of the dynamic section, which we can compare with - // the `PT_DYNAMIC` header's static address, if present. - let dynamic_addr: *const c::c_void = unsafe { &_DYNAMIC }; - - // SAFETY: We assume the phdr array pointer and length the kernel provided - // to the process describe a valid phdr array. - unsafe { - let phdrs_end = current_phdr.cast::<u8>().add(phnum * phent).cast(); - while current_phdr != phdrs_end { - let phdr = &*current_phdr; - current_phdr = current_phdr.cast::<u8>().add(phent).cast(); - - match phdr.p_type { - // Compute the offset from the static virtual addresses - // in the `p_vaddr` fields to the dynamic addresses. We don't - // always get a `PT_PHDR` or `PT_DYNAMIC` header, so use - // whichever one we get. - PT_PHDR => base = first_phdr.cast::<u8>().wrapping_sub(phdr.p_vaddr), - PT_DYNAMIC => base = dynamic_addr.cast::<u8>().wrapping_sub(phdr.p_vaddr), - - PT_TLS => tls_phdr = phdr, - PT_GNU_STACK => stack_size = phdr.p_memsz, - _ => {} - } - } - - if tls_phdr.is_null() { - StartupTlsInfo { - addr: NonNull::dangling().as_ptr(), - mem_size: 0, - file_size: 0, - align: 1, - stack_size: 0, - } - } else { - StartupTlsInfo { - addr: base.cast::<u8>().wrapping_add((*tls_phdr).p_vaddr).cast(), - mem_size: (*tls_phdr).p_memsz, - file_size: (*tls_phdr).p_filesz, - align: (*tls_phdr).p_align, - stack_size, - } - } - } -} - -extern "C" { - /// Declare the `_DYNAMIC` symbol so that we can compare its address with - /// the static address in the `PT_DYNAMIC` header to learn our offset. Use - /// a weak symbol because `_DYNAMIC` is not always present. - static _DYNAMIC: c::c_void; -} -// Rust has `extern_weak` but it isn't stable, so use a `global_asm`. -global_asm!(".weak _DYNAMIC"); - -/// The values returned from [`startup_tls_info`]. -/// -/// [`startup_tls_info`]: crate::runtime::startup_tls_info -pub struct StartupTlsInfo { - /// The base address of the TLS segment. - pub addr: *const c::c_void, - /// The size of the memory region. - pub mem_size: usize, - /// The size beyond which all memory is zero-initialized. - pub file_size: usize, - /// The required alignment for the TLS segment. - pub align: usize, - /// The requested minimum size for stacks. - pub stack_size: usize, -} diff --git a/vendor/rustix/src/backend/linux_raw/shm/mod.rs b/vendor/rustix/src/backend/linux_raw/shm/mod.rs deleted file mode 100644 index 1e0181a..0000000 --- a/vendor/rustix/src/backend/linux_raw/shm/mod.rs +++ /dev/null @@ -1,2 +0,0 @@ -pub(crate) mod syscalls; -pub(crate) mod types; diff --git a/vendor/rustix/src/backend/linux_raw/shm/syscalls.rs b/vendor/rustix/src/backend/linux_raw/shm/syscalls.rs deleted file mode 100644 index 3b083f4..0000000 --- a/vendor/rustix/src/backend/linux_raw/shm/syscalls.rs +++ /dev/null @@ -1,47 +0,0 @@ -use crate::ffi::CStr; - -use crate::backend::fs::syscalls::{open, unlink}; -use crate::backend::fs::types::{Mode, OFlags}; -use crate::fd::OwnedFd; -use crate::io; -use crate::shm::ShmOFlags; - -const NAME_MAX: usize = 255; -const SHM_DIR: &[u8] = b"/dev/shm/"; - -fn get_shm_name(name: &CStr) -> io::Result<([u8; NAME_MAX + SHM_DIR.len() + 1], usize)> { - let name = name.to_bytes(); - - if name.len() > NAME_MAX { - return Err(io::Errno::NAMETOOLONG); - } - - let num_slashes = name.iter().take_while(|x| **x == b'/').count(); - let after_slashes = &name[num_slashes..]; - if after_slashes.is_empty() - || after_slashes == b"." - || after_slashes == b".." - || after_slashes.contains(&b'/') - { - return Err(io::Errno::INVAL); - } - - let mut path = [0; NAME_MAX + SHM_DIR.len() + 1]; - path[..SHM_DIR.len()].copy_from_slice(SHM_DIR); - path[SHM_DIR.len()..SHM_DIR.len() + name.len()].copy_from_slice(name); - Ok((path, SHM_DIR.len() + name.len() + 1)) -} - -pub(crate) fn shm_open(name: &CStr, oflags: ShmOFlags, mode: Mode) -> io::Result<OwnedFd> { - let (path, len) = get_shm_name(name)?; - open( - CStr::from_bytes_with_nul(&path[..len]).unwrap(), - OFlags::from_bits(oflags.bits()).unwrap() | OFlags::CLOEXEC, - mode, - ) -} - -pub(crate) fn shm_unlink(name: &CStr) -> io::Result<()> { - let (path, len) = get_shm_name(name)?; - unlink(CStr::from_bytes_with_nul(&path[..len]).unwrap()) -} diff --git a/vendor/rustix/src/backend/linux_raw/shm/types.rs b/vendor/rustix/src/backend/linux_raw/shm/types.rs deleted file mode 100644 index 3343d44..0000000 --- a/vendor/rustix/src/backend/linux_raw/shm/types.rs +++ /dev/null @@ -1,30 +0,0 @@ -use crate::backend::c; -use bitflags::bitflags; - -bitflags! { - /// `O_*` constants for use with [`shm_open`]. - /// - /// [`shm_open`]: crate:shm::shm_open - #[repr(transparent)] - #[derive(Copy, Clone, Eq, PartialEq, Hash, Debug)] - pub struct ShmOFlags: c::c_uint { - /// `O_CREAT` - #[doc(alias = "CREAT")] - const CREATE = linux_raw_sys::general::O_CREAT; - - /// `O_EXCL` - const EXCL = linux_raw_sys::general::O_EXCL; - - /// `O_RDONLY` - const RDONLY = linux_raw_sys::general::O_RDONLY; - - /// `O_RDWR` - const RDWR = linux_raw_sys::general::O_RDWR; - - /// `O_TRUNC` - const TRUNC = linux_raw_sys::general::O_TRUNC; - - /// <https://docs.rs/bitflags/*/bitflags/#externally-defined-flags> - const _ = !0; - } -} diff --git a/vendor/rustix/src/backend/linux_raw/system/mod.rs b/vendor/rustix/src/backend/linux_raw/system/mod.rs deleted file mode 100644 index 1e0181a..0000000 --- a/vendor/rustix/src/backend/linux_raw/system/mod.rs +++ /dev/null @@ -1,2 +0,0 @@ -pub(crate) mod syscalls; -pub(crate) mod types; diff --git a/vendor/rustix/src/backend/linux_raw/system/syscalls.rs b/vendor/rustix/src/backend/linux_raw/system/syscalls.rs deleted file mode 100644 index 6b41cdb..0000000 --- a/vendor/rustix/src/backend/linux_raw/system/syscalls.rs +++ /dev/null @@ -1,49 +0,0 @@ -//! linux_raw syscalls supporting `rustix::system`. -//! -//! # Safety -//! -//! See the `rustix::backend` module documentation for details. -#![allow(unsafe_code, clippy::undocumented_unsafe_blocks)] - -use super::types::RawUname; -use crate::backend::c; -use crate::backend::conv::{c_int, ret, ret_infallible, slice}; -use crate::io; -use crate::system::{RebootCommand, Sysinfo}; -use core::mem::MaybeUninit; - -#[inline] -pub(crate) fn uname() -> RawUname { - let mut uname = MaybeUninit::<RawUname>::uninit(); - unsafe { - ret_infallible(syscall!(__NR_uname, &mut uname)); - uname.assume_init() - } -} - -#[inline] -pub(crate) fn sysinfo() -> Sysinfo { - let mut info = MaybeUninit::<Sysinfo>::uninit(); - unsafe { - ret_infallible(syscall!(__NR_sysinfo, &mut info)); - info.assume_init() - } -} - -#[inline] -pub(crate) fn sethostname(name: &[u8]) -> io::Result<()> { - let (ptr, len) = slice(name); - unsafe { ret(syscall_readonly!(__NR_sethostname, ptr, len)) } -} - -#[inline] -pub(crate) fn reboot(cmd: RebootCommand) -> io::Result<()> { - unsafe { - ret(syscall_readonly!( - __NR_reboot, - c_int(c::LINUX_REBOOT_MAGIC1), - c_int(c::LINUX_REBOOT_MAGIC2), - c_int(cmd as i32) - )) - } -} diff --git a/vendor/rustix/src/backend/linux_raw/system/types.rs b/vendor/rustix/src/backend/linux_raw/system/types.rs deleted file mode 100644 index 4729273..0000000 --- a/vendor/rustix/src/backend/linux_raw/system/types.rs +++ /dev/null @@ -1,4 +0,0 @@ -/// `sysinfo` -pub type Sysinfo = linux_raw_sys::system::sysinfo; - -pub(crate) type RawUname = linux_raw_sys::system::new_utsname; diff --git a/vendor/rustix/src/backend/linux_raw/termios/mod.rs b/vendor/rustix/src/backend/linux_raw/termios/mod.rs deleted file mode 100644 index ef944f0..0000000 --- a/vendor/rustix/src/backend/linux_raw/termios/mod.rs +++ /dev/null @@ -1 +0,0 @@ -pub(crate) mod syscalls; diff --git a/vendor/rustix/src/backend/linux_raw/termios/syscalls.rs b/vendor/rustix/src/backend/linux_raw/termios/syscalls.rs deleted file mode 100644 index 5a24c0a..0000000 --- a/vendor/rustix/src/backend/linux_raw/termios/syscalls.rs +++ /dev/null @@ -1,330 +0,0 @@ -//! linux_raw syscalls supporting `rustix::termios`. -//! -//! # Safety -//! -//! See the `rustix::backend` module documentation for details. -#![allow(unsafe_code, clippy::undocumented_unsafe_blocks)] - -use crate::backend::c; -use crate::backend::conv::{by_ref, c_uint, ret}; -use crate::fd::BorrowedFd; -use crate::io; -use crate::pid::Pid; -#[cfg(all(feature = "alloc", feature = "procfs"))] -use crate::procfs; -use crate::termios::{ - Action, ControlModes, InputModes, LocalModes, OptionalActions, OutputModes, QueueSelector, - SpecialCodeIndex, Termios, Winsize, -}; -#[cfg(all(feature = "alloc", feature = "procfs"))] -use crate::{ffi::CStr, fs::FileType, path::DecInt}; -use core::mem::MaybeUninit; -use linux_raw_sys::general::IBSHIFT; -use linux_raw_sys::ioctl::{ - TCFLSH, TCSBRK, TCXONC, TIOCGPGRP, TIOCGSID, TIOCGWINSZ, TIOCSPGRP, TIOCSWINSZ, -}; - -#[inline] -pub(crate) fn tcgetwinsize(fd: BorrowedFd<'_>) -> io::Result<Winsize> { - unsafe { - let mut result = MaybeUninit::<Winsize>::uninit(); - ret(syscall!(__NR_ioctl, fd, c_uint(TIOCGWINSZ), &mut result))?; - Ok(result.assume_init()) - } -} - -#[inline] -pub(crate) fn tcgetattr(fd: BorrowedFd<'_>) -> io::Result<Termios> { - unsafe { - let mut result = MaybeUninit::<Termios>::uninit(); - - // QEMU's `TCGETS2` doesn't currently set `input_speed` or - // `output_speed` on PowerPC, so zero out the fields ourselves. - #[cfg(any(target_arch = "powerpc", target_arch = "powerpc64"))] - { - result.write(core::mem::zeroed()); - } - - ret(syscall!(__NR_ioctl, fd, c_uint(c::TCGETS2), &mut result))?; - - let result = result.assume_init(); - - // QEMU's `TCGETS2` doesn't currently set `input_speed` or - // `output_speed` on PowerPC, so set them manually if we can. - #[cfg(any(target_arch = "powerpc", target_arch = "powerpc64"))] - let result = { - use crate::termios::speed; - let mut result = result; - if result.output_speed == 0 && (result.control_modes.bits() & c::CBAUD) != c::BOTHER { - if let Some(output_speed) = speed::decode(result.control_modes.bits() & c::CBAUD) { - result.output_speed = output_speed; - } - } - if result.input_speed == 0 - && ((result.control_modes.bits() & c::CIBAUD) >> c::IBSHIFT) != c::BOTHER - { - // For input speeds, `B0` is special-cased to mean the input - // speed is the same as the output speed. - if ((result.control_modes.bits() & c::CIBAUD) >> c::IBSHIFT) == c::B0 { - result.input_speed = result.output_speed; - } else if let Some(input_speed) = - speed::decode((result.control_modes.bits() & c::CIBAUD) >> c::IBSHIFT) - { - result.input_speed = input_speed; - } - } - result - }; - - Ok(result) - } -} - -#[inline] -pub(crate) fn tcgetpgrp(fd: BorrowedFd<'_>) -> io::Result<Pid> { - unsafe { - let mut result = MaybeUninit::<c::pid_t>::uninit(); - ret(syscall!(__NR_ioctl, fd, c_uint(TIOCGPGRP), &mut result))?; - let pid = result.assume_init(); - - // This doesn't appear to be documented, but it appears `tcsetpgrp` can - // succceed and set the pid to 0 if we pass it a pseudo-terminal device - // fd. For now, fail with `OPNOTSUPP`. - if pid == 0 { - return Err(io::Errno::OPNOTSUPP); - } - - Ok(Pid::from_raw_unchecked(pid)) - } -} - -#[inline] -pub(crate) fn tcsetattr( - fd: BorrowedFd<'_>, - optional_actions: OptionalActions, - termios: &Termios, -) -> io::Result<()> { - // Translate from `optional_actions` into an ioctl request code. On MIPS, - // `optional_actions` already has `TCGETS` added to it. - let request = linux_raw_sys::ioctl::TCSETS2 - + if cfg!(any( - target_arch = "mips", - target_arch = "mips32r6", - target_arch = "mips64", - target_arch = "mips64r6" - )) { - optional_actions as u32 - linux_raw_sys::ioctl::TCSETS - } else { - optional_actions as u32 - }; - unsafe { - ret(syscall_readonly!( - __NR_ioctl, - fd, - c_uint(request), - by_ref(termios) - )) - } -} - -#[inline] -pub(crate) fn tcsendbreak(fd: BorrowedFd<'_>) -> io::Result<()> { - unsafe { ret(syscall_readonly!(__NR_ioctl, fd, c_uint(TCSBRK), c_uint(0))) } -} - -#[inline] -pub(crate) fn tcdrain(fd: BorrowedFd<'_>) -> io::Result<()> { - unsafe { ret(syscall_readonly!(__NR_ioctl, fd, c_uint(TCSBRK), c_uint(1))) } -} - -#[inline] -pub(crate) fn tcflush(fd: BorrowedFd<'_>, queue_selector: QueueSelector) -> io::Result<()> { - unsafe { - ret(syscall_readonly!( - __NR_ioctl, - fd, - c_uint(TCFLSH), - c_uint(queue_selector as u32) - )) - } -} - -#[inline] -pub(crate) fn tcflow(fd: BorrowedFd<'_>, action: Action) -> io::Result<()> { - unsafe { - ret(syscall_readonly!( - __NR_ioctl, - fd, - c_uint(TCXONC), - c_uint(action as u32) - )) - } -} - -#[inline] -pub(crate) fn tcgetsid(fd: BorrowedFd<'_>) -> io::Result<Pid> { - unsafe { - let mut result = MaybeUninit::<c::pid_t>::uninit(); - ret(syscall!(__NR_ioctl, fd, c_uint(TIOCGSID), &mut result))?; - let pid = result.assume_init(); - Ok(Pid::from_raw_unchecked(pid)) - } -} - -#[inline] -pub(crate) fn tcsetwinsize(fd: BorrowedFd<'_>, winsize: Winsize) -> io::Result<()> { - unsafe { - ret(syscall_readonly!( - __NR_ioctl, - fd, - c_uint(TIOCSWINSZ), - by_ref(&winsize) - )) - } -} - -#[inline] -pub(crate) fn tcsetpgrp(fd: BorrowedFd<'_>, pid: Pid) -> io::Result<()> { - let raw_pid: c::c_int = pid.as_raw_nonzero().get(); - unsafe { - ret(syscall_readonly!( - __NR_ioctl, - fd, - c_uint(TIOCSPGRP), - by_ref(&raw_pid) - )) - } -} - -/// A wrapper around a conceptual `cfsetspeed` which handles an arbitrary -/// integer speed value. -#[inline] -pub(crate) fn set_speed(termios: &mut Termios, arbitrary_speed: u32) -> io::Result<()> { - let encoded_speed = crate::termios::speed::encode(arbitrary_speed).unwrap_or(c::BOTHER); - - debug_assert_eq!(encoded_speed & !c::CBAUD, 0); - - termios.control_modes -= ControlModes::from_bits_retain(c::CBAUD | c::CIBAUD); - termios.control_modes |= - ControlModes::from_bits_retain(encoded_speed | (encoded_speed << IBSHIFT)); - - termios.input_speed = arbitrary_speed; - termios.output_speed = arbitrary_speed; - - Ok(()) -} - -/// A wrapper around a conceptual `cfsetospeed` which handles an arbitrary -/// integer speed value. -#[inline] -pub(crate) fn set_output_speed(termios: &mut Termios, arbitrary_speed: u32) -> io::Result<()> { - let encoded_speed = crate::termios::speed::encode(arbitrary_speed).unwrap_or(c::BOTHER); - - debug_assert_eq!(encoded_speed & !c::CBAUD, 0); - - termios.control_modes -= ControlModes::from_bits_retain(c::CBAUD); - termios.control_modes |= ControlModes::from_bits_retain(encoded_speed); - - termios.output_speed = arbitrary_speed; - - Ok(()) -} - -/// A wrapper around a conceptual `cfsetispeed` which handles an arbitrary -/// integer speed value. -#[inline] -pub(crate) fn set_input_speed(termios: &mut Termios, arbitrary_speed: u32) -> io::Result<()> { - let encoded_speed = crate::termios::speed::encode(arbitrary_speed).unwrap_or(c::BOTHER); - - debug_assert_eq!(encoded_speed & !c::CBAUD, 0); - - termios.control_modes -= ControlModes::from_bits_retain(c::CIBAUD); - termios.control_modes |= ControlModes::from_bits_retain(encoded_speed << IBSHIFT); - - termios.input_speed = arbitrary_speed; - - Ok(()) -} - -#[inline] -pub(crate) fn cfmakeraw(termios: &mut Termios) { - // From the Linux [`cfmakeraw` manual page]: - // - // [`cfmakeraw` manual page]: https://man7.org/linux/man-pages/man3/cfmakeraw.3.html - termios.input_modes -= InputModes::IGNBRK - | InputModes::BRKINT - | InputModes::PARMRK - | InputModes::ISTRIP - | InputModes::INLCR - | InputModes::IGNCR - | InputModes::ICRNL - | InputModes::IXON; - termios.output_modes -= OutputModes::OPOST; - termios.local_modes -= LocalModes::ECHO - | LocalModes::ECHONL - | LocalModes::ICANON - | LocalModes::ISIG - | LocalModes::IEXTEN; - termios.control_modes -= ControlModes::CSIZE | ControlModes::PARENB; - termios.control_modes |= ControlModes::CS8; - - // Musl and glibc also do these: - termios.special_codes[SpecialCodeIndex::VMIN] = 1; - termios.special_codes[SpecialCodeIndex::VTIME] = 0; -} - -#[inline] -pub(crate) fn isatty(fd: BorrowedFd<'_>) -> bool { - // On error, Linux will return either `EINVAL` (2.6.32) or `ENOTTY` - // (otherwise), because we assume we're never passing an invalid - // file descriptor (which would get `EBADF`). Either way, an error - // means we don't have a tty. - tcgetwinsize(fd).is_ok() -} - -#[cfg(all(feature = "alloc", feature = "procfs"))] -pub(crate) fn ttyname(fd: BorrowedFd<'_>, buf: &mut [MaybeUninit<u8>]) -> io::Result<usize> { - let fd_stat = crate::backend::fs::syscalls::fstat(fd)?; - - // Quick check: if `fd` isn't a character device, it's not a tty. - if FileType::from_raw_mode(fd_stat.st_mode) != FileType::CharacterDevice { - return Err(io::Errno::NOTTY); - } - - // Check that `fd` is really a tty. - tcgetwinsize(fd)?; - - // Get a fd to "/proc/self/fd". - let proc_self_fd = procfs::proc_self_fd()?; - - // Gather the ttyname by reading the "fd" file inside `proc_self_fd`. - let r = crate::backend::fs::syscalls::readlinkat( - proc_self_fd, - DecInt::from_fd(fd).as_c_str(), - buf, - )?; - - // If the number of bytes is equal to the buffer length, truncation may - // have occurred. This check also ensures that we have enough space for - // adding a NUL terminator. - if r == buf.len() { - return Err(io::Errno::RANGE); - } - - // `readlinkat` returns the number of bytes placed in the buffer. - // NUL-terminate the string at that offset. - buf[r].write(b'\0'); - - // Check that the path we read refers to the same file as `fd`. - { - // SAFETY: We just wrote the NUL byte above - let path = unsafe { CStr::from_ptr(buf.as_ptr().cast()) }; - - let path_stat = crate::backend::fs::syscalls::stat(path)?; - if path_stat.st_dev != fd_stat.st_dev || path_stat.st_ino != fd_stat.st_ino { - return Err(io::Errno::NODEV); - } - } - - Ok(r) -} diff --git a/vendor/rustix/src/backend/linux_raw/thread/futex.rs b/vendor/rustix/src/backend/linux_raw/thread/futex.rs deleted file mode 100644 index 263e980..0000000 --- a/vendor/rustix/src/backend/linux_raw/thread/futex.rs +++ /dev/null @@ -1,45 +0,0 @@ -bitflags::bitflags! { - /// `FUTEX_*` flags for use with [`futex`]. - /// - /// [`futex`]: crate::thread::futex - #[repr(transparent)] - #[derive(Copy, Clone, Eq, PartialEq, Hash, Debug)] - pub struct FutexFlags: u32 { - /// `FUTEX_PRIVATE_FLAG` - const PRIVATE = linux_raw_sys::general::FUTEX_PRIVATE_FLAG; - /// `FUTEX_CLOCK_REALTIME` - const CLOCK_REALTIME = linux_raw_sys::general::FUTEX_CLOCK_REALTIME; - - // This deliberately lacks a `const _ = !0`, so that users can use - // `from_bits_truncate` to extract the `SocketFlags` from a flags - // value that also includes a `SocketType`. - } -} - -/// `FUTEX_*` operations for use with [`futex`]. -/// -/// [`futex`]: crate::thread::futex -#[derive(Debug, Copy, Clone, Eq, PartialEq)] -#[repr(u32)] -pub enum FutexOperation { - /// `FUTEX_WAIT` - Wait = linux_raw_sys::general::FUTEX_WAIT, - /// `FUTEX_WAKE` - Wake = linux_raw_sys::general::FUTEX_WAKE, - /// `FUTEX_FD` - Fd = linux_raw_sys::general::FUTEX_FD, - /// `FUTEX_REQUEUE` - Requeue = linux_raw_sys::general::FUTEX_REQUEUE, - /// `FUTEX_CMP_REQUEUE` - CmpRequeue = linux_raw_sys::general::FUTEX_CMP_REQUEUE, - /// `FUTEX_WAKE_OP` - WakeOp = linux_raw_sys::general::FUTEX_WAKE_OP, - /// `FUTEX_LOCK_PI` - LockPi = linux_raw_sys::general::FUTEX_LOCK_PI, - /// `FUTEX_UNLOCK_PI` - UnlockPi = linux_raw_sys::general::FUTEX_UNLOCK_PI, - /// `FUTEX_TRYLOCK_PI` - TrylockPi = linux_raw_sys::general::FUTEX_TRYLOCK_PI, - /// `FUTEX_WAIT_BITSET` - WaitBitset = linux_raw_sys::general::FUTEX_WAIT_BITSET, -} diff --git a/vendor/rustix/src/backend/linux_raw/thread/mod.rs b/vendor/rustix/src/backend/linux_raw/thread/mod.rs deleted file mode 100644 index 6a002c6..0000000 --- a/vendor/rustix/src/backend/linux_raw/thread/mod.rs +++ /dev/null @@ -1,2 +0,0 @@ -pub(crate) mod futex; -pub(crate) mod syscalls; diff --git a/vendor/rustix/src/backend/linux_raw/thread/syscalls.rs b/vendor/rustix/src/backend/linux_raw/thread/syscalls.rs deleted file mode 100644 index 0095eed..0000000 --- a/vendor/rustix/src/backend/linux_raw/thread/syscalls.rs +++ /dev/null @@ -1,347 +0,0 @@ -//! linux_raw syscalls supporting `rustix::thread`. -//! -//! # Safety -//! -//! See the `rustix::backend` module documentation for details. -#![allow(unsafe_code, clippy::undocumented_unsafe_blocks)] - -use crate::backend::c; -use crate::backend::conv::{ - by_mut, by_ref, c_int, c_uint, ret, ret_c_int, ret_c_int_infallible, ret_usize, - slice_just_addr, slice_just_addr_mut, zero, -}; -use crate::fd::BorrowedFd; -use crate::io; -use crate::pid::Pid; -use crate::thread::{ClockId, FutexFlags, FutexOperation, NanosleepRelativeResult, Timespec}; -use core::mem::MaybeUninit; -#[cfg(target_pointer_width = "32")] -use linux_raw_sys::general::timespec as __kernel_old_timespec; -use linux_raw_sys::general::{__kernel_timespec, TIMER_ABSTIME}; - -#[inline] -pub(crate) fn clock_nanosleep_relative( - id: ClockId, - req: &__kernel_timespec, -) -> NanosleepRelativeResult { - #[cfg(target_pointer_width = "32")] - unsafe { - let mut rem = MaybeUninit::<__kernel_timespec>::uninit(); - match ret(syscall!( - __NR_clock_nanosleep_time64, - id, - c_int(0), - by_ref(req), - &mut rem - )) - .or_else(|err| { - // See the comments in `rustix_clock_gettime_via_syscall` about - // emulation. - if err == io::Errno::NOSYS { - clock_nanosleep_relative_old(id, req, &mut rem) - } else { - Err(err) - } - }) { - Ok(()) => NanosleepRelativeResult::Ok, - Err(io::Errno::INTR) => NanosleepRelativeResult::Interrupted(rem.assume_init()), - Err(err) => NanosleepRelativeResult::Err(err), - } - } - #[cfg(target_pointer_width = "64")] - unsafe { - let mut rem = MaybeUninit::<__kernel_timespec>::uninit(); - match ret(syscall!( - __NR_clock_nanosleep, - id, - c_int(0), - by_ref(req), - &mut rem - )) { - Ok(()) => NanosleepRelativeResult::Ok, - Err(io::Errno::INTR) => NanosleepRelativeResult::Interrupted(rem.assume_init()), - Err(err) => NanosleepRelativeResult::Err(err), - } - } -} - -#[cfg(target_pointer_width = "32")] -unsafe fn clock_nanosleep_relative_old( - id: ClockId, - req: &__kernel_timespec, - rem: &mut MaybeUninit<__kernel_timespec>, -) -> io::Result<()> { - let old_req = __kernel_old_timespec { - tv_sec: req.tv_sec.try_into().map_err(|_| io::Errno::INVAL)?, - tv_nsec: req.tv_nsec.try_into().map_err(|_| io::Errno::INVAL)?, - }; - let mut old_rem = MaybeUninit::<__kernel_old_timespec>::uninit(); - ret(syscall!( - __NR_clock_nanosleep, - id, - c_int(0), - by_ref(&old_req), - &mut old_rem - ))?; - let old_rem = old_rem.assume_init(); - rem.write(__kernel_timespec { - tv_sec: old_rem.tv_sec.into(), - tv_nsec: old_rem.tv_nsec.into(), - }); - Ok(()) -} - -#[inline] -pub(crate) fn clock_nanosleep_absolute(id: ClockId, req: &__kernel_timespec) -> io::Result<()> { - #[cfg(target_pointer_width = "32")] - unsafe { - ret(syscall_readonly!( - __NR_clock_nanosleep_time64, - id, - c_uint(TIMER_ABSTIME), - by_ref(req), - zero() - )) - .or_else(|err| { - // See the comments in `rustix_clock_gettime_via_syscall` about - // emulation. - if err == io::Errno::NOSYS { - clock_nanosleep_absolute_old(id, req) - } else { - Err(err) - } - }) - } - #[cfg(target_pointer_width = "64")] - unsafe { - ret(syscall_readonly!( - __NR_clock_nanosleep, - id, - c_uint(TIMER_ABSTIME), - by_ref(req), - zero() - )) - } -} - -#[cfg(target_pointer_width = "32")] -unsafe fn clock_nanosleep_absolute_old(id: ClockId, req: &__kernel_timespec) -> io::Result<()> { - let old_req = __kernel_old_timespec { - tv_sec: req.tv_sec.try_into().map_err(|_| io::Errno::INVAL)?, - tv_nsec: req.tv_nsec.try_into().map_err(|_| io::Errno::INVAL)?, - }; - ret(syscall_readonly!( - __NR_clock_nanosleep, - id, - c_int(0), - by_ref(&old_req), - zero() - )) -} - -#[inline] -pub(crate) fn nanosleep(req: &__kernel_timespec) -> NanosleepRelativeResult { - #[cfg(target_pointer_width = "32")] - unsafe { - let mut rem = MaybeUninit::<__kernel_timespec>::uninit(); - match ret(syscall!( - __NR_clock_nanosleep_time64, - ClockId::Realtime, - c_int(0), - by_ref(req), - &mut rem - )) - .or_else(|err| { - // See the comments in `rustix_clock_gettime_via_syscall` about - // emulation. - if err == io::Errno::NOSYS { - nanosleep_old(req, &mut rem) - } else { - Err(err) - } - }) { - Ok(()) => NanosleepRelativeResult::Ok, - Err(io::Errno::INTR) => NanosleepRelativeResult::Interrupted(rem.assume_init()), - Err(err) => NanosleepRelativeResult::Err(err), - } - } - #[cfg(target_pointer_width = "64")] - unsafe { - let mut rem = MaybeUninit::<__kernel_timespec>::uninit(); - match ret(syscall!(__NR_nanosleep, by_ref(req), &mut rem)) { - Ok(()) => NanosleepRelativeResult::Ok, - Err(io::Errno::INTR) => NanosleepRelativeResult::Interrupted(rem.assume_init()), - Err(err) => NanosleepRelativeResult::Err(err), - } - } -} - -#[cfg(target_pointer_width = "32")] -unsafe fn nanosleep_old( - req: &__kernel_timespec, - rem: &mut MaybeUninit<__kernel_timespec>, -) -> io::Result<()> { - let old_req = __kernel_old_timespec { - tv_sec: req.tv_sec.try_into().map_err(|_| io::Errno::INVAL)?, - tv_nsec: req.tv_nsec.try_into().map_err(|_| io::Errno::INVAL)?, - }; - let mut old_rem = MaybeUninit::<__kernel_old_timespec>::uninit(); - ret(syscall!(__NR_nanosleep, by_ref(&old_req), &mut old_rem))?; - let old_rem = old_rem.assume_init(); - rem.write(__kernel_timespec { - tv_sec: old_rem.tv_sec.into(), - tv_nsec: old_rem.tv_nsec.into(), - }); - Ok(()) -} - -#[inline] -pub(crate) fn gettid() -> Pid { - unsafe { - let tid = ret_c_int_infallible(syscall_readonly!(__NR_gettid)); - Pid::from_raw_unchecked(tid) - } -} - -// TODO: This could be de-multiplexed. -#[inline] -pub(crate) unsafe fn futex( - uaddr: *mut u32, - op: FutexOperation, - flags: FutexFlags, - val: u32, - utime: *const Timespec, - uaddr2: *mut u32, - val3: u32, -) -> io::Result<usize> { - #[cfg(target_pointer_width = "32")] - { - ret_usize(syscall!( - __NR_futex_time64, - uaddr, - (op, flags), - c_uint(val), - utime, - uaddr2, - c_uint(val3) - )) - .or_else(|err| { - // See the comments in `rustix_clock_gettime_via_syscall` about - // emulation. - if err == io::Errno::NOSYS { - futex_old(uaddr, op, flags, val, utime, uaddr2, val3) - } else { - Err(err) - } - }) - } - #[cfg(target_pointer_width = "64")] - ret_usize(syscall!( - __NR_futex, - uaddr, - (op, flags), - c_uint(val), - utime, - uaddr2, - c_uint(val3) - )) -} - -#[cfg(target_pointer_width = "32")] -unsafe fn futex_old( - uaddr: *mut u32, - op: FutexOperation, - flags: FutexFlags, - val: u32, - utime: *const Timespec, - uaddr2: *mut u32, - val3: u32, -) -> io::Result<usize> { - let old_utime = __kernel_old_timespec { - tv_sec: (*utime).tv_sec.try_into().map_err(|_| io::Errno::INVAL)?, - tv_nsec: (*utime).tv_nsec.try_into().map_err(|_| io::Errno::INVAL)?, - }; - ret_usize(syscall!( - __NR_futex, - uaddr, - (op, flags), - c_uint(val), - by_ref(&old_utime), - uaddr2, - c_uint(val3) - )) -} - -#[inline] -pub(crate) fn setns(fd: BorrowedFd<'_>, nstype: c::c_int) -> io::Result<c::c_int> { - unsafe { ret_c_int(syscall_readonly!(__NR_setns, fd, c_int(nstype))) } -} - -#[inline] -pub(crate) fn unshare(flags: crate::thread::UnshareFlags) -> io::Result<()> { - unsafe { ret(syscall_readonly!(__NR_unshare, flags)) } -} - -#[inline] -pub(crate) fn capget( - header: &mut linux_raw_sys::general::__user_cap_header_struct, - data: &mut [MaybeUninit<linux_raw_sys::general::__user_cap_data_struct>], -) -> io::Result<()> { - unsafe { - ret(syscall!( - __NR_capget, - by_mut(header), - slice_just_addr_mut(data) - )) - } -} - -#[inline] -pub(crate) fn capset( - header: &mut linux_raw_sys::general::__user_cap_header_struct, - data: &[linux_raw_sys::general::__user_cap_data_struct], -) -> io::Result<()> { - unsafe { ret(syscall!(__NR_capset, by_mut(header), slice_just_addr(data))) } -} - -#[inline] -pub(crate) fn setuid_thread(uid: crate::ugid::Uid) -> io::Result<()> { - unsafe { ret(syscall_readonly!(__NR_setuid, uid)) } -} - -#[inline] -pub(crate) fn setresuid_thread( - ruid: crate::ugid::Uid, - euid: crate::ugid::Uid, - suid: crate::ugid::Uid, -) -> io::Result<()> { - #[cfg(any(target_arch = "x86", target_arch = "arm", target_arch = "sparc"))] - unsafe { - ret(syscall_readonly!(__NR_setresuid32, ruid, euid, suid)) - } - #[cfg(not(any(target_arch = "x86", target_arch = "arm", target_arch = "sparc")))] - unsafe { - ret(syscall_readonly!(__NR_setresuid, ruid, euid, suid)) - } -} - -#[inline] -pub(crate) fn setgid_thread(gid: crate::ugid::Gid) -> io::Result<()> { - unsafe { ret(syscall_readonly!(__NR_setgid, gid)) } -} - -#[inline] -pub(crate) fn setresgid_thread( - rgid: crate::ugid::Gid, - egid: crate::ugid::Gid, - sgid: crate::ugid::Gid, -) -> io::Result<()> { - #[cfg(any(target_arch = "x86", target_arch = "arm", target_arch = "sparc"))] - unsafe { - ret(syscall_readonly!(__NR_setresgid32, rgid, egid, sgid)) - } - #[cfg(not(any(target_arch = "x86", target_arch = "arm", target_arch = "sparc")))] - unsafe { - ret(syscall_readonly!(__NR_setresgid, rgid, egid, sgid)) - } -} diff --git a/vendor/rustix/src/backend/linux_raw/time/mod.rs b/vendor/rustix/src/backend/linux_raw/time/mod.rs deleted file mode 100644 index c42592c..0000000 --- a/vendor/rustix/src/backend/linux_raw/time/mod.rs +++ /dev/null @@ -1,3 +0,0 @@ -#[cfg(any(feature = "time", target_arch = "x86"))] -pub(crate) mod syscalls; -pub(crate) mod types; diff --git a/vendor/rustix/src/backend/linux_raw/time/syscalls.rs b/vendor/rustix/src/backend/linux_raw/time/syscalls.rs deleted file mode 100644 index d20bcfa..0000000 --- a/vendor/rustix/src/backend/linux_raw/time/syscalls.rs +++ /dev/null @@ -1,257 +0,0 @@ -//! linux_raw syscalls supporting `rustix::time`. -//! -//! # Safety -//! -//! See the `rustix::backend` module documentation for details. -#![allow(unsafe_code, clippy::undocumented_unsafe_blocks)] - -use crate::backend::conv::{ret, ret_infallible}; -use crate::clockid::ClockId; -use crate::io; -use crate::timespec::Timespec; -use core::mem::MaybeUninit; -#[cfg(all(feature = "time", target_pointer_width = "32"))] -use linux_raw_sys::general::itimerspec as __kernel_old_itimerspec; -#[cfg(target_pointer_width = "32")] -use linux_raw_sys::general::timespec as __kernel_old_timespec; -#[cfg(feature = "time")] -use { - crate::backend::conv::{by_ref, ret_owned_fd}, - crate::fd::BorrowedFd, - crate::fd::OwnedFd, - crate::time::{Itimerspec, TimerfdClockId, TimerfdFlags, TimerfdTimerFlags}, -}; - -// `clock_gettime` has special optimizations via the vDSO. -#[cfg(feature = "time")] -pub(crate) use crate::backend::vdso_wrappers::{clock_gettime, clock_gettime_dynamic}; - -#[inline] -pub(crate) fn clock_getres(which_clock: ClockId) -> Timespec { - #[cfg(target_pointer_width = "32")] - unsafe { - let mut result = MaybeUninit::<Timespec>::uninit(); - if let Err(err) = ret(syscall!(__NR_clock_getres_time64, which_clock, &mut result)) { - // See the comments in `rustix_clock_gettime_via_syscall` about - // emulation. - debug_assert_eq!(err, io::Errno::NOSYS); - clock_getres_old(which_clock, &mut result); - } - result.assume_init() - } - #[cfg(target_pointer_width = "64")] - unsafe { - let mut result = MaybeUninit::<Timespec>::uninit(); - ret_infallible(syscall!(__NR_clock_getres, which_clock, &mut result)); - result.assume_init() - } -} - -#[cfg(target_pointer_width = "32")] -unsafe fn clock_getres_old(which_clock: ClockId, result: &mut MaybeUninit<Timespec>) { - let mut old_result = MaybeUninit::<__kernel_old_timespec>::uninit(); - ret_infallible(syscall!(__NR_clock_getres, which_clock, &mut old_result)); - let old_result = old_result.assume_init(); - result.write(Timespec { - tv_sec: old_result.tv_sec.into(), - tv_nsec: old_result.tv_nsec.into(), - }); -} - -#[cfg(feature = "time")] -#[inline] -pub(crate) fn clock_settime(which_clock: ClockId, timespec: Timespec) -> io::Result<()> { - // `clock_settime64` was introduced in Linux 5.1. The old `clock_settime` - // syscall is not y2038-compatible on 32-bit architectures. - #[cfg(target_pointer_width = "32")] - unsafe { - match ret(syscall_readonly!( - __NR_clock_settime64, - which_clock, - by_ref(×pec) - )) { - Err(io::Errno::NOSYS) => clock_settime_old(which_clock, timespec), - otherwise => otherwise, - } - } - #[cfg(target_pointer_width = "64")] - unsafe { - ret(syscall_readonly!( - __NR_clock_settime, - which_clock, - by_ref(×pec) - )) - } -} - -#[cfg(feature = "time")] -#[cfg(target_pointer_width = "32")] -unsafe fn clock_settime_old(which_clock: ClockId, timespec: Timespec) -> io::Result<()> { - let old_timespec = __kernel_old_timespec { - tv_sec: timespec - .tv_sec - .try_into() - .map_err(|_| io::Errno::OVERFLOW)?, - tv_nsec: timespec.tv_nsec as _, - }; - ret(syscall_readonly!( - __NR_clock_settime, - which_clock, - by_ref(&old_timespec) - )) -} - -#[cfg(feature = "time")] -#[inline] -pub(crate) fn timerfd_create(clockid: TimerfdClockId, flags: TimerfdFlags) -> io::Result<OwnedFd> { - unsafe { ret_owned_fd(syscall_readonly!(__NR_timerfd_create, clockid, flags)) } -} - -#[cfg(feature = "time")] -#[inline] -pub(crate) fn timerfd_settime( - fd: BorrowedFd<'_>, - flags: TimerfdTimerFlags, - new_value: &Itimerspec, -) -> io::Result<Itimerspec> { - let mut result = MaybeUninit::<Itimerspec>::uninit(); - - #[cfg(target_pointer_width = "64")] - unsafe { - ret(syscall!( - __NR_timerfd_settime, - fd, - flags, - by_ref(new_value), - &mut result - ))?; - Ok(result.assume_init()) - } - - #[cfg(target_pointer_width = "32")] - unsafe { - ret(syscall!( - __NR_timerfd_settime64, - fd, - flags, - by_ref(new_value), - &mut result - )) - .or_else(|err| { - // See the comments in `rustix_clock_gettime_via_syscall` about - // emulation. - if err == io::Errno::NOSYS { - timerfd_settime_old(fd, flags, new_value, &mut result) - } else { - Err(err) - } - })?; - Ok(result.assume_init()) - } -} - -#[cfg(feature = "time")] -#[cfg(target_pointer_width = "32")] -unsafe fn timerfd_settime_old( - fd: BorrowedFd<'_>, - flags: TimerfdTimerFlags, - new_value: &Itimerspec, - result: &mut MaybeUninit<Itimerspec>, -) -> io::Result<()> { - let mut old_result = MaybeUninit::<__kernel_old_itimerspec>::uninit(); - - // Convert `new_value` to the old `__kernel_old_itimerspec` format. - let old_new_value = __kernel_old_itimerspec { - it_interval: __kernel_old_timespec { - tv_sec: new_value - .it_interval - .tv_sec - .try_into() - .map_err(|_| io::Errno::OVERFLOW)?, - tv_nsec: new_value - .it_interval - .tv_nsec - .try_into() - .map_err(|_| io::Errno::INVAL)?, - }, - it_value: __kernel_old_timespec { - tv_sec: new_value - .it_value - .tv_sec - .try_into() - .map_err(|_| io::Errno::OVERFLOW)?, - tv_nsec: new_value - .it_value - .tv_nsec - .try_into() - .map_err(|_| io::Errno::INVAL)?, - }, - }; - ret(syscall!( - __NR_timerfd_settime, - fd, - flags, - by_ref(&old_new_value), - &mut old_result - ))?; - let old_result = old_result.assume_init(); - result.write(Itimerspec { - it_interval: Timespec { - tv_sec: old_result.it_interval.tv_sec.into(), - tv_nsec: old_result.it_interval.tv_nsec.into(), - }, - it_value: Timespec { - tv_sec: old_result.it_value.tv_sec.into(), - tv_nsec: old_result.it_value.tv_nsec.into(), - }, - }); - Ok(()) -} - -#[cfg(feature = "time")] -#[inline] -pub(crate) fn timerfd_gettime(fd: BorrowedFd<'_>) -> io::Result<Itimerspec> { - let mut result = MaybeUninit::<Itimerspec>::uninit(); - - #[cfg(target_pointer_width = "64")] - unsafe { - ret(syscall!(__NR_timerfd_gettime, fd, &mut result))?; - Ok(result.assume_init()) - } - - #[cfg(target_pointer_width = "32")] - unsafe { - ret(syscall!(__NR_timerfd_gettime64, fd, &mut result)).or_else(|err| { - // See the comments in `rustix_clock_gettime_via_syscall` about - // emulation. - if err == io::Errno::NOSYS { - timerfd_gettime_old(fd, &mut result) - } else { - Err(err) - } - })?; - Ok(result.assume_init()) - } -} - -#[cfg(feature = "time")] -#[cfg(target_pointer_width = "32")] -unsafe fn timerfd_gettime_old( - fd: BorrowedFd<'_>, - result: &mut MaybeUninit<Itimerspec>, -) -> io::Result<()> { - let mut old_result = MaybeUninit::<__kernel_old_itimerspec>::uninit(); - ret(syscall!(__NR_timerfd_gettime, fd, &mut old_result))?; - let old_result = old_result.assume_init(); - result.write(Itimerspec { - it_interval: Timespec { - tv_sec: old_result.it_interval.tv_sec.into(), - tv_nsec: old_result.it_interval.tv_nsec.into(), - }, - it_value: Timespec { - tv_sec: old_result.it_value.tv_sec.into(), - tv_nsec: old_result.it_value.tv_nsec.into(), - }, - }); - Ok(()) -} diff --git a/vendor/rustix/src/backend/linux_raw/time/types.rs b/vendor/rustix/src/backend/linux_raw/time/types.rs deleted file mode 100644 index c26812c..0000000 --- a/vendor/rustix/src/backend/linux_raw/time/types.rs +++ /dev/null @@ -1,100 +0,0 @@ -use crate::backend::c; -use bitflags::bitflags; - -/// `struct itimerspec` for use with [`timerfd_gettime`] and -/// [`timerfd_settime`]. -/// -/// [`timerfd_gettime`]: crate::time::timerfd_gettime -/// [`timerfd_settime`]: crate::time::timerfd_settime -pub type Itimerspec = linux_raw_sys::general::__kernel_itimerspec; - -bitflags! { - /// `TFD_*` flags for use with [`timerfd_create`]. - /// - /// [`timerfd_create`]: crate::time::timerfd_create - #[repr(transparent)] - #[derive(Copy, Clone, Eq, PartialEq, Hash, Debug)] - pub struct TimerfdFlags: c::c_uint { - /// `TFD_NONBLOCK` - #[doc(alias = "TFD_NONBLOCK")] - const NONBLOCK = linux_raw_sys::general::TFD_NONBLOCK; - - /// `TFD_CLOEXEC` - #[doc(alias = "TFD_CLOEXEC")] - const CLOEXEC = linux_raw_sys::general::TFD_CLOEXEC; - - /// <https://docs.rs/bitflags/*/bitflags/#externally-defined-flags> - const _ = !0; - } -} - -bitflags! { - /// `TFD_TIMER_*` flags for use with [`timerfd_settime`]. - /// - /// [`timerfd_settime`]: crate::time::timerfd_settime - #[repr(transparent)] - #[derive(Copy, Clone, Eq, PartialEq, Hash, Debug)] - pub struct TimerfdTimerFlags: c::c_uint { - /// `TFD_TIMER_ABSTIME` - #[doc(alias = "TFD_TIMER_ABSTIME")] - const ABSTIME = linux_raw_sys::general::TFD_TIMER_ABSTIME; - - /// `TFD_TIMER_CANCEL_ON_SET` - #[doc(alias = "TFD_TIMER_CANCEL_ON_SET")] - const CANCEL_ON_SET = linux_raw_sys::general::TFD_TIMER_CANCEL_ON_SET; - - /// <https://docs.rs/bitflags/*/bitflags/#externally-defined-flags> - const _ = !0; - } -} - -/// `CLOCK_*` constants for use with [`timerfd_create`]. -/// -/// [`timerfd_create`]: crate::time::timerfd_create -#[derive(Debug, Copy, Clone, Eq, PartialEq, Hash)] -#[repr(u32)] -#[non_exhaustive] -pub enum TimerfdClockId { - /// `CLOCK_REALTIME`—A clock that tells the “real” time. - /// - /// This is a clock that tells the amount of time elapsed since the Unix - /// epoch, 1970-01-01T00:00:00Z. The clock is externally settable, so it is - /// not monotonic. Successive reads may see decreasing times, so it isn't - /// reliable for measuring durations. - #[doc(alias = "CLOCK_REALTIME")] - Realtime = linux_raw_sys::general::CLOCK_REALTIME, - - /// `CLOCK_MONOTONIC`—A clock that tells an abstract time. - /// - /// Unlike `Realtime`, this clock is not based on a fixed known epoch, so - /// individual times aren't meaningful. However, since it isn't settable, - /// it is reliable for measuring durations. - /// - /// This clock does not advance while the system is suspended; see - /// `Boottime` for a clock that does. - #[doc(alias = "CLOCK_MONOTONIC")] - Monotonic = linux_raw_sys::general::CLOCK_MONOTONIC, - - /// `CLOCK_BOOTTIME`—Like `Monotonic`, but advances while suspended. - /// - /// This clock is similar to `Monotonic`, but does advance while the system - /// is suspended. - #[doc(alias = "CLOCK_BOOTTIME")] - Boottime = linux_raw_sys::general::CLOCK_BOOTTIME, - - /// `CLOCK_REALTIME_ALARM`—Like `Realtime`, but wakes a suspended system. - /// - /// This clock is like `Realtime`, but can wake up a suspended system. - /// - /// Use of this clock requires the `CAP_WAKE_ALARM` Linux capability. - #[doc(alias = "CLOCK_REALTIME_ALARM")] - RealtimeAlarm = linux_raw_sys::general::CLOCK_REALTIME_ALARM, - - /// `CLOCK_BOOTTIME_ALARM`—Like `Boottime`, but wakes a suspended system. - /// - /// This clock is like `Boottime`, but can wake up a suspended system. - /// - /// Use of this clock requires the `CAP_WAKE_ALARM` Linux capability. - #[doc(alias = "CLOCK_BOOTTIME_ALARM")] - BoottimeAlarm = linux_raw_sys::general::CLOCK_BOOTTIME_ALARM, -} diff --git a/vendor/rustix/src/backend/linux_raw/ugid/mod.rs b/vendor/rustix/src/backend/linux_raw/ugid/mod.rs deleted file mode 100644 index ef944f0..0000000 --- a/vendor/rustix/src/backend/linux_raw/ugid/mod.rs +++ /dev/null @@ -1 +0,0 @@ -pub(crate) mod syscalls; diff --git a/vendor/rustix/src/backend/linux_raw/ugid/syscalls.rs b/vendor/rustix/src/backend/linux_raw/ugid/syscalls.rs deleted file mode 100644 index 5f1551e..0000000 --- a/vendor/rustix/src/backend/linux_raw/ugid/syscalls.rs +++ /dev/null @@ -1,66 +0,0 @@ -//! linux_raw syscalls for UIDs and GIDs -//! -//! # Safety -//! -//! See the `rustix::backend` module documentation for details. -#![allow(unsafe_code, clippy::undocumented_unsafe_blocks)] - -use crate::backend::c; -use crate::backend::conv::ret_usize_infallible; -use crate::ugid::{Gid, Uid}; - -#[inline] -pub(crate) fn getuid() -> Uid { - #[cfg(any(target_arch = "arm", target_arch = "sparc", target_arch = "x86"))] - unsafe { - let uid = ret_usize_infallible(syscall_readonly!(__NR_getuid32)) as c::uid_t; - Uid::from_raw(uid) - } - #[cfg(not(any(target_arch = "arm", target_arch = "sparc", target_arch = "x86")))] - unsafe { - let uid = ret_usize_infallible(syscall_readonly!(__NR_getuid)) as c::uid_t; - Uid::from_raw(uid) - } -} - -#[inline] -pub(crate) fn geteuid() -> Uid { - #[cfg(any(target_arch = "arm", target_arch = "sparc", target_arch = "x86"))] - unsafe { - let uid = ret_usize_infallible(syscall_readonly!(__NR_geteuid32)) as c::uid_t; - Uid::from_raw(uid) - } - #[cfg(not(any(target_arch = "arm", target_arch = "sparc", target_arch = "x86")))] - unsafe { - let uid = ret_usize_infallible(syscall_readonly!(__NR_geteuid)) as c::uid_t; - Uid::from_raw(uid) - } -} - -#[inline] -pub(crate) fn getgid() -> Gid { - #[cfg(any(target_arch = "arm", target_arch = "sparc", target_arch = "x86"))] - unsafe { - let gid = ret_usize_infallible(syscall_readonly!(__NR_getgid32)) as c::gid_t; - Gid::from_raw(gid) - } - #[cfg(not(any(target_arch = "arm", target_arch = "sparc", target_arch = "x86")))] - unsafe { - let gid = ret_usize_infallible(syscall_readonly!(__NR_getgid)) as c::gid_t; - Gid::from_raw(gid) - } -} - -#[inline] -pub(crate) fn getegid() -> Gid { - #[cfg(any(target_arch = "arm", target_arch = "sparc", target_arch = "x86"))] - unsafe { - let gid = ret_usize_infallible(syscall_readonly!(__NR_getegid32)) as c::gid_t; - Gid::from_raw(gid) - } - #[cfg(not(any(target_arch = "arm", target_arch = "sparc", target_arch = "x86")))] - unsafe { - let gid = ret_usize_infallible(syscall_readonly!(__NR_getegid)) as c::gid_t; - Gid::from_raw(gid) - } -} diff --git a/vendor/rustix/src/backend/linux_raw/vdso.rs b/vendor/rustix/src/backend/linux_raw/vdso.rs deleted file mode 100644 index 102fa6b..0000000 --- a/vendor/rustix/src/backend/linux_raw/vdso.rs +++ /dev/null @@ -1,313 +0,0 @@ -//! Parse the Linux vDSO. -//! -//! The following code is transliterated from -//! tools/testing/selftests/vDSO/parse_vdso.c in Linux 5.11, which is licensed -//! with Creative Commons Zero License, version 1.0, -//! available at <https://creativecommons.org/publicdomain/zero/1.0/legalcode> -//! -//! # Safety -//! -//! Parsing the vDSO involves a lot of raw pointer manipulation. This -//! implementation follows Linux's reference implementation, and adds several -//! additional safety checks. -#![allow(unsafe_code)] - -use super::c; -use crate::ffi::CStr; -use crate::utils::check_raw_pointer; -use core::ffi::c_void; -use core::mem::size_of; -use core::ptr::{null, null_mut}; -use linux_raw_sys::elf::*; - -pub(super) struct Vdso { - // Load information - load_addr: *const Elf_Ehdr, - load_end: *const c_void, // the end of the `PT_LOAD` segment - pv_offset: usize, // recorded paddr - recorded vaddr - - // Symbol table - symtab: *const Elf_Sym, - symstrings: *const u8, - bucket: *const u32, - chain: *const u32, - nbucket: u32, - //nchain: u32, - - // Version table - versym: *const u16, - verdef: *const Elf_Verdef, -} - -// Straight from the ELF specification. -fn elf_hash(name: &CStr) -> u32 { - let mut h: u32 = 0; - for b in name.to_bytes() { - h = (h << 4).wrapping_add(u32::from(*b)); - let g = h & 0xf000_0000; - if g != 0 { - h ^= g >> 24; - } - h &= !g; - } - h -} - -/// Create a `Vdso` value by parsing the vDSO at the `sysinfo_ehdr` address. -fn init_from_sysinfo_ehdr() -> Option<Vdso> { - // SAFETY: The auxv initialization code does extensive checks to ensure - // that the value we get really is an `AT_SYSINFO_EHDR` value from the - // kernel. - unsafe { - let hdr = super::param::auxv::sysinfo_ehdr(); - - // If the platform doesn't provide a `AT_SYSINFO_EHDR`, we can't locate - // the vDSO. - if hdr.is_null() { - return None; - } - - let mut vdso = Vdso { - load_addr: hdr, - load_end: hdr.cast(), - pv_offset: 0, - symtab: null(), - symstrings: null(), - bucket: null(), - chain: null(), - nbucket: 0, - //nchain: 0, - versym: null(), - verdef: null(), - }; - - let hdr = &*hdr; - let pt = check_raw_pointer::<Elf_Phdr>(vdso.base_plus(hdr.e_phoff)? as *mut _)?.as_ptr(); - let mut dyn_: *const Elf_Dyn = null(); - let mut num_dyn = 0; - - // We need two things from the segment table: the load offset - // and the dynamic table. - let mut found_vaddr = false; - for i in 0..hdr.e_phnum { - let phdr = &*pt.add(i as usize); - if phdr.p_flags & PF_W != 0 { - // Don't trust any vDSO that claims to be loading writable - // segments into memory. - return None; - } - if phdr.p_type == PT_LOAD && !found_vaddr { - // The segment should be readable and executable, because it - // contains the symbol table and the function bodies. - if phdr.p_flags & (PF_R | PF_X) != (PF_R | PF_X) { - return None; - } - found_vaddr = true; - vdso.load_end = vdso.base_plus(phdr.p_offset.checked_add(phdr.p_memsz)?)?; - vdso.pv_offset = phdr.p_offset.wrapping_sub(phdr.p_vaddr); - } else if phdr.p_type == PT_DYNAMIC { - // If `p_offset` is zero, it's more likely that we're looking - // at memory that has been zeroed than that the kernel has - // somehow aliased the `Ehdr` and the `Elf_Dyn` array. - if phdr.p_offset < size_of::<Elf_Ehdr>() { - return None; - } - - dyn_ = check_raw_pointer::<Elf_Dyn>(vdso.base_plus(phdr.p_offset)? as *mut _)? - .as_ptr(); - num_dyn = phdr.p_memsz / size_of::<Elf_Dyn>(); - } else if phdr.p_type == PT_INTERP || phdr.p_type == PT_GNU_RELRO { - // Don't trust any ELF image that has an “interpreter” or - // that uses RELRO, which is likely to be a user ELF image - // rather and not the kernel vDSO. - return None; - } - } - - if !found_vaddr || dyn_.is_null() { - return None; // Failed - } - - // Fish out the useful bits of the dynamic table. - let mut hash: *const u32 = null(); - vdso.symstrings = null(); - vdso.symtab = null(); - vdso.versym = null(); - vdso.verdef = null(); - let mut i = 0; - loop { - if i == num_dyn { - return None; - } - let d = &*dyn_.add(i); - match d.d_tag { - DT_STRTAB => { - vdso.symstrings = - check_raw_pointer::<u8>(vdso.addr_from_elf(d.d_un.d_ptr)? as *mut _)? - .as_ptr(); - } - DT_SYMTAB => { - vdso.symtab = - check_raw_pointer::<Elf_Sym>(vdso.addr_from_elf(d.d_un.d_ptr)? as *mut _)? - .as_ptr(); - } - DT_HASH => { - hash = check_raw_pointer::<u32>(vdso.addr_from_elf(d.d_un.d_ptr)? as *mut _)? - .as_ptr(); - } - DT_VERSYM => { - vdso.versym = - check_raw_pointer::<u16>(vdso.addr_from_elf(d.d_un.d_ptr)? as *mut _)? - .as_ptr(); - } - DT_VERDEF => { - vdso.verdef = check_raw_pointer::<Elf_Verdef>( - vdso.addr_from_elf(d.d_un.d_ptr)? as *mut _, - )? - .as_ptr(); - } - DT_SYMENT => { - if d.d_un.d_ptr != size_of::<Elf_Sym>() { - return None; // Failed - } - } - DT_NULL => break, - _ => {} - } - i = i.checked_add(1)?; - } - // The upstream code checks `symstrings`, `symtab`, and `hash` for - // null; here, `check_raw_pointer` has already done that. - - if vdso.verdef.is_null() { - vdso.versym = null(); - } - - // Parse the hash table header. - vdso.nbucket = *hash.add(0); - //vdso.nchain = *hash.add(1); - vdso.bucket = hash.add(2); - vdso.chain = hash.add(vdso.nbucket as usize + 2); - - // That's all we need. - Some(vdso) - } -} - -impl Vdso { - /// Parse the vDSO. - /// - /// Returns `None` if the vDSO can't be located or if it doesn't conform to - /// our expectations. - #[inline] - pub(super) fn new() -> Option<Self> { - init_from_sysinfo_ehdr() - } - - /// Check the version for a symbol. - /// - /// # Safety - /// - /// The raw pointers inside `self` must be valid. - unsafe fn match_version(&self, mut ver: u16, name: &CStr, hash: u32) -> bool { - // This is a helper function to check if the version indexed by - // ver matches name (which hashes to hash). - // - // The version definition table is a mess, and I don't know how - // to do this in better than linear time without allocating memory - // to build an index. I also don't know why the table has - // variable size entries in the first place. - // - // For added fun, I can't find a comprehensible specification of how - // to parse all the weird flags in the table. - // - // So I just parse the whole table every time. - - // First step: find the version definition - ver &= 0x7fff; // Apparently bit 15 means "hidden" - let mut def = self.verdef; - loop { - if (*def).vd_version != VER_DEF_CURRENT { - return false; // Failed - } - - if ((*def).vd_flags & VER_FLG_BASE) == 0 && ((*def).vd_ndx & 0x7fff) == ver { - break; - } - - if (*def).vd_next == 0 { - return false; // No definition. - } - - def = def - .cast::<u8>() - .add((*def).vd_next as usize) - .cast::<Elf_Verdef>(); - } - - // Now figure out whether it matches. - let aux = &*(def.cast::<u8>()) - .add((*def).vd_aux as usize) - .cast::<Elf_Verdaux>(); - (*def).vd_hash == hash - && (name == CStr::from_ptr(self.symstrings.add(aux.vda_name as usize).cast())) - } - - /// Look up a symbol in the vDSO. - pub(super) fn sym(&self, version: &CStr, name: &CStr) -> *mut c::c_void { - let ver_hash = elf_hash(version); - let name_hash = elf_hash(name); - - // SAFETY: The pointers in `self` must be valid. - unsafe { - let mut chain = *self.bucket.add((name_hash % self.nbucket) as usize); - - while chain != STN_UNDEF { - let sym = &*self.symtab.add(chain as usize); - - // Check for a defined global or weak function w/ right name. - // - // The reference parser in Linux's parse_vdso.c requires - // symbols to have type `STT_FUNC`, but on powerpc64, the vDSO - // uses `STT_NOTYPE`, so allow that too. - if (ELF_ST_TYPE(sym.st_info) != STT_FUNC && - ELF_ST_TYPE(sym.st_info) != STT_NOTYPE) - || (ELF_ST_BIND(sym.st_info) != STB_GLOBAL - && ELF_ST_BIND(sym.st_info) != STB_WEAK) - || sym.st_shndx == SHN_UNDEF - || sym.st_shndx == SHN_ABS - || ELF_ST_VISIBILITY(sym.st_other) != STV_DEFAULT - || (name != CStr::from_ptr(self.symstrings.add(sym.st_name as usize).cast())) - // Check symbol version. - || (!self.versym.is_null() - && !self.match_version(*self.versym.add(chain as usize), version, ver_hash)) - { - chain = *self.chain.add(chain as usize); - continue; - } - - let sum = self.addr_from_elf(sym.st_value).unwrap(); - assert!( - sum as usize >= self.load_addr as usize - && sum as usize <= self.load_end as usize - ); - return sum as *mut c::c_void; - } - } - - null_mut() - } - - /// Add the given address to the vDSO base address. - unsafe fn base_plus(&self, offset: usize) -> Option<*const c_void> { - // Check for overflow. - let _ = (self.load_addr as usize).checked_add(offset)?; - // Add the offset to the base. - Some(self.load_addr.cast::<u8>().add(offset).cast()) - } - - /// Translate an ELF-address-space address into a usable virtual address. - unsafe fn addr_from_elf(&self, elf_addr: usize) -> Option<*const c_void> { - self.base_plus(elf_addr.wrapping_add(self.pv_offset)) - } -} diff --git a/vendor/rustix/src/backend/linux_raw/vdso_wrappers.rs b/vendor/rustix/src/backend/linux_raw/vdso_wrappers.rs deleted file mode 100644 index 441738f..0000000 --- a/vendor/rustix/src/backend/linux_raw/vdso_wrappers.rs +++ /dev/null @@ -1,608 +0,0 @@ -//! Implement syscalls using the vDSO. -//! -//! <https://man7.org/linux/man-pages/man7/vdso.7.html> -//! -//! # Safety -//! -//! Similar to syscalls.rs, this file performs raw system calls, and sometimes -//! passes them uninitialized memory buffers. This file also calls vDSO -//! functions. -#![allow(unsafe_code)] - -#[cfg(target_arch = "x86")] -use super::reg::{ArgReg, RetReg, SyscallNumber, A0, A1, A2, A3, A4, A5, R0}; -use super::vdso; -#[cfg(target_arch = "x86")] -use core::arch::global_asm; -#[cfg(feature = "process")] -#[cfg(any( - target_arch = "x86_64", - target_arch = "x86", - target_arch = "riscv64", - target_arch = "powerpc64" -))] -use core::ffi::c_void; -use core::mem::transmute; -use core::ptr::null_mut; -use core::sync::atomic::AtomicPtr; -use core::sync::atomic::Ordering::Relaxed; -#[cfg(target_pointer_width = "32")] -#[cfg(feature = "time")] -use linux_raw_sys::general::timespec as __kernel_old_timespec; -#[cfg(any( - all( - feature = "process", - any( - target_arch = "x86_64", - target_arch = "x86", - target_arch = "riscv64", - target_arch = "powerpc64" - ) - ), - feature = "time" -))] -use {super::c, super::conv::ret, core::mem::MaybeUninit}; -#[cfg(feature = "time")] -use { - super::conv::c_int, - crate::clockid::{ClockId, DynamicClockId}, - crate::io, - crate::timespec::Timespec, - linux_raw_sys::general::{__kernel_clockid_t, __kernel_timespec}, -}; - -#[cfg(feature = "time")] -#[inline] -pub(crate) fn clock_gettime(which_clock: ClockId) -> __kernel_timespec { - // SAFETY: `CLOCK_GETTIME` contains either null or the address of a - // function with an ABI like libc `clock_gettime`, and calling it has the - // side effect of writing to the result buffer, and no others. - unsafe { - let mut result = MaybeUninit::<__kernel_timespec>::uninit(); - let callee = match transmute(CLOCK_GETTIME.load(Relaxed)) { - Some(callee) => callee, - None => init_clock_gettime(), - }; - let r0 = callee(which_clock as c::c_int, result.as_mut_ptr()); - // The `ClockId` enum only contains clocks which never fail. It may be - // tempting to change this to `debug_assert_eq`, however they can still - // fail on uncommon kernel configs, so we leave this in place to ensure - // that we don't execute undefined behavior if they ever do fail. - assert_eq!(r0, 0); - result.assume_init() - } -} - -#[cfg(feature = "time")] -#[inline] -pub(crate) fn clock_gettime_dynamic(which_clock: DynamicClockId<'_>) -> io::Result<Timespec> { - let id = match which_clock { - DynamicClockId::Known(id) => id as __kernel_clockid_t, - - DynamicClockId::Dynamic(fd) => { - // See `FD_TO_CLOCKID` in Linux's `clock_gettime` documentation. - use crate::backend::fd::AsRawFd; - const CLOCKFD: i32 = 3; - ((!fd.as_raw_fd() << 3) | CLOCKFD) as __kernel_clockid_t - } - - DynamicClockId::RealtimeAlarm => c::CLOCK_REALTIME_ALARM as __kernel_clockid_t, - DynamicClockId::Tai => c::CLOCK_TAI as __kernel_clockid_t, - DynamicClockId::Boottime => c::CLOCK_BOOTTIME as __kernel_clockid_t, - DynamicClockId::BoottimeAlarm => c::CLOCK_BOOTTIME_ALARM as __kernel_clockid_t, - }; - - // SAFETY: `CLOCK_GETTIME` contains either null or the address of a - // function with an ABI like libc `clock_gettime`, and calling it has the - // side effect of writing to the result buffer, and no others. - unsafe { - const EINVAL: c::c_int = -(c::EINVAL as c::c_int); - let mut timespec = MaybeUninit::<Timespec>::uninit(); - let callee = match transmute(CLOCK_GETTIME.load(Relaxed)) { - Some(callee) => callee, - None => init_clock_gettime(), - }; - match callee(id, timespec.as_mut_ptr()) { - 0 => (), - EINVAL => return Err(io::Errno::INVAL), - _ => _rustix_clock_gettime_via_syscall(id, timespec.as_mut_ptr())?, - } - Ok(timespec.assume_init()) - } -} - -#[cfg(feature = "process")] -#[cfg(any( - target_arch = "x86_64", - target_arch = "x86", - target_arch = "riscv64", - target_arch = "powerpc64" -))] -#[inline] -pub(crate) fn sched_getcpu() -> usize { - // SAFETY: `GETCPU` contains either null or the address of a function with - // an ABI like libc `getcpu`, and calling it has the side effect of writing - // to the result buffers, and no others. - unsafe { - let mut cpu = MaybeUninit::<u32>::uninit(); - let callee = match transmute(GETCPU.load(Relaxed)) { - Some(callee) => callee, - None => init_getcpu(), - }; - let r0 = callee(cpu.as_mut_ptr(), null_mut(), null_mut()); - debug_assert_eq!(r0, 0); - cpu.assume_init() as usize - } -} - -#[cfg(target_arch = "x86")] -pub(super) mod x86_via_vdso { - use super::{transmute, ArgReg, Relaxed, RetReg, SyscallNumber, A0, A1, A2, A3, A4, A5, R0}; - use crate::backend::arch::asm; - - #[inline] - pub(in crate::backend) unsafe fn syscall0(nr: SyscallNumber<'_>) -> RetReg<R0> { - let callee = match transmute(super::SYSCALL.load(Relaxed)) { - Some(callee) => callee, - None => super::init_syscall(), - }; - asm::indirect_syscall0(callee, nr) - } - - #[inline] - pub(in crate::backend) unsafe fn syscall1<'a>( - nr: SyscallNumber<'a>, - a0: ArgReg<'a, A0>, - ) -> RetReg<R0> { - let callee = match transmute(super::SYSCALL.load(Relaxed)) { - Some(callee) => callee, - None => super::init_syscall(), - }; - asm::indirect_syscall1(callee, nr, a0) - } - - #[inline] - pub(in crate::backend) unsafe fn syscall1_noreturn<'a>( - nr: SyscallNumber<'a>, - a0: ArgReg<'a, A0>, - ) -> ! { - let callee = match transmute(super::SYSCALL.load(Relaxed)) { - Some(callee) => callee, - None => super::init_syscall(), - }; - asm::indirect_syscall1_noreturn(callee, nr, a0) - } - - #[inline] - pub(in crate::backend) unsafe fn syscall2<'a>( - nr: SyscallNumber<'a>, - a0: ArgReg<'a, A0>, - a1: ArgReg<'a, A1>, - ) -> RetReg<R0> { - let callee = match transmute(super::SYSCALL.load(Relaxed)) { - Some(callee) => callee, - None => super::init_syscall(), - }; - asm::indirect_syscall2(callee, nr, a0, a1) - } - - #[inline] - pub(in crate::backend) unsafe fn syscall3<'a>( - nr: SyscallNumber<'a>, - a0: ArgReg<'a, A0>, - a1: ArgReg<'a, A1>, - a2: ArgReg<'a, A2>, - ) -> RetReg<R0> { - let callee = match transmute(super::SYSCALL.load(Relaxed)) { - Some(callee) => callee, - None => super::init_syscall(), - }; - asm::indirect_syscall3(callee, nr, a0, a1, a2) - } - - #[inline] - pub(in crate::backend) unsafe fn syscall4<'a>( - nr: SyscallNumber<'a>, - a0: ArgReg<'a, A0>, - a1: ArgReg<'a, A1>, - a2: ArgReg<'a, A2>, - a3: ArgReg<'a, A3>, - ) -> RetReg<R0> { - let callee = match transmute(super::SYSCALL.load(Relaxed)) { - Some(callee) => callee, - None => super::init_syscall(), - }; - asm::indirect_syscall4(callee, nr, a0, a1, a2, a3) - } - - #[inline] - pub(in crate::backend) unsafe fn syscall5<'a>( - nr: SyscallNumber<'a>, - a0: ArgReg<'a, A0>, - a1: ArgReg<'a, A1>, - a2: ArgReg<'a, A2>, - a3: ArgReg<'a, A3>, - a4: ArgReg<'a, A4>, - ) -> RetReg<R0> { - let callee = match transmute(super::SYSCALL.load(Relaxed)) { - Some(callee) => callee, - None => super::init_syscall(), - }; - asm::indirect_syscall5(callee, nr, a0, a1, a2, a3, a4) - } - - #[inline] - pub(in crate::backend) unsafe fn syscall6<'a>( - nr: SyscallNumber<'a>, - a0: ArgReg<'a, A0>, - a1: ArgReg<'a, A1>, - a2: ArgReg<'a, A2>, - a3: ArgReg<'a, A3>, - a4: ArgReg<'a, A4>, - a5: ArgReg<'a, A5>, - ) -> RetReg<R0> { - let callee = match transmute(super::SYSCALL.load(Relaxed)) { - Some(callee) => callee, - None => super::init_syscall(), - }; - asm::indirect_syscall6(callee, nr, a0, a1, a2, a3, a4, a5) - } - - // With the indirect call, it isn't meaningful to do a separate - // `_readonly` optimization. - #[allow(unused_imports)] - pub(in crate::backend) use { - syscall0 as syscall0_readonly, syscall1 as syscall1_readonly, - syscall2 as syscall2_readonly, syscall3 as syscall3_readonly, - syscall4 as syscall4_readonly, syscall5 as syscall5_readonly, - syscall6 as syscall6_readonly, - }; -} - -#[cfg(feature = "time")] -type ClockGettimeType = unsafe extern "C" fn(c::c_int, *mut Timespec) -> c::c_int; - -#[cfg(feature = "process")] -#[cfg(any( - target_arch = "x86_64", - target_arch = "x86", - target_arch = "riscv64", - target_arch = "powerpc64" -))] -type GetcpuType = unsafe extern "C" fn(*mut u32, *mut u32, *mut c_void) -> c::c_int; - -/// The underlying syscall functions are only called from asm, using the -/// special syscall calling convention to pass arguments and return values, -/// which the signature here doesn't reflect. -#[cfg(target_arch = "x86")] -pub(super) type SyscallType = unsafe extern "C" fn(); - -/// Initialize `CLOCK_GETTIME` and return its value. -#[cfg(feature = "time")] -#[cold] -fn init_clock_gettime() -> ClockGettimeType { - init(); - // SAFETY: Load the function address from static storage that we just - // initialized. - unsafe { transmute(CLOCK_GETTIME.load(Relaxed)) } -} - -/// Initialize `GETCPU` and return its value. -#[cfg(feature = "process")] -#[cfg(any( - target_arch = "x86_64", - target_arch = "x86", - target_arch = "riscv64", - target_arch = "powerpc64" -))] -#[cold] -fn init_getcpu() -> GetcpuType { - init(); - // SAFETY: Load the function address from static storage that we just - // initialized. - unsafe { transmute(GETCPU.load(Relaxed)) } -} - -/// Initialize `SYSCALL` and return its value. -#[cfg(target_arch = "x86")] -#[cold] -fn init_syscall() -> SyscallType { - init(); - // SAFETY: Load the function address from static storage that we just - // initialized. - unsafe { transmute(SYSCALL.load(Relaxed)) } -} - -/// `AtomicPtr` can't hold a `fn` pointer, so we use a `*` pointer to this -/// placeholder type, and cast it as needed. -struct Function; -#[cfg(feature = "time")] -static mut CLOCK_GETTIME: AtomicPtr<Function> = AtomicPtr::new(null_mut()); -#[cfg(feature = "process")] -#[cfg(any( - target_arch = "x86_64", - target_arch = "x86", - target_arch = "riscv64", - target_arch = "powerpc64" -))] -static mut GETCPU: AtomicPtr<Function> = AtomicPtr::new(null_mut()); -#[cfg(target_arch = "x86")] -static mut SYSCALL: AtomicPtr<Function> = AtomicPtr::new(null_mut()); - -#[cfg(feature = "time")] -unsafe extern "C" fn rustix_clock_gettime_via_syscall( - clockid: c::c_int, - res: *mut Timespec, -) -> c::c_int { - match _rustix_clock_gettime_via_syscall(clockid, res) { - Ok(()) => 0, - Err(err) => err.raw_os_error().wrapping_neg(), - } -} - -#[cfg(feature = "time")] -#[cfg(target_pointer_width = "32")] -unsafe fn _rustix_clock_gettime_via_syscall( - clockid: c::c_int, - res: *mut Timespec, -) -> io::Result<()> { - let r0 = syscall!(__NR_clock_gettime64, c_int(clockid), res); - match ret(r0) { - Err(io::Errno::NOSYS) => _rustix_clock_gettime_via_syscall_old(clockid, res), - otherwise => otherwise, - } -} - -#[cfg(feature = "time")] -#[cfg(target_pointer_width = "32")] -unsafe fn _rustix_clock_gettime_via_syscall_old( - clockid: c::c_int, - res: *mut Timespec, -) -> io::Result<()> { - // Ordinarily `rustix` doesn't like to emulate system calls, but in the - // case of time APIs, it's specific to Linux, specific to 32-bit - // architectures *and* specific to old kernel versions, and it's not that - // hard to fix up here, so that no other code needs to worry about this. - let mut old_result = MaybeUninit::<__kernel_old_timespec>::uninit(); - let r0 = syscall!(__NR_clock_gettime, c_int(clockid), &mut old_result); - match ret(r0) { - Ok(()) => { - let old_result = old_result.assume_init(); - *res = Timespec { - tv_sec: old_result.tv_sec.into(), - tv_nsec: old_result.tv_nsec.into(), - }; - Ok(()) - } - otherwise => otherwise, - } -} - -#[cfg(feature = "time")] -#[cfg(target_pointer_width = "64")] -unsafe fn _rustix_clock_gettime_via_syscall( - clockid: c::c_int, - res: *mut Timespec, -) -> io::Result<()> { - ret(syscall!(__NR_clock_gettime, c_int(clockid), res)) -} - -#[cfg(feature = "process")] -#[cfg(any( - target_arch = "x86_64", - target_arch = "x86", - target_arch = "riscv64", - target_arch = "powerpc64" -))] -unsafe extern "C" fn rustix_getcpu_via_syscall( - cpu: *mut u32, - node: *mut u32, - unused: *mut c_void, -) -> c::c_int { - match ret(syscall!(__NR_getcpu, cpu, node, unused)) { - Ok(()) => 0, - Err(err) => err.raw_os_error().wrapping_neg(), - } -} - -#[cfg(target_arch = "x86")] -extern "C" { - /// A symbol pointing to an `int 0x80` instruction. This “function” is only - /// called from assembly, and only with the x86 syscall calling convention, - /// so its signature here is not its true signature. - /// - /// This extern block and the `global_asm!` below can be replaced with - /// `#[naked]` if it's stabilized. - fn rustix_int_0x80(); -} - -#[cfg(target_arch = "x86")] -global_asm!( - r#" - .section .text.rustix_int_0x80,"ax",@progbits - .p2align 4 - .weak rustix_int_0x80 - .hidden rustix_int_0x80 - .type rustix_int_0x80, @function -rustix_int_0x80: - .cfi_startproc - int 0x80 - ret - .cfi_endproc - .size rustix_int_0x80, .-rustix_int_0x80 -"# -); - -fn minimal_init() { - // SAFETY: Store default function addresses in static storage so that if we - // end up making any system calls while we read the vDSO, they'll work. If - // the memory happens to already be initialized, this is redundant, but not - // harmful. - unsafe { - #[cfg(feature = "time")] - { - CLOCK_GETTIME - .compare_exchange( - null_mut(), - rustix_clock_gettime_via_syscall as *mut Function, - Relaxed, - Relaxed, - ) - .ok(); - } - - #[cfg(feature = "process")] - #[cfg(any( - target_arch = "x86_64", - target_arch = "x86", - target_arch = "riscv64", - target_arch = "powerpc64" - ))] - { - GETCPU - .compare_exchange( - null_mut(), - rustix_getcpu_via_syscall as *mut Function, - Relaxed, - Relaxed, - ) - .ok(); - } - - #[cfg(target_arch = "x86")] - { - SYSCALL - .compare_exchange( - null_mut(), - rustix_int_0x80 as *mut Function, - Relaxed, - Relaxed, - ) - .ok(); - } - } -} - -fn init() { - minimal_init(); - - if let Some(vdso) = vdso::Vdso::new() { - #[cfg(feature = "time")] - { - // Look up the platform-specific `clock_gettime` symbol as - // documented [here], except on 32-bit platforms where we look up - // the `64`-suffixed variant and fail if we don't find it. - // - // [here]: https://man7.org/linux/man-pages/man7/vdso.7.html - #[cfg(target_arch = "x86_64")] - let ptr = vdso.sym(cstr!("LINUX_2.6"), cstr!("__vdso_clock_gettime")); - #[cfg(target_arch = "arm")] - let ptr = vdso.sym(cstr!("LINUX_2.6"), cstr!("__vdso_clock_gettime64")); - #[cfg(target_arch = "aarch64")] - let ptr = vdso.sym(cstr!("LINUX_2.6.39"), cstr!("__kernel_clock_gettime")); - #[cfg(target_arch = "x86")] - let ptr = vdso.sym(cstr!("LINUX_2.6"), cstr!("__vdso_clock_gettime64")); - #[cfg(target_arch = "riscv64")] - let ptr = vdso.sym(cstr!("LINUX_4.15"), cstr!("__vdso_clock_gettime")); - #[cfg(target_arch = "powerpc64")] - let ptr = vdso.sym(cstr!("LINUX_2.6.15"), cstr!("__kernel_clock_gettime")); - #[cfg(any(target_arch = "mips", target_arch = "mips32r6"))] - let ptr = vdso.sym(cstr!("LINUX_2.6"), cstr!("__vdso_clock_gettime64")); - #[cfg(any(target_arch = "mips64", target_arch = "mips64r6"))] - let ptr = vdso.sym(cstr!("LINUX_2.6"), cstr!("__vdso_clock_gettime")); - - // On all 64-bit platforms, the 64-bit `clock_gettime` symbols are - // always available. - #[cfg(target_pointer_width = "64")] - let ok = true; - - // On some 32-bit platforms, the 64-bit `clock_gettime` symbols are - // not available on older kernel versions. - #[cfg(any( - target_arch = "arm", - target_arch = "mips", - target_arch = "mips32r6", - target_arch = "x86" - ))] - let ok = !ptr.is_null(); - - if ok { - assert!(!ptr.is_null()); - - // SAFETY: Store the computed function addresses in static - // storage so that we don't need to compute it again (but if - // we do, it doesn't hurt anything). - unsafe { - CLOCK_GETTIME.store(ptr.cast(), Relaxed); - } - } - } - - #[cfg(feature = "process")] - #[cfg(any( - target_arch = "x86_64", - target_arch = "x86", - target_arch = "riscv64", - target_arch = "powerpc64" - ))] - { - // Look up the platform-specific `getcpu` symbol as documented - // [here]. - // - // [here]: https://man7.org/linux/man-pages/man7/vdso.7.html - #[cfg(target_arch = "x86_64")] - let ptr = vdso.sym(cstr!("LINUX_2.6"), cstr!("__vdso_getcpu")); - #[cfg(target_arch = "x86")] - let ptr = vdso.sym(cstr!("LINUX_2.6"), cstr!("__vdso_getcpu")); - #[cfg(target_arch = "riscv64")] - let ptr = vdso.sym(cstr!("LINUX_4.15"), cstr!("__kernel_getcpu")); - #[cfg(target_arch = "powerpc64")] - let ptr = vdso.sym(cstr!("LINUX_2.6.15"), cstr!("__kernel_getcpu")); - - #[cfg(any( - target_arch = "x86_64", - target_arch = "riscv64", - target_arch = "powerpc64" - ))] - let ok = true; - - // On 32-bit x86, the symbol doesn't appear present sometimes. - #[cfg(target_arch = "x86")] - let ok = !ptr.is_null(); - - #[cfg(any( - target_arch = "aarch64", - target_arch = "arm", - target_arch = "mips", - target_arch = "mips32r6", - target_arch = "mips64", - target_arch = "mips64r6" - ))] - let ok = false; - - if ok { - assert!(!ptr.is_null()); - - // SAFETY: Store the computed function addresses in static - // storage so that we don't need to compute it again (but if - // we do, it doesn't hurt anything). - unsafe { - GETCPU.store(ptr.cast(), Relaxed); - } - } - } - - // On x86, also look up the vsyscall entry point. - #[cfg(target_arch = "x86")] - { - let ptr = vdso.sym(cstr!("LINUX_2.5"), cstr!("__kernel_vsyscall")); - assert!(!ptr.is_null()); - - // SAFETY: As above, store the computed function addresses in - // static storage. - unsafe { - SYSCALL.store(ptr.cast(), Relaxed); - } - } - } -} |