summaryrefslogtreecommitdiffstats
path: root/vendor/rustix-0.37.6/src/backend/linux_raw/io
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/rustix-0.37.6/src/backend/linux_raw/io')
-rw-r--r--vendor/rustix-0.37.6/src/backend/linux_raw/io/epoll.rs346
-rw-r--r--vendor/rustix-0.37.6/src/backend/linux_raw/io/errno.rs524
-rw-r--r--vendor/rustix-0.37.6/src/backend/linux_raw/io/io_slice.rs98
-rw-r--r--vendor/rustix-0.37.6/src/backend/linux_raw/io/mod.rs7
-rw-r--r--vendor/rustix-0.37.6/src/backend/linux_raw/io/poll_fd.rs93
-rw-r--r--vendor/rustix-0.37.6/src/backend/linux_raw/io/syscalls.rs681
-rw-r--r--vendor/rustix-0.37.6/src/backend/linux_raw/io/types.rs129
7 files changed, 0 insertions, 1878 deletions
diff --git a/vendor/rustix-0.37.6/src/backend/linux_raw/io/epoll.rs b/vendor/rustix-0.37.6/src/backend/linux_raw/io/epoll.rs
deleted file mode 100644
index 3fc6462a2..000000000
--- a/vendor/rustix-0.37.6/src/backend/linux_raw/io/epoll.rs
+++ /dev/null
@@ -1,346 +0,0 @@
-//! epoll support.
-//!
-//! This is an experiment, and it isn't yet clear whether epoll is the right
-//! level of abstraction at which to introduce safety. But it works fairly well
-//! in simple examples 🙂.
-//!
-//! # Examples
-//!
-//! ```no_run
-//! # #![cfg_attr(io_lifetimes_use_std, feature(io_safety))]
-//! # #[cfg(feature = "net")]
-//! # fn main() -> std::io::Result<()> {
-//! use io_lifetimes::AsFd;
-//! use rustix::io::{epoll, ioctl_fionbio, read, write};
-//! use rustix::net::{
-//! accept, bind_v4, listen, socket, AddressFamily, Ipv4Addr, Protocol, 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, Protocol::default())?;
-//! 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::epoll_create(epoll::CreateFlags::CLOEXEC)?;
-//!
-//! // Register the socket with the epoll object.
-//! epoll::epoll_add(&epoll, &listen_sock, 1, epoll::EventFlags::IN)?;
-//!
-//! // Keep track of the sockets we've opened.
-//! let mut next_id = 2;
-//! let mut sockets = HashMap::new();
-//!
-//! // Process events.
-//! let mut event_list = epoll::EventVec::with_capacity(4);
-//! loop {
-//! epoll::epoll_wait(&epoll, &mut event_list, -1)?;
-//! for (_event_flags, target) in &event_list {
-//! if target == 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::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 += 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::epoll_del(&epoll, &target)?;
-//! }
-//! }
-//! }
-//! # }
-//! # #[cfg(not(feature = "net"))]
-//! # fn main() {}
-//! ```
-
-#![allow(unsafe_code)]
-
-use super::super::c;
-use crate::backend::io::syscalls;
-use crate::fd::{AsFd, AsRawFd, OwnedFd};
-use crate::io;
-use alloc::vec::Vec;
-use bitflags::bitflags;
-
-bitflags! {
- /// `EPOLL_*` for use with [`Epoll::new`].
- pub struct CreateFlags: c::c_uint {
- /// `EPOLL_CLOEXEC`
- const CLOEXEC = linux_raw_sys::general::EPOLL_CLOEXEC;
- }
-}
-
-bitflags! {
- /// `EPOLL*` for use with [`Epoll::add`].
- #[derive(Default)]
- 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;
- }
-}
-
-/// `epoll_create1(flags)`—Creates a new `Epoll`.
-///
-/// 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 epoll_create(flags: CreateFlags) -> io::Result<OwnedFd> {
- syscalls::epoll_create(flags)
-}
-
-/// `epoll_ctl(self, EPOLL_CTL_ADD, data, event)`—Adds an element to an
-/// `Epoll`.
-///
-/// This registers interest in any of the events set in `events` occurring
-/// on the file descriptor associated with `data`.
-///
-/// Note that if `epoll_del` 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 `epoll_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 epoll_add(
- epoll: impl AsFd,
- source: impl AsFd,
- data: u64,
- 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(),
- &linux_raw_sys::general::epoll_event {
- events: event_flags.bits(),
- data,
- },
- )
- }
-}
-
-/// `epoll_ctl(self, EPOLL_CTL_MOD, target, event)`—Modifies an element in
-/// this `Epoll`.
-///
-/// This sets the events of interest with `target` to `events`.
-#[doc(alias = "epoll_ctl")]
-pub fn epoll_mod(
- epoll: impl AsFd,
- source: impl AsFd,
- data: u64,
- 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,
- &linux_raw_sys::general::epoll_event {
- events: event_flags.bits(),
- data,
- },
- )
- }
-}
-
-/// `epoll_ctl(self, EPOLL_CTL_DEL, target, NULL)`—Removes an element in
-/// this `Epoll`.
-///
-/// This also returns the owning `Data`.
-#[doc(alias = "epoll_ctl")]
-pub fn epoll_del(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.
-pub fn epoll_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> {
- iter: core::slice::Iter<'a, Event>,
-}
-
-impl<'a> Iterator for Iter<'a> {
- type Item = (EventFlags, u64);
-
- fn next(&mut self) -> Option<Self::Item> {
- self.iter
- .next()
- .map(|event| (event.event_flags, event.data))
- }
-}
-
-/// A record of an event that occurred.
-#[repr(C)]
-#[cfg_attr(target_arch = "x86_64", repr(packed))]
-struct Event {
- // Match the layout of `linux_raw_sys::general::epoll_event`. We just use a
- // `u64` instead of the full union.
- event_flags: EventFlags,
- data: u64,
-}
-
-/// A vector of `Event`s, plus context for interpreting them.
-pub struct EventVec {
- events: Vec<Event>,
-}
-
-impl EventVec {
- /// 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(),
- }
- }
-
- /// 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()
- }
-}
-
-impl<'a> IntoIterator for &'a EventVec {
- type IntoIter = Iter<'a>;
- type Item = (EventFlags, u64);
-
- #[inline]
- fn into_iter(self) -> Self::IntoIter {
- self.iter()
- }
-}
diff --git a/vendor/rustix-0.37.6/src/backend/linux_raw/io/errno.rs b/vendor/rustix-0.37.6/src/backend/linux_raw/io/errno.rs
deleted file mode 100644
index b01910138..000000000
--- a/vendor/rustix-0.37.6/src/backend/linux_raw/io/errno.rs
+++ /dev/null
@@ -1,524 +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 super::super::c;
-use crate::backend::fd::RawFd;
-use crate::backend::reg::{RetNumber, RetReg};
-use crate::io;
-use linux_raw_sys::errno;
-
-/// 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.
-#[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`.
- 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(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_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-0.37.6/src/backend/linux_raw/io/io_slice.rs b/vendor/rustix-0.37.6/src/backend/linux_raw/io/io_slice.rs
deleted file mode 100644
index fc8e64698..000000000
--- a/vendor/rustix-0.37.6/src/backend/linux_raw/io/io_slice.rs
+++ /dev/null
@@ -1,98 +0,0 @@
-//! The following is derived from Rust's
-//! library/std/src/sys/unix/io.rs
-//! dca3f1b786efd27be3b325ed1e01e247aa589c3b.
-
-#![allow(unsafe_code)]
-use super::super::c;
-use core::marker::PhantomData;
-use core::slice;
-use linux_raw_sys::general::__kernel_size_t;
-
-/// <https://doc.rust-lang.org/nightly/std/io/struct.IoSlice.html>
-#[derive(Copy, Clone)]
-#[repr(transparent)]
-pub struct IoSlice<'a> {
- vec: c::iovec,
- _p: PhantomData<&'a [u8]>,
-}
-
-impl<'a> IoSlice<'a> {
- /// <https://doc.rust-lang.org/nightly/std/io/struct.IoSlice.html#method.new>
- #[inline]
- pub fn new(buf: &'a [u8]) -> IoSlice<'a> {
- IoSlice {
- vec: c::iovec {
- iov_base: buf.as_ptr() as *mut u8 as *mut c::c_void,
- iov_len: buf.len() as _,
- },
- _p: PhantomData,
- }
- }
-
- /// <https://doc.rust-lang.org/nightly/std/io/struct.IoSlice.html#method.advance>
- #[inline]
- pub fn advance(&mut self, n: usize) {
- if self.vec.iov_len < n as _ {
- panic!("advancing IoSlice beyond its length");
- }
-
- unsafe {
- self.vec.iov_len -= n as __kernel_size_t;
- self.vec.iov_base = self.vec.iov_base.add(n);
- }
- }
-
- /// <https://doc.rust-lang.org/nightly/std/io/struct.IoSlice.html#method.as_slice>
- #[inline]
- pub fn as_slice(&self) -> &[u8] {
- unsafe { slice::from_raw_parts(self.vec.iov_base as *mut u8, self.vec.iov_len as usize) }
- }
-}
-
-/// <https://doc.rust-lang.org/nightly/std/io/struct.IoSliceMut.html>
-#[repr(transparent)]
-pub struct IoSliceMut<'a> {
- vec: c::iovec,
- _p: PhantomData<&'a mut [u8]>,
-}
-
-impl<'a> IoSliceMut<'a> {
- /// <https://doc.rust-lang.org/nightly/std/io/struct.IoSliceMut.html#method.new>
- #[inline]
- pub fn new(buf: &'a mut [u8]) -> IoSliceMut<'a> {
- IoSliceMut {
- vec: c::iovec {
- iov_base: buf.as_mut_ptr() as *mut c::c_void,
- iov_len: buf.len() as _,
- },
- _p: PhantomData,
- }
- }
-
- /// <https://doc.rust-lang.org/nightly/std/io/struct.IoSliceMut.html#method.advance>
- #[inline]
- pub fn advance(&mut self, n: usize) {
- if self.vec.iov_len < n as _ {
- panic!("advancing IoSliceMut beyond its length");
- }
-
- unsafe {
- self.vec.iov_len -= n as __kernel_size_t;
- self.vec.iov_base = self.vec.iov_base.add(n);
- }
- }
-
- /// <https://doc.rust-lang.org/nightly/std/io/struct.IoSliceMut.html#method.as_slice>
- #[inline]
- pub fn as_slice(&self) -> &[u8] {
- unsafe { slice::from_raw_parts(self.vec.iov_base as *mut u8, self.vec.iov_len as usize) }
- }
-
- /// <https://doc.rust-lang.org/nightly/std/io/struct.IoSliceMut.html#method.as_slice_mut>
- #[inline]
- pub fn as_mut_slice(&mut self) -> &mut [u8] {
- unsafe {
- slice::from_raw_parts_mut(self.vec.iov_base as *mut u8, self.vec.iov_len as usize)
- }
- }
-}
diff --git a/vendor/rustix-0.37.6/src/backend/linux_raw/io/mod.rs b/vendor/rustix-0.37.6/src/backend/linux_raw/io/mod.rs
deleted file mode 100644
index f5c2bf3c0..000000000
--- a/vendor/rustix-0.37.6/src/backend/linux_raw/io/mod.rs
+++ /dev/null
@@ -1,7 +0,0 @@
-pub mod epoll;
-pub(crate) mod errno;
-#[cfg(not(feature = "std"))]
-pub(crate) mod io_slice;
-pub(crate) mod poll_fd;
-pub(crate) mod syscalls;
-pub(crate) mod types;
diff --git a/vendor/rustix-0.37.6/src/backend/linux_raw/io/poll_fd.rs b/vendor/rustix-0.37.6/src/backend/linux_raw/io/poll_fd.rs
deleted file mode 100644
index 252358331..000000000
--- a/vendor/rustix-0.37.6/src/backend/linux_raw/io/poll_fd.rs
+++ /dev/null
@@ -1,93 +0,0 @@
-use crate::fd::{AsFd, BorrowedFd};
-use bitflags::bitflags;
-
-bitflags! {
- /// `POLL*` flags for use with [`poll`].
- ///
- /// [`poll`]: crate::io::poll
- 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;
- }
-}
-
-/// `struct pollfd`—File descriptor and flags for use with [`poll`].
-///
-/// [`poll`]: crate::io::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-0.37.6/src/backend/linux_raw/io/syscalls.rs b/vendor/rustix-0.37.6/src/backend/linux_raw/io/syscalls.rs
deleted file mode 100644
index 3acf9ffdb..000000000
--- a/vendor/rustix-0.37.6/src/backend/linux_raw/io/syscalls.rs
+++ /dev/null
@@ -1,681 +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::super::c;
-#[cfg(target_pointer_width = "64")]
-use super::super::conv::loff_t_from_u64;
-use super::super::conv::{
- by_ref, c_int, c_uint, opt_mut, pass_usize, raw_fd, ret, ret_c_uint, ret_discarded_fd,
- ret_owned_fd, ret_usize, slice, slice_mut, zero,
-};
-#[cfg(target_pointer_width = "32")]
-use super::super::conv::{hi, lo};
-use crate::fd::{AsFd, BorrowedFd, OwnedFd, RawFd};
-#[cfg(any(target_os = "android", target_os = "linux"))]
-use crate::io::SpliceFlags;
-use crate::io::{
- self, epoll, DupFlags, EventfdFlags, FdFlags, IoSlice, IoSliceMut, IoSliceRaw, PipeFlags,
- PollFd, ReadWriteFlags,
-};
-#[cfg(all(feature = "fs", feature = "net"))]
-use crate::net::{RecvFlags, SendFlags};
-use core::cmp;
-use core::mem::MaybeUninit;
-#[cfg(target_os = "espidf")]
-use linux_raw_sys::general::F_DUPFD;
-use linux_raw_sys::general::{
- epoll_event, EPOLL_CTL_ADD, EPOLL_CTL_DEL, EPOLL_CTL_MOD, F_DUPFD_CLOEXEC, F_GETFD, F_SETFD,
- UIO_MAXIOV,
-};
-use linux_raw_sys::ioctl::{BLKPBSZGET, BLKSSZGET, FICLONE, FIONBIO, FIONREAD, TIOCEXCL, TIOCNXCL};
-#[cfg(any(target_arch = "aarch64", target_arch = "riscv64"))]
-use {
- super::super::conv::{opt_ref, size_of},
- linux_raw_sys::general::{__kernel_timespec, sigset_t},
-};
-
-#[inline]
-pub(crate) fn read(fd: BorrowedFd<'_>, buf: &mut [u8]) -> io::Result<usize> {
- let (buf_addr_mut, buf_len) = slice_mut(buf);
-
- unsafe { ret_usize(syscall!(__NR_read, fd, buf_addr_mut, buf_len)) }
-}
-
-#[inline]
-pub(crate) fn pread(fd: BorrowedFd<'_>, buf: &mut [u8], pos: u64) -> io::Result<usize> {
- let (buf_addr_mut, buf_len) = slice_mut(buf);
-
- // <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 = "power"),
- ))]
- unsafe {
- ret_usize(syscall!(
- __NR_pread64,
- fd,
- buf_addr_mut,
- buf_len,
- zero(),
- hi(pos),
- lo(pos)
- ))
- }
- #[cfg(all(
- target_pointer_width = "32",
- not(any(target_arch = "arm", target_arch = "mips", target_arch = "power")),
- ))]
- unsafe {
- ret_usize(syscall!(
- __NR_pread64,
- fd,
- buf_addr_mut,
- buf_len,
- hi(pos),
- lo(pos)
- ))
- }
- #[cfg(target_pointer_width = "64")]
- unsafe {
- ret_usize(syscall!(
- __NR_pread64,
- fd,
- buf_addr_mut,
- buf_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())]);
-
- #[cfg(target_pointer_width = "32")]
- unsafe {
- ret_usize(syscall!(
- __NR_preadv,
- fd,
- bufs_addr,
- bufs_len,
- hi(pos),
- lo(pos)
- ))
- }
- #[cfg(target_pointer_width = "64")]
- unsafe {
- ret_usize(syscall!(
- __NR_preadv,
- fd,
- bufs_addr,
- bufs_len,
- loff_t_from_u64(pos)
- ))
- }
-}
-
-#[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())]);
-
- #[cfg(target_pointer_width = "32")]
- unsafe {
- ret_usize(syscall!(
- __NR_preadv2,
- fd,
- bufs_addr,
- bufs_len,
- hi(pos),
- lo(pos),
- flags
- ))
- }
- #[cfg(target_pointer_width = "64")]
- unsafe {
- ret_usize(syscall!(
- __NR_preadv2,
- fd,
- bufs_addr,
- bufs_len,
- loff_t_from_u64(pos),
- 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 = "power"),
- ))]
- 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 = "power")),
- ))]
- 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())]);
-
- #[cfg(target_pointer_width = "32")]
- unsafe {
- ret_usize(syscall_readonly!(
- __NR_pwritev,
- fd,
- bufs_addr,
- bufs_len,
- hi(pos),
- lo(pos)
- ))
- }
- #[cfg(target_pointer_width = "64")]
- unsafe {
- ret_usize(syscall_readonly!(
- __NR_pwritev,
- fd,
- bufs_addr,
- bufs_len,
- loff_t_from_u64(pos)
- ))
- }
-}
-
-#[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())]);
-
- #[cfg(target_pointer_width = "32")]
- unsafe {
- ret_usize(syscall_readonly!(
- __NR_pwritev2,
- fd,
- bufs_addr,
- bufs_len,
- hi(pos),
- lo(pos),
- flags
- ))
- }
- #[cfg(target_pointer_width = "64")]
- unsafe {
- ret_usize(syscall_readonly!(
- __NR_pwritev2,
- fd,
- bufs_addr,
- bufs_len,
- loff_t_from_u64(pos),
- flags
- ))
- }
-}
-
-/// The maximum number of buffers that can be passed into a vectored I/O system
-/// call on the current platform.
-const fn max_iov() -> usize {
- UIO_MAXIOV as usize
-}
-
-#[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) 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 ioctl_fionread(fd: BorrowedFd<'_>) -> io::Result<u64> {
- unsafe {
- let mut result = MaybeUninit::<c::c_int>::uninit();
- ret(syscall!(__NR_ioctl, fd, c_uint(FIONREAD), &mut result))?;
- Ok(result.assume_init() as u64)
- }
-}
-
-#[inline]
-pub(crate) fn ioctl_fionbio(fd: BorrowedFd<'_>, value: bool) -> io::Result<()> {
- unsafe {
- let data = c::c_int::from(value);
- ret(syscall_readonly!(
- __NR_ioctl,
- fd,
- c_uint(FIONBIO),
- by_ref(&data)
- ))
- }
-}
-
-#[inline]
-pub(crate) fn ioctl_tiocexcl(fd: BorrowedFd<'_>) -> io::Result<()> {
- unsafe { ret(syscall_readonly!(__NR_ioctl, fd, c_uint(TIOCEXCL))) }
-}
-
-#[inline]
-pub(crate) fn ioctl_tiocnxcl(fd: BorrowedFd<'_>) -> io::Result<()> {
- unsafe { ret(syscall_readonly!(__NR_ioctl, fd, c_uint(TIOCNXCL))) }
-}
-
-#[inline]
-pub(crate) fn ioctl_blksszget(fd: BorrowedFd) -> io::Result<u32> {
- let mut result = MaybeUninit::<c::c_uint>::uninit();
- unsafe {
- ret(syscall!(__NR_ioctl, fd, c_uint(BLKSSZGET), &mut result))?;
- Ok(result.assume_init() as u32)
- }
-}
-
-#[inline]
-pub(crate) fn ioctl_blkpbszget(fd: BorrowedFd) -> io::Result<u32> {
- let mut result = MaybeUninit::<c::c_uint>::uninit();
- unsafe {
- ret(syscall!(__NR_ioctl, fd, c_uint(BLKPBSZGET), &mut result))?;
- Ok(result.assume_init() as u32)
- }
-}
-
-#[inline]
-pub(crate) fn ioctl_ficlone(fd: BorrowedFd<'_>, src_fd: BorrowedFd<'_>) -> io::Result<()> {
- unsafe { ret(syscall_readonly!(__NR_ioctl, fd, c_uint(FICLONE), src_fd)) }
-}
-
-#[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.
- //
- // TODO: This code would benefit from having a better way to read into
- // uninitialized memory.
- let mut buf = [0];
- match super::super::net::syscalls::recv(fd, &mut buf, 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 super::super::net::syscalls::send(fd, &[], SendFlags::DONTWAIT) {
- // TODO or-patterns when we don't need 1.51
- Err(io::Errno::AGAIN) => (),
- Err(io::Errno::WOULDBLOCK) => (),
- Err(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)) }
-}
-
-#[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()))
- }
-}
-
-#[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_truncate)
- }
- #[cfg(target_pointer_width = "64")]
- unsafe {
- ret_c_uint(syscall_readonly!(__NR_fcntl, fd, c_uint(F_GETFD)))
- .map(FdFlags::from_bits_truncate)
- }
-}
-
-#[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))
- }
-}
-
-#[cfg(target_os = "espidf")]
-#[inline]
-pub(crate) fn fcntl_dupfd(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),
- raw_fd(min)
- ))
- }
- #[cfg(target_pointer_width = "64")]
- unsafe {
- ret_owned_fd(syscall_readonly!(
- __NR_fcntl,
- fd,
- c_uint(F_DUPFD),
- raw_fd(min)
- ))
- }
-}
-
-#[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)
- ))
- }
-}
-
-#[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(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 = "mips64",
- target_arch = "riscv64",
- ))]
- {
- pipe_with(PipeFlags::empty())
- }
- #[cfg(not(any(
- target_arch = "aarch64",
- target_arch = "mips",
- target_arch = "mips64",
- 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 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::<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()
- ))
-}
-
-#[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()
- ))
- }
-}
-
-#[cfg(any(target_os = "android", target_os = "linux"))]
-#[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),
- c_uint(flags.bits())
- ))
- }
-}
-
-#[cfg(any(target_os = "android", target_os = "linux"))]
-#[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,
- c_uint(flags.bits())
- ))
-}
diff --git a/vendor/rustix-0.37.6/src/backend/linux_raw/io/types.rs b/vendor/rustix-0.37.6/src/backend/linux_raw/io/types.rs
deleted file mode 100644
index cb6c6acef..000000000
--- a/vendor/rustix-0.37.6/src/backend/linux_raw/io/types.rs
+++ /dev/null
@@ -1,129 +0,0 @@
-use super::super::c;
-use bitflags::bitflags;
-use core::marker::PhantomData;
-
-bitflags! {
- /// `FD_*` constants for use with [`fcntl_getfd`] and [`fcntl_setfd`].
- ///
- /// [`fcntl_getfd`]: crate::io::fcntl_getfd
- /// [`fcntl_setfd`]: crate::io::fcntl_setfd
- pub struct FdFlags: c::c_uint {
- /// `FD_CLOEXEC`
- const CLOEXEC = linux_raw_sys::general::FD_CLOEXEC;
- }
-}
-
-bitflags! {
- /// `RWF_*` constants for use with [`preadv2`] and [`pwritev2`].
- ///
- /// [`preadv2`]: crate::io::preadv2
- /// [`pwritev2`]: crate::io::pwritev
- 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;
- }
-}
-
-#[cfg(any(target_os = "android", target_os = "linux"))]
-bitflags! {
- /// `SPLICE_F_*` constants for use with [`splice`] and [`vmsplice`].
- 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;
- }
-}
-
-bitflags! {
- /// `O_*` constants for use with [`dup2`].
- ///
- /// [`dup2`]: crate::io::dup2
- pub struct DupFlags: c::c_uint {
- /// `O_CLOEXEC`
- const CLOEXEC = linux_raw_sys::general::O_CLOEXEC;
- }
-}
-
-bitflags! {
- /// `O_*` constants for use with [`pipe_with`].
- ///
- /// [`pipe_with`]: crate::io::pipe_with
- 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;
- }
-}
-
-bitflags! {
- /// `EFD_*` flags for use with [`eventfd`].
- ///
- /// [`eventfd`]: crate::io::eventfd
- 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;
- }
-}
-
-/// `PIPE_BUF`—The maximum size of a write to a pipe guaranteed to be atomic.
-pub const PIPE_BUF: usize = linux_raw_sys::general::PIPE_BUF as usize;
-
-pub(crate) const AT_FDCWD: c::c_int = linux_raw_sys::general::AT_FDCWD;
-pub(crate) const STDIN_FILENO: c::c_uint = linux_raw_sys::general::STDIN_FILENO;
-pub(crate) const STDOUT_FILENO: c::c_uint = linux_raw_sys::general::STDOUT_FILENO;
-pub(crate) const STDERR_FILENO: c::c_uint = linux_raw_sys::general::STDERR_FILENO;
-
-/// A buffer type used 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.
-#[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 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,
- }
- }
-}