Vendor things
This commit is contained in:
parent
5deceec006
commit
977e3c17e5
19434 changed files with 10682014 additions and 0 deletions
107
third-party/vendor/rustix/src/maybe_polyfill/no_std/io/mod.rs
vendored
Normal file
107
third-party/vendor/rustix/src/maybe_polyfill/no_std/io/mod.rs
vendored
Normal file
|
|
@ -0,0 +1,107 @@
|
|||
//! The following is derived from Rust's
|
||||
//! library/std/src/sys/unix/io.rs
|
||||
//! dca3f1b786efd27be3b325ed1e01e247aa589c3b.
|
||||
//!
|
||||
//! All code in this file is licensed MIT or Apache 2.0 at your option.
|
||||
|
||||
#![allow(unsafe_code)]
|
||||
use crate::backend::c;
|
||||
#[cfg(not(linux_raw))]
|
||||
use c::size_t as __kernel_size_t;
|
||||
use core::marker::PhantomData;
|
||||
use core::slice;
|
||||
#[cfg(linux_raw)]
|
||||
use linux_raw_sys::general::__kernel_size_t;
|
||||
|
||||
/// <https://doc.rust-lang.org/stable/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/stable/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/stable/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 {
|
||||
// `__kernel_size_t` will always have the same size as `usize`, but it is a `u32` on
|
||||
// 32-bit platforms and `u64` on 64-bit platforms when using `linux_raw` backend
|
||||
self.vec.iov_len -= n as __kernel_size_t;
|
||||
self.vec.iov_base = self.vec.iov_base.add(n);
|
||||
}
|
||||
}
|
||||
|
||||
/// <https://doc.rust-lang.org/stable/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/stable/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/stable/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/stable/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 {
|
||||
// `__kernel_size_t` will always have the same size as `usize`, but it is a `u32` on
|
||||
// 32-bit platforms and `u64` on 64-bit platforms when using `linux_raw` backend
|
||||
self.vec.iov_len -= n as __kernel_size_t;
|
||||
self.vec.iov_base = self.vec.iov_base.add(n);
|
||||
}
|
||||
}
|
||||
|
||||
/// <https://doc.rust-lang.org/stable/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/stable/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)
|
||||
}
|
||||
}
|
||||
}
|
||||
16
third-party/vendor/rustix/src/maybe_polyfill/no_std/mod.rs
vendored
Normal file
16
third-party/vendor/rustix/src/maybe_polyfill/no_std/mod.rs
vendored
Normal file
|
|
@ -0,0 +1,16 @@
|
|||
//! Polyfill of parts of the standard library for `no_std` builds.
|
||||
//!
|
||||
//! All code in this subtree is derived from the standard library and licensed
|
||||
//! MIT or Apache 2.0 at your option.
|
||||
//!
|
||||
//! This implementation is used when `std` is not available and polyfills the
|
||||
//! necessary items from `std`. When the `std` feature is specified (so the
|
||||
//! standard library is available), the file `src/polyfill/std` is used
|
||||
//! instead, which just imports the respective items from `std`.
|
||||
|
||||
#[cfg(not(windows))]
|
||||
pub mod io;
|
||||
#[cfg(not(any(target_os = "redox", target_os = "wasi")))]
|
||||
#[cfg(feature = "net")]
|
||||
pub mod net;
|
||||
pub mod os;
|
||||
2068
third-party/vendor/rustix/src/maybe_polyfill/no_std/net/ip_addr.rs
vendored
Normal file
2068
third-party/vendor/rustix/src/maybe_polyfill/no_std/net/ip_addr.rs
vendored
Normal file
File diff suppressed because it is too large
Load diff
6
third-party/vendor/rustix/src/maybe_polyfill/no_std/net/mod.rs
vendored
Normal file
6
third-party/vendor/rustix/src/maybe_polyfill/no_std/net/mod.rs
vendored
Normal file
|
|
@ -0,0 +1,6 @@
|
|||
mod ip_addr;
|
||||
mod socket_addr;
|
||||
|
||||
#[allow(unused_imports)]
|
||||
pub use self::ip_addr::{IpAddr, Ipv4Addr, Ipv6Addr, Ipv6MulticastScope};
|
||||
pub use self::socket_addr::{SocketAddr, SocketAddrV4, SocketAddrV6};
|
||||
641
third-party/vendor/rustix/src/maybe_polyfill/no_std/net/socket_addr.rs
vendored
Normal file
641
third-party/vendor/rustix/src/maybe_polyfill/no_std/net/socket_addr.rs
vendored
Normal file
|
|
@ -0,0 +1,641 @@
|
|||
//! The following is derived from Rust's
|
||||
//! library/std/src/net/socket_addr.rs at revision
|
||||
//! bd20fc1fd657b32f7aa1d70d8723f04c87f21606.
|
||||
//!
|
||||
//! All code in this file is licensed MIT or Apache 2.0 at your option.
|
||||
//!
|
||||
//! This defines `SocketAddr`, `SocketAddrV4`, and `SocketAddrV6` in a
|
||||
//! platform-independent way. It is not the native representation.
|
||||
|
||||
use super::ip_addr::{IpAddr, Ipv4Addr, Ipv6Addr};
|
||||
use core::cmp::Ordering;
|
||||
use core::hash;
|
||||
|
||||
/// An internet socket address, either IPv4 or IPv6.
|
||||
///
|
||||
/// Internet socket addresses consist of an [IP address], a 16-bit port number, as well
|
||||
/// as possibly some version-dependent additional information. See [`SocketAddrV4`]'s and
|
||||
/// [`SocketAddrV6`]'s respective documentation for more details.
|
||||
///
|
||||
/// The size of a `SocketAddr` instance may vary depending on the target operating
|
||||
/// system.
|
||||
///
|
||||
/// [IP address]: IpAddr
|
||||
///
|
||||
/// # Examples
|
||||
///
|
||||
/// ```
|
||||
/// use std::net::{IpAddr, Ipv4Addr, SocketAddr};
|
||||
///
|
||||
/// let socket = SocketAddr::new(IpAddr::V4(Ipv4Addr::new(127, 0, 0, 1)), 8080);
|
||||
///
|
||||
/// assert_eq!("127.0.0.1:8080".parse(), Ok(socket));
|
||||
/// assert_eq!(socket.port(), 8080);
|
||||
/// assert_eq!(socket.is_ipv4(), true);
|
||||
/// ```
|
||||
#[derive(Copy, Clone, PartialEq, Eq, Hash, PartialOrd, Ord)]
|
||||
#[cfg_attr(staged_api, stable(feature = "rust1", since = "1.0.0"))]
|
||||
pub enum SocketAddr {
|
||||
/// An IPv4 socket address.
|
||||
#[cfg_attr(staged_api, stable(feature = "rust1", since = "1.0.0"))]
|
||||
V4(#[cfg_attr(staged_api, stable(feature = "rust1", since = "1.0.0"))] SocketAddrV4),
|
||||
/// An IPv6 socket address.
|
||||
#[cfg_attr(staged_api, stable(feature = "rust1", since = "1.0.0"))]
|
||||
V6(#[cfg_attr(staged_api, stable(feature = "rust1", since = "1.0.0"))] SocketAddrV6),
|
||||
}
|
||||
|
||||
/// An IPv4 socket address.
|
||||
///
|
||||
/// IPv4 socket addresses consist of an [`IPv4` address] and a 16-bit port number, as
|
||||
/// stated in [IETF RFC 793].
|
||||
///
|
||||
/// See [`SocketAddr`] for a type encompassing both IPv4 and IPv6 socket addresses.
|
||||
///
|
||||
/// The size of a `SocketAddrV4` struct may vary depending on the target operating
|
||||
/// system. Do not assume that this type has the same memory layout as the underlying
|
||||
/// system representation.
|
||||
///
|
||||
/// [IETF RFC 793]: https://tools.ietf.org/html/rfc793
|
||||
/// [`IPv4` address]: Ipv4Addr
|
||||
///
|
||||
/// # Examples
|
||||
///
|
||||
/// ```
|
||||
/// use std::net::{Ipv4Addr, SocketAddrV4};
|
||||
///
|
||||
/// let socket = SocketAddrV4::new(Ipv4Addr::new(127, 0, 0, 1), 8080);
|
||||
///
|
||||
/// assert_eq!("127.0.0.1:8080".parse(), Ok(socket));
|
||||
/// assert_eq!(socket.ip(), &Ipv4Addr::new(127, 0, 0, 1));
|
||||
/// assert_eq!(socket.port(), 8080);
|
||||
/// ```
|
||||
#[derive(Copy, Clone, Eq, PartialEq)]
|
||||
#[cfg_attr(staged_api, stable(feature = "rust1", since = "1.0.0"))]
|
||||
pub struct SocketAddrV4 {
|
||||
ip: Ipv4Addr,
|
||||
port: u16,
|
||||
}
|
||||
|
||||
/// An IPv6 socket address.
|
||||
///
|
||||
/// IPv6 socket addresses consist of an [`IPv6` address], a 16-bit port number, as well
|
||||
/// as fields containing the traffic class, the flow label, and a scope identifier
|
||||
/// (see [IETF RFC 2553, Section 3.3] for more details).
|
||||
///
|
||||
/// See [`SocketAddr`] for a type encompassing both IPv4 and IPv6 socket addresses.
|
||||
///
|
||||
/// The size of a `SocketAddrV6` struct may vary depending on the target operating
|
||||
/// system. Do not assume that this type has the same memory layout as the underlying
|
||||
/// system representation.
|
||||
///
|
||||
/// [IETF RFC 2553, Section 3.3]: https://tools.ietf.org/html/rfc2553#section-3.3
|
||||
/// [`IPv6` address]: Ipv6Addr
|
||||
///
|
||||
/// # Examples
|
||||
///
|
||||
/// ```
|
||||
/// use std::net::{Ipv6Addr, SocketAddrV6};
|
||||
///
|
||||
/// let socket = SocketAddrV6::new(Ipv6Addr::new(0x2001, 0xdb8, 0, 0, 0, 0, 0, 1), 8080, 0, 0);
|
||||
///
|
||||
/// assert_eq!("[2001:db8::1]:8080".parse(), Ok(socket));
|
||||
/// assert_eq!(socket.ip(), &Ipv6Addr::new(0x2001, 0xdb8, 0, 0, 0, 0, 0, 1));
|
||||
/// assert_eq!(socket.port(), 8080);
|
||||
/// ```
|
||||
#[derive(Copy, Clone, Eq, PartialEq)]
|
||||
#[cfg_attr(staged_api, stable(feature = "rust1", since = "1.0.0"))]
|
||||
pub struct SocketAddrV6 {
|
||||
ip: Ipv6Addr,
|
||||
port: u16,
|
||||
flowinfo: u32,
|
||||
scope_id: u32,
|
||||
}
|
||||
|
||||
impl SocketAddr {
|
||||
/// Creates a new socket address from an [IP address] and a port number.
|
||||
///
|
||||
/// [IP address]: IpAddr
|
||||
///
|
||||
/// # Examples
|
||||
///
|
||||
/// ```
|
||||
/// use std::net::{IpAddr, Ipv4Addr, SocketAddr};
|
||||
///
|
||||
/// let socket = SocketAddr::new(IpAddr::V4(Ipv4Addr::new(127, 0, 0, 1)), 8080);
|
||||
/// assert_eq!(socket.ip(), IpAddr::V4(Ipv4Addr::new(127, 0, 0, 1)));
|
||||
/// assert_eq!(socket.port(), 8080);
|
||||
/// ```
|
||||
#[cfg_attr(staged_api, stable(feature = "ip_addr", since = "1.7.0"))]
|
||||
#[must_use]
|
||||
#[cfg_attr(
|
||||
staged_api,
|
||||
rustc_const_unstable(feature = "const_socketaddr", issue = "82485")
|
||||
)]
|
||||
pub const fn new(ip: IpAddr, port: u16) -> SocketAddr {
|
||||
match ip {
|
||||
IpAddr::V4(a) => SocketAddr::V4(SocketAddrV4::new(a, port)),
|
||||
IpAddr::V6(a) => SocketAddr::V6(SocketAddrV6::new(a, port, 0, 0)),
|
||||
}
|
||||
}
|
||||
|
||||
/// Returns the IP address associated with this socket address.
|
||||
///
|
||||
/// # Examples
|
||||
///
|
||||
/// ```
|
||||
/// use std::net::{IpAddr, Ipv4Addr, SocketAddr};
|
||||
///
|
||||
/// let socket = SocketAddr::new(IpAddr::V4(Ipv4Addr::new(127, 0, 0, 1)), 8080);
|
||||
/// assert_eq!(socket.ip(), IpAddr::V4(Ipv4Addr::new(127, 0, 0, 1)));
|
||||
/// ```
|
||||
#[must_use]
|
||||
#[cfg_attr(staged_api, stable(feature = "ip_addr", since = "1.7.0"))]
|
||||
#[cfg_attr(
|
||||
staged_api,
|
||||
rustc_const_unstable(feature = "const_socketaddr", issue = "82485")
|
||||
)]
|
||||
pub const fn ip(&self) -> IpAddr {
|
||||
match *self {
|
||||
SocketAddr::V4(ref a) => IpAddr::V4(*a.ip()),
|
||||
SocketAddr::V6(ref a) => IpAddr::V6(*a.ip()),
|
||||
}
|
||||
}
|
||||
|
||||
/// Changes the IP address associated with this socket address.
|
||||
///
|
||||
/// # Examples
|
||||
///
|
||||
/// ```
|
||||
/// use std::net::{IpAddr, Ipv4Addr, SocketAddr};
|
||||
///
|
||||
/// let mut socket = SocketAddr::new(IpAddr::V4(Ipv4Addr::new(127, 0, 0, 1)), 8080);
|
||||
/// socket.set_ip(IpAddr::V4(Ipv4Addr::new(10, 10, 0, 1)));
|
||||
/// assert_eq!(socket.ip(), IpAddr::V4(Ipv4Addr::new(10, 10, 0, 1)));
|
||||
/// ```
|
||||
#[cfg_attr(staged_api, stable(feature = "sockaddr_setters", since = "1.9.0"))]
|
||||
pub fn set_ip(&mut self, new_ip: IpAddr) {
|
||||
// `match (*self, new_ip)` would have us mutate a copy of self only to throw it away.
|
||||
match (self, new_ip) {
|
||||
(&mut SocketAddr::V4(ref mut a), IpAddr::V4(new_ip)) => a.set_ip(new_ip),
|
||||
(&mut SocketAddr::V6(ref mut a), IpAddr::V6(new_ip)) => a.set_ip(new_ip),
|
||||
(self_, new_ip) => *self_ = Self::new(new_ip, self_.port()),
|
||||
}
|
||||
}
|
||||
|
||||
/// Returns the port number associated with this socket address.
|
||||
///
|
||||
/// # Examples
|
||||
///
|
||||
/// ```
|
||||
/// use std::net::{IpAddr, Ipv4Addr, SocketAddr};
|
||||
///
|
||||
/// let socket = SocketAddr::new(IpAddr::V4(Ipv4Addr::new(127, 0, 0, 1)), 8080);
|
||||
/// assert_eq!(socket.port(), 8080);
|
||||
/// ```
|
||||
#[must_use]
|
||||
#[cfg_attr(staged_api, stable(feature = "rust1", since = "1.0.0"))]
|
||||
#[cfg_attr(
|
||||
staged_api,
|
||||
rustc_const_unstable(feature = "const_socketaddr", issue = "82485")
|
||||
)]
|
||||
pub const fn port(&self) -> u16 {
|
||||
match *self {
|
||||
SocketAddr::V4(ref a) => a.port(),
|
||||
SocketAddr::V6(ref a) => a.port(),
|
||||
}
|
||||
}
|
||||
|
||||
/// Changes the port number associated with this socket address.
|
||||
///
|
||||
/// # Examples
|
||||
///
|
||||
/// ```
|
||||
/// use std::net::{IpAddr, Ipv4Addr, SocketAddr};
|
||||
///
|
||||
/// let mut socket = SocketAddr::new(IpAddr::V4(Ipv4Addr::new(127, 0, 0, 1)), 8080);
|
||||
/// socket.set_port(1025);
|
||||
/// assert_eq!(socket.port(), 1025);
|
||||
/// ```
|
||||
#[cfg_attr(staged_api, stable(feature = "sockaddr_setters", since = "1.9.0"))]
|
||||
pub fn set_port(&mut self, new_port: u16) {
|
||||
match *self {
|
||||
SocketAddr::V4(ref mut a) => a.set_port(new_port),
|
||||
SocketAddr::V6(ref mut a) => a.set_port(new_port),
|
||||
}
|
||||
}
|
||||
|
||||
/// Returns [`true`] if the [IP address] in this `SocketAddr` is an
|
||||
/// [`IPv4` address], and [`false`] otherwise.
|
||||
///
|
||||
/// [IP address]: IpAddr
|
||||
/// [`IPv4` address]: IpAddr::V4
|
||||
///
|
||||
/// # Examples
|
||||
///
|
||||
/// ```
|
||||
/// use std::net::{IpAddr, Ipv4Addr, SocketAddr};
|
||||
///
|
||||
/// let socket = SocketAddr::new(IpAddr::V4(Ipv4Addr::new(127, 0, 0, 1)), 8080);
|
||||
/// assert_eq!(socket.is_ipv4(), true);
|
||||
/// assert_eq!(socket.is_ipv6(), false);
|
||||
/// ```
|
||||
#[must_use]
|
||||
#[cfg_attr(staged_api, stable(feature = "sockaddr_checker", since = "1.16.0"))]
|
||||
#[cfg_attr(
|
||||
staged_api,
|
||||
rustc_const_unstable(feature = "const_socketaddr", issue = "82485")
|
||||
)]
|
||||
pub const fn is_ipv4(&self) -> bool {
|
||||
matches!(*self, SocketAddr::V4(_))
|
||||
}
|
||||
|
||||
/// Returns [`true`] if the [IP address] in this `SocketAddr` is an
|
||||
/// [`IPv6` address], and [`false`] otherwise.
|
||||
///
|
||||
/// [IP address]: IpAddr
|
||||
/// [`IPv6` address]: IpAddr::V6
|
||||
///
|
||||
/// # Examples
|
||||
///
|
||||
/// ```
|
||||
/// use std::net::{IpAddr, Ipv6Addr, SocketAddr};
|
||||
///
|
||||
/// let socket = SocketAddr::new(IpAddr::V6(Ipv6Addr::new(0, 0, 0, 0, 0, 65535, 0, 1)), 8080);
|
||||
/// assert_eq!(socket.is_ipv4(), false);
|
||||
/// assert_eq!(socket.is_ipv6(), true);
|
||||
/// ```
|
||||
#[must_use]
|
||||
#[cfg_attr(staged_api, stable(feature = "sockaddr_checker", since = "1.16.0"))]
|
||||
#[cfg_attr(
|
||||
staged_api,
|
||||
rustc_const_unstable(feature = "const_socketaddr", issue = "82485")
|
||||
)]
|
||||
pub const fn is_ipv6(&self) -> bool {
|
||||
matches!(*self, SocketAddr::V6(_))
|
||||
}
|
||||
}
|
||||
|
||||
impl SocketAddrV4 {
|
||||
/// Creates a new socket address from an [`IPv4` address] and a port number.
|
||||
///
|
||||
/// [`IPv4` address]: Ipv4Addr
|
||||
///
|
||||
/// # Examples
|
||||
///
|
||||
/// ```
|
||||
/// use std::net::{SocketAddrV4, Ipv4Addr};
|
||||
///
|
||||
/// let socket = SocketAddrV4::new(Ipv4Addr::new(127, 0, 0, 1), 8080);
|
||||
/// ```
|
||||
#[cfg_attr(staged_api, stable(feature = "rust1", since = "1.0.0"))]
|
||||
#[must_use]
|
||||
#[cfg_attr(
|
||||
staged_api,
|
||||
rustc_const_unstable(feature = "const_socketaddr", issue = "82485")
|
||||
)]
|
||||
pub const fn new(ip: Ipv4Addr, port: u16) -> SocketAddrV4 {
|
||||
SocketAddrV4 { ip, port }
|
||||
}
|
||||
|
||||
/// Returns the IP address associated with this socket address.
|
||||
///
|
||||
/// # Examples
|
||||
///
|
||||
/// ```
|
||||
/// use std::net::{SocketAddrV4, Ipv4Addr};
|
||||
///
|
||||
/// let socket = SocketAddrV4::new(Ipv4Addr::new(127, 0, 0, 1), 8080);
|
||||
/// assert_eq!(socket.ip(), &Ipv4Addr::new(127, 0, 0, 1));
|
||||
/// ```
|
||||
#[must_use]
|
||||
#[cfg_attr(staged_api, stable(feature = "rust1", since = "1.0.0"))]
|
||||
#[cfg_attr(
|
||||
staged_api,
|
||||
rustc_const_unstable(feature = "const_socketaddr", issue = "82485")
|
||||
)]
|
||||
pub const fn ip(&self) -> &Ipv4Addr {
|
||||
&self.ip
|
||||
}
|
||||
|
||||
/// Changes the IP address associated with this socket address.
|
||||
///
|
||||
/// # Examples
|
||||
///
|
||||
/// ```
|
||||
/// use std::net::{SocketAddrV4, Ipv4Addr};
|
||||
///
|
||||
/// let mut socket = SocketAddrV4::new(Ipv4Addr::new(127, 0, 0, 1), 8080);
|
||||
/// socket.set_ip(Ipv4Addr::new(192, 168, 0, 1));
|
||||
/// assert_eq!(socket.ip(), &Ipv4Addr::new(192, 168, 0, 1));
|
||||
/// ```
|
||||
#[cfg_attr(staged_api, stable(feature = "sockaddr_setters", since = "1.9.0"))]
|
||||
pub fn set_ip(&mut self, new_ip: Ipv4Addr) {
|
||||
self.ip = new_ip;
|
||||
}
|
||||
|
||||
/// Returns the port number associated with this socket address.
|
||||
///
|
||||
/// # Examples
|
||||
///
|
||||
/// ```
|
||||
/// use std::net::{SocketAddrV4, Ipv4Addr};
|
||||
///
|
||||
/// let socket = SocketAddrV4::new(Ipv4Addr::new(127, 0, 0, 1), 8080);
|
||||
/// assert_eq!(socket.port(), 8080);
|
||||
/// ```
|
||||
#[must_use]
|
||||
#[cfg_attr(staged_api, stable(feature = "rust1", since = "1.0.0"))]
|
||||
#[cfg_attr(
|
||||
staged_api,
|
||||
rustc_const_unstable(feature = "const_socketaddr", issue = "82485")
|
||||
)]
|
||||
pub const fn port(&self) -> u16 {
|
||||
self.port
|
||||
}
|
||||
|
||||
/// Changes the port number associated with this socket address.
|
||||
///
|
||||
/// # Examples
|
||||
///
|
||||
/// ```
|
||||
/// use std::net::{SocketAddrV4, Ipv4Addr};
|
||||
///
|
||||
/// let mut socket = SocketAddrV4::new(Ipv4Addr::new(127, 0, 0, 1), 8080);
|
||||
/// socket.set_port(4242);
|
||||
/// assert_eq!(socket.port(), 4242);
|
||||
/// ```
|
||||
#[cfg_attr(staged_api, stable(feature = "sockaddr_setters", since = "1.9.0"))]
|
||||
pub fn set_port(&mut self, new_port: u16) {
|
||||
self.port = new_port;
|
||||
}
|
||||
}
|
||||
|
||||
impl SocketAddrV6 {
|
||||
/// Creates a new socket address from an [`IPv6` address], a 16-bit port number,
|
||||
/// and the `flowinfo` and `scope_id` fields.
|
||||
///
|
||||
/// For more information on the meaning and layout of the `flowinfo` and `scope_id`
|
||||
/// parameters, see [IETF RFC 2553, Section 3.3].
|
||||
///
|
||||
/// [IETF RFC 2553, Section 3.3]: https://tools.ietf.org/html/rfc2553#section-3.3
|
||||
/// [`IPv6` address]: Ipv6Addr
|
||||
///
|
||||
/// # Examples
|
||||
///
|
||||
/// ```
|
||||
/// use std::net::{SocketAddrV6, Ipv6Addr};
|
||||
///
|
||||
/// let socket = SocketAddrV6::new(Ipv6Addr::new(0, 0, 0, 0, 0, 0, 0, 1), 8080, 0, 0);
|
||||
/// ```
|
||||
#[cfg_attr(staged_api, stable(feature = "rust1", since = "1.0.0"))]
|
||||
#[must_use]
|
||||
#[cfg_attr(
|
||||
staged_api,
|
||||
rustc_const_unstable(feature = "const_socketaddr", issue = "82485")
|
||||
)]
|
||||
pub const fn new(ip: Ipv6Addr, port: u16, flowinfo: u32, scope_id: u32) -> SocketAddrV6 {
|
||||
SocketAddrV6 {
|
||||
ip,
|
||||
port,
|
||||
flowinfo,
|
||||
scope_id,
|
||||
}
|
||||
}
|
||||
|
||||
/// Returns the IP address associated with this socket address.
|
||||
///
|
||||
/// # Examples
|
||||
///
|
||||
/// ```
|
||||
/// use std::net::{SocketAddrV6, Ipv6Addr};
|
||||
///
|
||||
/// let socket = SocketAddrV6::new(Ipv6Addr::new(0, 0, 0, 0, 0, 0, 0, 1), 8080, 0, 0);
|
||||
/// assert_eq!(socket.ip(), &Ipv6Addr::new(0, 0, 0, 0, 0, 0, 0, 1));
|
||||
/// ```
|
||||
#[must_use]
|
||||
#[cfg_attr(staged_api, stable(feature = "rust1", since = "1.0.0"))]
|
||||
#[cfg_attr(
|
||||
staged_api,
|
||||
rustc_const_unstable(feature = "const_socketaddr", issue = "82485")
|
||||
)]
|
||||
pub const fn ip(&self) -> &Ipv6Addr {
|
||||
&self.ip
|
||||
}
|
||||
|
||||
/// Changes the IP address associated with this socket address.
|
||||
///
|
||||
/// # Examples
|
||||
///
|
||||
/// ```
|
||||
/// use std::net::{SocketAddrV6, Ipv6Addr};
|
||||
///
|
||||
/// let mut socket = SocketAddrV6::new(Ipv6Addr::new(0, 0, 0, 0, 0, 0, 0, 1), 8080, 0, 0);
|
||||
/// socket.set_ip(Ipv6Addr::new(76, 45, 0, 0, 0, 0, 0, 0));
|
||||
/// assert_eq!(socket.ip(), &Ipv6Addr::new(76, 45, 0, 0, 0, 0, 0, 0));
|
||||
/// ```
|
||||
#[cfg_attr(staged_api, stable(feature = "sockaddr_setters", since = "1.9.0"))]
|
||||
pub fn set_ip(&mut self, new_ip: Ipv6Addr) {
|
||||
self.ip = new_ip;
|
||||
}
|
||||
|
||||
/// Returns the port number associated with this socket address.
|
||||
///
|
||||
/// # Examples
|
||||
///
|
||||
/// ```
|
||||
/// use std::net::{SocketAddrV6, Ipv6Addr};
|
||||
///
|
||||
/// let socket = SocketAddrV6::new(Ipv6Addr::new(0, 0, 0, 0, 0, 0, 0, 1), 8080, 0, 0);
|
||||
/// assert_eq!(socket.port(), 8080);
|
||||
/// ```
|
||||
#[must_use]
|
||||
#[cfg_attr(staged_api, stable(feature = "rust1", since = "1.0.0"))]
|
||||
#[cfg_attr(
|
||||
staged_api,
|
||||
rustc_const_unstable(feature = "const_socketaddr", issue = "82485")
|
||||
)]
|
||||
pub const fn port(&self) -> u16 {
|
||||
self.port
|
||||
}
|
||||
|
||||
/// Changes the port number associated with this socket address.
|
||||
///
|
||||
/// # Examples
|
||||
///
|
||||
/// ```
|
||||
/// use std::net::{SocketAddrV6, Ipv6Addr};
|
||||
///
|
||||
/// let mut socket = SocketAddrV6::new(Ipv6Addr::new(0, 0, 0, 0, 0, 0, 0, 1), 8080, 0, 0);
|
||||
/// socket.set_port(4242);
|
||||
/// assert_eq!(socket.port(), 4242);
|
||||
/// ```
|
||||
#[cfg_attr(staged_api, stable(feature = "sockaddr_setters", since = "1.9.0"))]
|
||||
pub fn set_port(&mut self, new_port: u16) {
|
||||
self.port = new_port;
|
||||
}
|
||||
|
||||
/// Returns the flow information associated with this address.
|
||||
///
|
||||
/// This information corresponds to the `sin6_flowinfo` field in C's `netinet/in.h`,
|
||||
/// as specified in [IETF RFC 2553, Section 3.3].
|
||||
/// It combines information about the flow label and the traffic class as specified
|
||||
/// in [IETF RFC 2460], respectively [Section 6] and [Section 7].
|
||||
///
|
||||
/// [IETF RFC 2553, Section 3.3]: https://tools.ietf.org/html/rfc2553#section-3.3
|
||||
/// [IETF RFC 2460]: https://tools.ietf.org/html/rfc2460
|
||||
/// [Section 6]: https://tools.ietf.org/html/rfc2460#section-6
|
||||
/// [Section 7]: https://tools.ietf.org/html/rfc2460#section-7
|
||||
///
|
||||
/// # Examples
|
||||
///
|
||||
/// ```
|
||||
/// use std::net::{SocketAddrV6, Ipv6Addr};
|
||||
///
|
||||
/// let socket = SocketAddrV6::new(Ipv6Addr::new(0, 0, 0, 0, 0, 0, 0, 1), 8080, 10, 0);
|
||||
/// assert_eq!(socket.flowinfo(), 10);
|
||||
/// ```
|
||||
#[must_use]
|
||||
#[cfg_attr(staged_api, stable(feature = "rust1", since = "1.0.0"))]
|
||||
#[cfg_attr(
|
||||
staged_api,
|
||||
rustc_const_unstable(feature = "const_socketaddr", issue = "82485")
|
||||
)]
|
||||
pub const fn flowinfo(&self) -> u32 {
|
||||
self.flowinfo
|
||||
}
|
||||
|
||||
/// Changes the flow information associated with this socket address.
|
||||
///
|
||||
/// See [`SocketAddrV6::flowinfo`]'s documentation for more details.
|
||||
///
|
||||
/// # Examples
|
||||
///
|
||||
/// ```
|
||||
/// use std::net::{SocketAddrV6, Ipv6Addr};
|
||||
///
|
||||
/// let mut socket = SocketAddrV6::new(Ipv6Addr::new(0, 0, 0, 0, 0, 0, 0, 1), 8080, 10, 0);
|
||||
/// socket.set_flowinfo(56);
|
||||
/// assert_eq!(socket.flowinfo(), 56);
|
||||
/// ```
|
||||
#[cfg_attr(staged_api, stable(feature = "sockaddr_setters", since = "1.9.0"))]
|
||||
pub fn set_flowinfo(&mut self, new_flowinfo: u32) {
|
||||
self.flowinfo = new_flowinfo;
|
||||
}
|
||||
|
||||
/// Returns the scope ID associated with this address.
|
||||
///
|
||||
/// This information corresponds to the `sin6_scope_id` field in C's `netinet/in.h`,
|
||||
/// as specified in [IETF RFC 2553, Section 3.3].
|
||||
///
|
||||
/// [IETF RFC 2553, Section 3.3]: https://tools.ietf.org/html/rfc2553#section-3.3
|
||||
///
|
||||
/// # Examples
|
||||
///
|
||||
/// ```
|
||||
/// use std::net::{SocketAddrV6, Ipv6Addr};
|
||||
///
|
||||
/// let socket = SocketAddrV6::new(Ipv6Addr::new(0, 0, 0, 0, 0, 0, 0, 1), 8080, 0, 78);
|
||||
/// assert_eq!(socket.scope_id(), 78);
|
||||
/// ```
|
||||
#[must_use]
|
||||
#[cfg_attr(staged_api, stable(feature = "rust1", since = "1.0.0"))]
|
||||
#[cfg_attr(
|
||||
staged_api,
|
||||
rustc_const_unstable(feature = "const_socketaddr", issue = "82485")
|
||||
)]
|
||||
pub const fn scope_id(&self) -> u32 {
|
||||
self.scope_id
|
||||
}
|
||||
|
||||
/// Changes the scope ID associated with this socket address.
|
||||
///
|
||||
/// See [`SocketAddrV6::scope_id`]'s documentation for more details.
|
||||
///
|
||||
/// # Examples
|
||||
///
|
||||
/// ```
|
||||
/// use std::net::{SocketAddrV6, Ipv6Addr};
|
||||
///
|
||||
/// let mut socket = SocketAddrV6::new(Ipv6Addr::new(0, 0, 0, 0, 0, 0, 0, 1), 8080, 0, 78);
|
||||
/// socket.set_scope_id(42);
|
||||
/// assert_eq!(socket.scope_id(), 42);
|
||||
/// ```
|
||||
#[cfg_attr(staged_api, stable(feature = "sockaddr_setters", since = "1.9.0"))]
|
||||
pub fn set_scope_id(&mut self, new_scope_id: u32) {
|
||||
self.scope_id = new_scope_id;
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg_attr(staged_api, stable(feature = "ip_from_ip", since = "1.16.0"))]
|
||||
impl From<SocketAddrV4> for SocketAddr {
|
||||
/// Converts a [`SocketAddrV4`] into a [`SocketAddr::V4`].
|
||||
fn from(sock4: SocketAddrV4) -> SocketAddr {
|
||||
SocketAddr::V4(sock4)
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg_attr(staged_api, stable(feature = "ip_from_ip", since = "1.16.0"))]
|
||||
impl From<SocketAddrV6> for SocketAddr {
|
||||
/// Converts a [`SocketAddrV6`] into a [`SocketAddr::V6`].
|
||||
fn from(sock6: SocketAddrV6) -> SocketAddr {
|
||||
SocketAddr::V6(sock6)
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg_attr(staged_api, stable(feature = "addr_from_into_ip", since = "1.17.0"))]
|
||||
impl<I: Into<IpAddr>> From<(I, u16)> for SocketAddr {
|
||||
/// Converts a tuple struct (Into<[`IpAddr`]>, `u16`) into a [`SocketAddr`].
|
||||
///
|
||||
/// This conversion creates a [`SocketAddr::V4`] for an [`IpAddr::V4`]
|
||||
/// and creates a [`SocketAddr::V6`] for an [`IpAddr::V6`].
|
||||
///
|
||||
/// `u16` is treated as port of the newly created [`SocketAddr`].
|
||||
fn from(pieces: (I, u16)) -> SocketAddr {
|
||||
SocketAddr::new(pieces.0.into(), pieces.1)
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg_attr(staged_api, stable(feature = "socketaddr_ordering", since = "1.45.0"))]
|
||||
impl PartialOrd for SocketAddrV4 {
|
||||
fn partial_cmp(&self, other: &SocketAddrV4) -> Option<Ordering> {
|
||||
Some(self.cmp(other))
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg_attr(staged_api, stable(feature = "socketaddr_ordering", since = "1.45.0"))]
|
||||
impl PartialOrd for SocketAddrV6 {
|
||||
fn partial_cmp(&self, other: &SocketAddrV6) -> Option<Ordering> {
|
||||
Some(self.cmp(other))
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg_attr(staged_api, stable(feature = "socketaddr_ordering", since = "1.45.0"))]
|
||||
impl Ord for SocketAddrV4 {
|
||||
fn cmp(&self, other: &SocketAddrV4) -> Ordering {
|
||||
self.ip()
|
||||
.cmp(other.ip())
|
||||
.then(self.port().cmp(&other.port()))
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg_attr(staged_api, stable(feature = "socketaddr_ordering", since = "1.45.0"))]
|
||||
impl Ord for SocketAddrV6 {
|
||||
fn cmp(&self, other: &SocketAddrV6) -> Ordering {
|
||||
self.ip()
|
||||
.cmp(other.ip())
|
||||
.then(self.port().cmp(&other.port()))
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg_attr(staged_api, stable(feature = "rust1", since = "1.0.0"))]
|
||||
impl hash::Hash for SocketAddrV4 {
|
||||
fn hash<H: hash::Hasher>(&self, s: &mut H) {
|
||||
(self.port, self.ip).hash(s)
|
||||
}
|
||||
}
|
||||
#[cfg_attr(staged_api, stable(feature = "rust1", since = "1.0.0"))]
|
||||
impl hash::Hash for SocketAddrV6 {
|
||||
fn hash<H: hash::Hasher>(&self, s: &mut H) {
|
||||
(self.port, &self.ip, self.flowinfo, self.scope_id).hash(s)
|
||||
}
|
||||
}
|
||||
25
third-party/vendor/rustix/src/maybe_polyfill/no_std/os/fd/mod.rs
vendored
Normal file
25
third-party/vendor/rustix/src/maybe_polyfill/no_std/os/fd/mod.rs
vendored
Normal file
|
|
@ -0,0 +1,25 @@
|
|||
//! The following is derived from Rust's
|
||||
//! library/std/src/os/fd/mod.rs at revision
|
||||
//! fa68e73e9947be8ffc5b3b46d899e4953a44e7e9.
|
||||
//!
|
||||
//! All code in this file is licensed MIT or Apache 2.0 at your option.
|
||||
//!
|
||||
//! Owned and borrowed Unix-like file descriptors.
|
||||
//!
|
||||
//! This module is supported on Unix platforms and WASI, which both use a
|
||||
//! similar file descriptor system for referencing OS resources.
|
||||
|
||||
#![cfg_attr(staged_api, stable(feature = "os_fd", since = "1.66.0"))]
|
||||
#![deny(unsafe_op_in_unsafe_fn)]
|
||||
|
||||
// `RawFd`, `AsRawFd`, etc.
|
||||
mod raw;
|
||||
|
||||
// `OwnedFd`, `AsFd`, etc.
|
||||
mod owned;
|
||||
|
||||
// Export the types and traits for the public API.
|
||||
#[cfg_attr(staged_api, stable(feature = "os_fd", since = "1.66.0"))]
|
||||
pub use owned::*;
|
||||
#[cfg_attr(staged_api, stable(feature = "os_fd", since = "1.66.0"))]
|
||||
pub use raw::*;
|
||||
294
third-party/vendor/rustix/src/maybe_polyfill/no_std/os/fd/owned.rs
vendored
Normal file
294
third-party/vendor/rustix/src/maybe_polyfill/no_std/os/fd/owned.rs
vendored
Normal file
|
|
@ -0,0 +1,294 @@
|
|||
//! The following is derived from Rust's
|
||||
//! library/std/src/os/fd/owned.rs at revision
|
||||
//! 334a54cd83191f38ad8046ed94c45de735c86c65.
|
||||
//!
|
||||
//! All code in this file is licensed MIT or Apache 2.0 at your option.
|
||||
//!
|
||||
//! Owned and borrowed Unix-like file descriptors.
|
||||
|
||||
#![cfg_attr(staged_api, unstable(feature = "io_safety", issue = "87074"))]
|
||||
#![deny(unsafe_op_in_unsafe_fn)]
|
||||
#![allow(unsafe_code)]
|
||||
|
||||
use super::raw::{AsRawFd, FromRawFd, IntoRawFd, RawFd};
|
||||
use crate::io::close;
|
||||
use core::fmt;
|
||||
use core::marker::PhantomData;
|
||||
use core::mem::forget;
|
||||
|
||||
/// A borrowed file descriptor.
|
||||
///
|
||||
/// This has a lifetime parameter to tie it to the lifetime of something that owns the file
|
||||
/// descriptor. For the duration of that lifetime, it is guaranteed that nobody will close the file
|
||||
/// descriptor.
|
||||
///
|
||||
/// This uses `repr(transparent)` and has the representation of a host file
|
||||
/// descriptor, so it can be used in FFI in places where a file descriptor is
|
||||
/// passed as an argument, it is not captured or consumed, and it never has the
|
||||
/// value `-1`.
|
||||
///
|
||||
/// This type's `.to_owned()` implementation returns another `BorrowedFd`
|
||||
/// rather than an `OwnedFd`. It just makes a trivial copy of the raw file
|
||||
/// descriptor, which is then borrowed under the same lifetime.
|
||||
#[derive(Copy, Clone)]
|
||||
#[repr(transparent)]
|
||||
#[cfg_attr(rustc_attrs, rustc_layout_scalar_valid_range_start(0))]
|
||||
// libstd/os/raw/mod.rs assures me that every libstd-supported platform has a
|
||||
// 32-bit c_int. Below is -2, in two's complement, but that only works out
|
||||
// because c_int is 32 bits.
|
||||
#[cfg_attr(rustc_attrs, rustc_layout_scalar_valid_range_end(0xFF_FF_FF_FE))]
|
||||
#[cfg_attr(rustc_attrs, rustc_nonnull_optimization_guaranteed)]
|
||||
#[cfg_attr(staged_api, stable(feature = "io_safety", since = "1.63.0"))]
|
||||
pub struct BorrowedFd<'fd> {
|
||||
fd: RawFd,
|
||||
_phantom: PhantomData<&'fd OwnedFd>,
|
||||
}
|
||||
|
||||
/// An owned file descriptor.
|
||||
///
|
||||
/// This closes the file descriptor on drop. It is guaranteed that nobody else will close the file
|
||||
/// descriptor.
|
||||
///
|
||||
/// This uses `repr(transparent)` and has the representation of a host file
|
||||
/// descriptor, so it can be used in FFI in places where a file descriptor is
|
||||
/// passed as a consumed argument or returned as an owned value, and it never
|
||||
/// has the value `-1`.
|
||||
#[repr(transparent)]
|
||||
#[cfg_attr(rustc_attrs, rustc_layout_scalar_valid_range_start(0))]
|
||||
// libstd/os/raw/mod.rs assures me that every libstd-supported platform has a
|
||||
// 32-bit c_int. Below is -2, in two's complement, but that only works out
|
||||
// because c_int is 32 bits.
|
||||
#[cfg_attr(rustc_attrs, rustc_layout_scalar_valid_range_end(0xFF_FF_FF_FE))]
|
||||
#[cfg_attr(staged_api, unstable(feature = "io_safety", issue = "87074"))]
|
||||
#[cfg_attr(rustc_attrs, rustc_nonnull_optimization_guaranteed)]
|
||||
pub struct OwnedFd {
|
||||
fd: RawFd,
|
||||
}
|
||||
|
||||
impl BorrowedFd<'_> {
|
||||
/// Return a `BorrowedFd` holding the given raw file descriptor.
|
||||
///
|
||||
/// # Safety
|
||||
///
|
||||
/// The resource pointed to by `fd` must remain open for the duration of
|
||||
/// the returned `BorrowedFd`, and it must not have the value `-1`.
|
||||
#[inline]
|
||||
#[cfg_attr(
|
||||
staged_api,
|
||||
rustc_const_stable(feature = "io_safety", since = "1.63.0")
|
||||
)]
|
||||
#[cfg_attr(staged_api, stable(feature = "io_safety", since = "1.63.0"))]
|
||||
pub const unsafe fn borrow_raw(fd: RawFd) -> Self {
|
||||
assert!(fd != u32::MAX as RawFd);
|
||||
// SAFETY: we just asserted that the value is in the valid range and isn't `-1` (the only value bigger than `0xFF_FF_FF_FE` unsigned)
|
||||
#[allow(unused_unsafe)]
|
||||
unsafe {
|
||||
Self {
|
||||
fd,
|
||||
_phantom: PhantomData,
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl OwnedFd {
|
||||
/// Creates a new `OwnedFd` instance that shares the same underlying file handle
|
||||
/// as the existing `OwnedFd` instance.
|
||||
#[cfg(not(target_arch = "wasm32"))]
|
||||
pub fn try_clone(&self) -> crate::io::Result<Self> {
|
||||
// We want to atomically duplicate this file descriptor and set the
|
||||
// CLOEXEC flag, and currently that's done via F_DUPFD_CLOEXEC. This
|
||||
// is a POSIX flag that was added to Linux in 2.6.24.
|
||||
#[cfg(not(target_os = "espidf"))]
|
||||
let fd = crate::io::fcntl_dupfd_cloexec(self, 0)?;
|
||||
|
||||
// For ESP-IDF, F_DUPFD is used instead, because the CLOEXEC semantics
|
||||
// will never be supported, as this is a bare metal framework with
|
||||
// no capabilities for multi-process execution. While F_DUPFD is also
|
||||
// not supported yet, it might be (currently it returns ENOSYS).
|
||||
#[cfg(target_os = "espidf")]
|
||||
let fd = crate::io::fcntl_dupfd(self)?;
|
||||
|
||||
Ok(fd.into())
|
||||
}
|
||||
|
||||
/// Creates a new `OwnedFd` instance that shares the same underlying file handle
|
||||
/// as the existing `OwnedFd` instance.
|
||||
#[cfg(target_arch = "wasm32")]
|
||||
pub fn try_clone(&self) -> crate::io::Result<Self> {
|
||||
Err(crate::io::Errno::NOSYS)
|
||||
}
|
||||
}
|
||||
|
||||
impl BorrowedFd<'_> {
|
||||
/// Creates a new `OwnedFd` instance that shares the same underlying file
|
||||
/// description as the existing `BorrowedFd` instance.
|
||||
#[cfg(not(any(target_arch = "wasm32", target_os = "hermit")))]
|
||||
#[cfg_attr(staged_api, stable(feature = "io_safety", since = "1.63.0"))]
|
||||
pub fn try_clone_to_owned(&self) -> crate::io::Result<OwnedFd> {
|
||||
// Avoid using file descriptors below 3 as they are used for stdio
|
||||
|
||||
// We want to atomically duplicate this file descriptor and set the
|
||||
// CLOEXEC flag, and currently that's done via F_DUPFD_CLOEXEC. This
|
||||
// is a POSIX flag that was added to Linux in 2.6.24.
|
||||
#[cfg(not(target_os = "espidf"))]
|
||||
let fd = crate::io::fcntl_dupfd_cloexec(self, 3)?;
|
||||
|
||||
// For ESP-IDF, F_DUPFD is used instead, because the CLOEXEC semantics
|
||||
// will never be supported, as this is a bare metal framework with
|
||||
// no capabilities for multi-process execution. While F_DUPFD is also
|
||||
// not supported yet, it might be (currently it returns ENOSYS).
|
||||
#[cfg(target_os = "espidf")]
|
||||
let fd = crate::io::fcntl_dupfd(self, 3)?;
|
||||
|
||||
Ok(fd)
|
||||
}
|
||||
|
||||
/// Creates a new `OwnedFd` instance that shares the same underlying file
|
||||
/// description as the existing `BorrowedFd` instance.
|
||||
#[cfg(any(target_arch = "wasm32", target_os = "hermit"))]
|
||||
#[cfg_attr(staged_api, stable(feature = "io_safety", since = "1.63.0"))]
|
||||
pub fn try_clone_to_owned(&self) -> crate::io::Result<OwnedFd> {
|
||||
Err(crate::io::Errno::NOSYS)
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg_attr(staged_api, unstable(feature = "io_safety", issue = "87074"))]
|
||||
impl AsRawFd for BorrowedFd<'_> {
|
||||
#[inline]
|
||||
fn as_raw_fd(&self) -> RawFd {
|
||||
self.fd
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg_attr(staged_api, unstable(feature = "io_safety", issue = "87074"))]
|
||||
impl AsRawFd for OwnedFd {
|
||||
#[inline]
|
||||
fn as_raw_fd(&self) -> RawFd {
|
||||
self.fd
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg_attr(staged_api, unstable(feature = "io_safety", issue = "87074"))]
|
||||
impl IntoRawFd for OwnedFd {
|
||||
#[inline]
|
||||
fn into_raw_fd(self) -> RawFd {
|
||||
let fd = self.fd;
|
||||
forget(self);
|
||||
fd
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg_attr(staged_api, unstable(feature = "io_safety", issue = "87074"))]
|
||||
impl FromRawFd for OwnedFd {
|
||||
/// Constructs a new instance of `Self` from the given raw file descriptor.
|
||||
///
|
||||
/// # Safety
|
||||
///
|
||||
/// The resource pointed to by `fd` must be open and suitable for assuming
|
||||
/// [ownership][io-safety]. The resource must not require any cleanup other than `close`.
|
||||
///
|
||||
/// [io-safety]: io#io-safety
|
||||
#[inline]
|
||||
unsafe fn from_raw_fd(fd: RawFd) -> Self {
|
||||
assert_ne!(fd, u32::MAX as RawFd);
|
||||
// SAFETY: we just asserted that the value is in the valid range and isn't `-1` (the only value bigger than `0xFF_FF_FF_FE` unsigned)
|
||||
#[allow(unused_unsafe)]
|
||||
unsafe {
|
||||
Self { fd }
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg_attr(staged_api, unstable(feature = "io_safety", issue = "87074"))]
|
||||
impl Drop for OwnedFd {
|
||||
#[inline]
|
||||
fn drop(&mut self) {
|
||||
unsafe {
|
||||
// Errors are ignored when closing a file descriptor. The reason
|
||||
// for this is that if an error occurs we don't actually know if
|
||||
// the file descriptor was closed or not, and if we retried (for
|
||||
// something like EINTR), we might close another valid file
|
||||
// descriptor opened after we closed ours.
|
||||
close(self.fd as _);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg_attr(staged_api, unstable(feature = "io_safety", issue = "87074"))]
|
||||
impl fmt::Debug for BorrowedFd<'_> {
|
||||
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
||||
f.debug_struct("BorrowedFd").field("fd", &self.fd).finish()
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg_attr(staged_api, unstable(feature = "io_safety", issue = "87074"))]
|
||||
impl fmt::Debug for OwnedFd {
|
||||
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
||||
f.debug_struct("OwnedFd").field("fd", &self.fd).finish()
|
||||
}
|
||||
}
|
||||
|
||||
/// A trait to borrow the file descriptor from an underlying object.
|
||||
///
|
||||
/// This is only available on unix platforms and must be imported in order to
|
||||
/// call the method. Windows platforms have a corresponding `AsHandle` and
|
||||
/// `AsSocket` set of traits.
|
||||
#[cfg_attr(staged_api, unstable(feature = "io_safety", issue = "87074"))]
|
||||
pub trait AsFd {
|
||||
/// Borrows the file descriptor.
|
||||
///
|
||||
/// # Example
|
||||
///
|
||||
/// ```no_run
|
||||
/// # #![feature(io_safety)]
|
||||
/// use std::fs::File;
|
||||
/// # use std::io;
|
||||
/// # #[cfg(target_os = "wasi")]
|
||||
/// # use std::os::wasi::io::{AsFd, BorrowedFd};
|
||||
/// # #[cfg(unix)]
|
||||
/// # use std::os::unix::io::{AsFd, BorrowedFd};
|
||||
///
|
||||
/// let mut f = File::open("foo.txt")?;
|
||||
/// # #[cfg(any(unix, target_os = "wasi"))]
|
||||
/// let borrowed_fd: BorrowedFd<'_> = f.as_fd();
|
||||
/// # Ok::<(), io::Error>(())
|
||||
/// ```
|
||||
#[cfg_attr(staged_api, unstable(feature = "io_safety", issue = "87074"))]
|
||||
fn as_fd(&self) -> BorrowedFd<'_>;
|
||||
}
|
||||
|
||||
#[cfg_attr(staged_api, unstable(feature = "io_safety", issue = "87074"))]
|
||||
impl<T: AsFd> AsFd for &T {
|
||||
#[inline]
|
||||
fn as_fd(&self) -> BorrowedFd<'_> {
|
||||
T::as_fd(self)
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg_attr(staged_api, unstable(feature = "io_safety", issue = "87074"))]
|
||||
impl<T: AsFd> AsFd for &mut T {
|
||||
#[inline]
|
||||
fn as_fd(&self) -> BorrowedFd<'_> {
|
||||
T::as_fd(self)
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg_attr(staged_api, unstable(feature = "io_safety", issue = "87074"))]
|
||||
impl AsFd for BorrowedFd<'_> {
|
||||
#[inline]
|
||||
fn as_fd(&self) -> BorrowedFd<'_> {
|
||||
*self
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg_attr(staged_api, unstable(feature = "io_safety", issue = "87074"))]
|
||||
impl AsFd for OwnedFd {
|
||||
#[inline]
|
||||
fn as_fd(&self) -> BorrowedFd<'_> {
|
||||
// SAFETY: `OwnedFd` and `BorrowedFd` have the same validity
|
||||
// invariants, and the `BorrowedFd` is bounded by the lifetime
|
||||
// of `&self`.
|
||||
unsafe { BorrowedFd::borrow_raw(self.as_raw_fd()) }
|
||||
}
|
||||
}
|
||||
164
third-party/vendor/rustix/src/maybe_polyfill/no_std/os/fd/raw.rs
vendored
Normal file
164
third-party/vendor/rustix/src/maybe_polyfill/no_std/os/fd/raw.rs
vendored
Normal file
|
|
@ -0,0 +1,164 @@
|
|||
//! The following is derived from Rust's
|
||||
//! library/std/src/os/fd/raw.rs at revision
|
||||
//! 334a54cd83191f38ad8046ed94c45de735c86c65.
|
||||
//!
|
||||
//! All code in this file is licensed MIT or Apache 2.0 at your option.
|
||||
//!
|
||||
//! Raw Unix-like file descriptors.
|
||||
|
||||
#![cfg_attr(staged_api, stable(feature = "rust1", since = "1.0.0"))]
|
||||
#![allow(unsafe_code)]
|
||||
|
||||
use crate::backend::c;
|
||||
|
||||
/// Raw file descriptors.
|
||||
#[cfg_attr(staged_api, stable(feature = "rust1", since = "1.0.0"))]
|
||||
pub type RawFd = c::c_int;
|
||||
|
||||
/// A trait to extract the raw file descriptor from an underlying object.
|
||||
///
|
||||
/// This is only available on unix and WASI platforms and must be imported in
|
||||
/// order to call the method. Windows platforms have a corresponding
|
||||
/// `AsRawHandle` and `AsRawSocket` set of traits.
|
||||
#[cfg_attr(staged_api, stable(feature = "rust1", since = "1.0.0"))]
|
||||
pub trait AsRawFd {
|
||||
/// Extracts the raw file descriptor.
|
||||
///
|
||||
/// This function is typically used to **borrow** an owned file descriptor.
|
||||
/// When used in this way, this method does **not** pass ownership of the
|
||||
/// raw file descriptor to the caller, and the file descriptor is only
|
||||
/// guaranteed to be valid while the original object has not yet been
|
||||
/// destroyed.
|
||||
///
|
||||
/// However, borrowing is not strictly required. See [`AsFd::as_fd`]
|
||||
/// for an API which strictly borrows a file descriptor.
|
||||
///
|
||||
/// # Example
|
||||
///
|
||||
/// ```no_run
|
||||
/// use std::fs::File;
|
||||
/// # use std::io;
|
||||
/// #[cfg(unix)]
|
||||
/// use std::os::unix::io::{AsRawFd, RawFd};
|
||||
/// #[cfg(target_os = "wasi")]
|
||||
/// use std::os::wasi::io::{AsRawFd, RawFd};
|
||||
///
|
||||
/// let mut f = File::open("foo.txt")?;
|
||||
/// // `raw_fd` is only valid as long as `f` exists.
|
||||
/// #[cfg(any(unix, target_os = "wasi"))]
|
||||
/// let raw_fd: RawFd = f.as_raw_fd();
|
||||
/// # Ok::<(), io::Error>(())
|
||||
/// ```
|
||||
#[cfg_attr(staged_api, stable(feature = "rust1", since = "1.0.0"))]
|
||||
fn as_raw_fd(&self) -> RawFd;
|
||||
}
|
||||
|
||||
/// A trait to express the ability to construct an object from a raw file
|
||||
/// descriptor.
|
||||
#[cfg_attr(staged_api, stable(feature = "from_raw_os", since = "1.1.0"))]
|
||||
pub trait FromRawFd {
|
||||
/// Constructs a new instance of `Self` from the given raw file
|
||||
/// descriptor.
|
||||
///
|
||||
/// This function is typically used to **consume ownership** of the
|
||||
/// specified file descriptor. When used in this way, the returned object
|
||||
/// will take responsibility for closing it when the object goes out of
|
||||
/// scope.
|
||||
///
|
||||
/// However, consuming ownership is not strictly required. Use a
|
||||
/// [`From<OwnedFd>::from`] implementation for an API which strictly
|
||||
/// consumes ownership.
|
||||
///
|
||||
/// # Safety
|
||||
///
|
||||
/// The `fd` passed in must be an [owned file descriptor][io-safety];
|
||||
/// in particular, it must be open.
|
||||
///
|
||||
/// [io-safety]: io#io-safety
|
||||
///
|
||||
/// # Example
|
||||
///
|
||||
/// ```no_run
|
||||
/// use std::fs::File;
|
||||
/// # use std::io;
|
||||
/// #[cfg(unix)]
|
||||
/// use std::os::unix::io::{FromRawFd, IntoRawFd, RawFd};
|
||||
/// #[cfg(target_os = "wasi")]
|
||||
/// use std::os::wasi::io::{FromRawFd, IntoRawFd, RawFd};
|
||||
///
|
||||
/// let f = File::open("foo.txt")?;
|
||||
/// # #[cfg(any(unix, target_os = "wasi"))]
|
||||
/// let raw_fd: RawFd = f.into_raw_fd();
|
||||
/// // SAFETY: no other functions should call `from_raw_fd`, so there
|
||||
/// // is only one owner for the file descriptor.
|
||||
/// # #[cfg(any(unix, target_os = "wasi"))]
|
||||
/// let f = unsafe { File::from_raw_fd(raw_fd) };
|
||||
/// # Ok::<(), io::Error>(())
|
||||
/// ```
|
||||
#[cfg_attr(staged_api, stable(feature = "from_raw_os", since = "1.1.0"))]
|
||||
unsafe fn from_raw_fd(fd: RawFd) -> Self;
|
||||
}
|
||||
|
||||
/// A trait to express the ability to consume an object and acquire ownership of
|
||||
/// its raw file descriptor.
|
||||
#[cfg_attr(staged_api, stable(feature = "into_raw_os", since = "1.4.0"))]
|
||||
pub trait IntoRawFd {
|
||||
/// Consumes this object, returning the raw underlying file descriptor.
|
||||
///
|
||||
/// This function is typically used to **transfer ownership** of the underlying
|
||||
/// file descriptor to the caller. When used in this way, callers are then the unique
|
||||
/// owners of the file descriptor and must close it once it's no longer needed.
|
||||
///
|
||||
/// However, transferring ownership is not strictly required. Use a
|
||||
/// [`Into<OwnedFd>::into`] implementation for an API which strictly
|
||||
/// transfers ownership.
|
||||
///
|
||||
/// # Example
|
||||
///
|
||||
/// ```no_run
|
||||
/// use std::fs::File;
|
||||
/// # use std::io;
|
||||
/// #[cfg(unix)]
|
||||
/// use std::os::unix::io::{IntoRawFd, RawFd};
|
||||
/// #[cfg(target_os = "wasi")]
|
||||
/// use std::os::wasi::io::{IntoRawFd, RawFd};
|
||||
///
|
||||
/// let f = File::open("foo.txt")?;
|
||||
/// #[cfg(any(unix, target_os = "wasi"))]
|
||||
/// let raw_fd: RawFd = f.into_raw_fd();
|
||||
/// # Ok::<(), io::Error>(())
|
||||
/// ```
|
||||
#[cfg_attr(staged_api, stable(feature = "into_raw_os", since = "1.4.0"))]
|
||||
fn into_raw_fd(self) -> RawFd;
|
||||
}
|
||||
|
||||
#[cfg_attr(
|
||||
staged_api,
|
||||
stable(feature = "raw_fd_reflexive_traits", since = "1.48.0")
|
||||
)]
|
||||
impl AsRawFd for RawFd {
|
||||
#[inline]
|
||||
fn as_raw_fd(&self) -> RawFd {
|
||||
*self
|
||||
}
|
||||
}
|
||||
#[cfg_attr(
|
||||
staged_api,
|
||||
stable(feature = "raw_fd_reflexive_traits", since = "1.48.0")
|
||||
)]
|
||||
impl IntoRawFd for RawFd {
|
||||
#[inline]
|
||||
fn into_raw_fd(self) -> RawFd {
|
||||
self
|
||||
}
|
||||
}
|
||||
#[cfg_attr(
|
||||
staged_api,
|
||||
stable(feature = "raw_fd_reflexive_traits", since = "1.48.0")
|
||||
)]
|
||||
impl FromRawFd for RawFd {
|
||||
#[inline]
|
||||
unsafe fn from_raw_fd(fd: RawFd) -> RawFd {
|
||||
fd
|
||||
}
|
||||
}
|
||||
4
third-party/vendor/rustix/src/maybe_polyfill/no_std/os/mod.rs
vendored
Normal file
4
third-party/vendor/rustix/src/maybe_polyfill/no_std/os/mod.rs
vendored
Normal file
|
|
@ -0,0 +1,4 @@
|
|||
#[cfg(any(unix, target_os = "wasi"))]
|
||||
pub mod fd;
|
||||
#[cfg(windows)]
|
||||
pub mod windows;
|
||||
5
third-party/vendor/rustix/src/maybe_polyfill/no_std/os/windows/io/mod.rs
vendored
Normal file
5
third-party/vendor/rustix/src/maybe_polyfill/no_std/os/windows/io/mod.rs
vendored
Normal file
|
|
@ -0,0 +1,5 @@
|
|||
mod raw;
|
||||
mod socket;
|
||||
|
||||
pub use raw::{AsRawSocket, FromRawSocket, IntoRawSocket, RawSocket};
|
||||
pub use socket::{AsSocket, BorrowedSocket, OwnedSocket};
|
||||
71
third-party/vendor/rustix/src/maybe_polyfill/no_std/os/windows/io/raw.rs
vendored
Normal file
71
third-party/vendor/rustix/src/maybe_polyfill/no_std/os/windows/io/raw.rs
vendored
Normal file
|
|
@ -0,0 +1,71 @@
|
|||
//! The following is derived from Rust's
|
||||
//! library/std/src/os/windows/io/raw.rs
|
||||
//! at revision
|
||||
//! 4f9b394c8a24803e57ba892fa00e539742ebafc0.
|
||||
//!
|
||||
//! All code in this file is licensed MIT or Apache 2.0 at your option.
|
||||
|
||||
use super::super::raw;
|
||||
|
||||
/// Raw SOCKETs.
|
||||
#[cfg_attr(staged_api, stable(feature = "rust1", since = "1.0.0"))]
|
||||
pub type RawSocket = raw::SOCKET;
|
||||
|
||||
/// Extracts raw sockets.
|
||||
#[cfg_attr(staged_api, stable(feature = "rust1", since = "1.0.0"))]
|
||||
pub trait AsRawSocket {
|
||||
/// Extracts the raw socket.
|
||||
///
|
||||
/// This function is typically used to **borrow** an owned socket.
|
||||
/// When used in this way, this method does **not** pass ownership of the
|
||||
/// raw socket to the caller, and the socket is only guaranteed
|
||||
/// to be valid while the original object has not yet been destroyed.
|
||||
///
|
||||
/// However, borrowing is not strictly required. See [`AsSocket::as_socket`]
|
||||
/// for an API which strictly borrows a socket.
|
||||
#[cfg_attr(staged_api, stable(feature = "rust1", since = "1.0.0"))]
|
||||
fn as_raw_socket(&self) -> RawSocket;
|
||||
}
|
||||
|
||||
/// Creates I/O objects from raw sockets.
|
||||
#[cfg_attr(staged_api, stable(feature = "from_raw_os", since = "1.1.0"))]
|
||||
pub trait FromRawSocket {
|
||||
/// Constructs a new I/O object from the specified raw socket.
|
||||
///
|
||||
/// This function is typically used to **consume ownership** of the socket
|
||||
/// given, passing responsibility for closing the socket to the returned
|
||||
/// object. When used in this way, the returned object
|
||||
/// will take responsibility for closing it when the object goes out of
|
||||
/// scope.
|
||||
///
|
||||
/// However, consuming ownership is not strictly required. Use a
|
||||
/// `From<OwnedSocket>::from` implementation for an API which strictly
|
||||
/// consumes ownership.
|
||||
///
|
||||
/// # Safety
|
||||
///
|
||||
/// The `socket` passed in must:
|
||||
/// - be a valid an open socket,
|
||||
/// - be a socket that may be freed via [`closesocket`].
|
||||
///
|
||||
/// [`closesocket`]: https://docs.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-closesocket
|
||||
#[cfg_attr(staged_api, stable(feature = "from_raw_os", since = "1.1.0"))]
|
||||
unsafe fn from_raw_socket(sock: RawSocket) -> Self;
|
||||
}
|
||||
|
||||
/// A trait to express the ability to consume an object and acquire ownership of
|
||||
/// its raw `SOCKET`.
|
||||
#[cfg_attr(staged_api, stable(feature = "into_raw_os", since = "1.4.0"))]
|
||||
pub trait IntoRawSocket {
|
||||
/// Consumes this object, returning the raw underlying socket.
|
||||
///
|
||||
/// This function is typically used to **transfer ownership** of the underlying
|
||||
/// socket to the caller. When used in this way, callers are then the unique
|
||||
/// owners of the socket and must close it once it's no longer needed.
|
||||
///
|
||||
/// However, transferring ownership is not strictly required. Use a
|
||||
/// `Into<OwnedSocket>::into` implementation for an API which strictly
|
||||
/// transfers ownership.
|
||||
#[cfg_attr(staged_api, stable(feature = "into_raw_os", since = "1.4.0"))]
|
||||
fn into_raw_socket(self) -> RawSocket;
|
||||
}
|
||||
199
third-party/vendor/rustix/src/maybe_polyfill/no_std/os/windows/io/socket.rs
vendored
Normal file
199
third-party/vendor/rustix/src/maybe_polyfill/no_std/os/windows/io/socket.rs
vendored
Normal file
|
|
@ -0,0 +1,199 @@
|
|||
//! The following is derived from Rust's
|
||||
//! library/std/src/os/windows/io/socket.rs
|
||||
//! at revision
|
||||
//! 4f9b394c8a24803e57ba892fa00e539742ebafc0.
|
||||
//!
|
||||
//! All code in this file is licensed MIT or Apache 2.0 at your option.
|
||||
|
||||
use super::raw::*;
|
||||
use crate::backend::c;
|
||||
use crate::backend::fd::LibcFd as LibcSocket;
|
||||
use core::fmt;
|
||||
use core::marker::PhantomData;
|
||||
use core::mem::forget;
|
||||
|
||||
/// A borrowed socket.
|
||||
///
|
||||
/// This has a lifetime parameter to tie it to the lifetime of something that
|
||||
/// owns the socket.
|
||||
///
|
||||
/// This uses `repr(transparent)` and has the representation of a host socket,
|
||||
/// so it can be used in FFI in places where a socket is passed as an argument,
|
||||
/// it is not captured or consumed, and it never has the value
|
||||
/// `INVALID_SOCKET`.
|
||||
///
|
||||
/// This type's `.to_owned()` implementation returns another `BorrowedSocket`
|
||||
/// rather than an `OwnedSocket`. It just makes a trivial copy of the raw
|
||||
/// socket, which is then borrowed under the same lifetime.
|
||||
#[derive(Copy, Clone)]
|
||||
#[repr(transparent)]
|
||||
#[cfg_attr(staged_api, rustc_layout_scalar_valid_range_start(0))]
|
||||
// This is -2, in two's complement. -1 is `INVALID_SOCKET`.
|
||||
#[cfg_attr(
|
||||
all(staged_api, target_pointer_width = "32"),
|
||||
rustc_layout_scalar_valid_range_end(0xFF_FF_FF_FE)
|
||||
)]
|
||||
#[cfg_attr(
|
||||
all(staged_api, target_pointer_width = "64"),
|
||||
rustc_layout_scalar_valid_range_end(0xFF_FF_FF_FF_FF_FF_FF_FE)
|
||||
)]
|
||||
#[cfg_attr(staged_api, rustc_nonnull_optimization_guaranteed)]
|
||||
#[cfg_attr(staged_api, stable(feature = "io_safety", since = "1.63.0"))]
|
||||
pub struct BorrowedSocket<'socket> {
|
||||
socket: RawSocket,
|
||||
_phantom: PhantomData<&'socket OwnedSocket>,
|
||||
}
|
||||
|
||||
/// An owned socket.
|
||||
///
|
||||
/// This closes the socket on drop.
|
||||
///
|
||||
/// This uses `repr(transparent)` and has the representation of a host socket,
|
||||
/// so it can be used in FFI in places where a socket is passed as a consumed
|
||||
/// argument or returned as an owned value, and it never has the value
|
||||
/// `INVALID_SOCKET`.
|
||||
#[repr(transparent)]
|
||||
#[cfg_attr(staged_api, rustc_layout_scalar_valid_range_start(0))]
|
||||
// This is -2, in two's complement. -1 is `INVALID_SOCKET`.
|
||||
#[cfg_attr(
|
||||
all(staged_api, target_pointer_width = "32"),
|
||||
rustc_layout_scalar_valid_range_end(0xFF_FF_FF_FE)
|
||||
)]
|
||||
#[cfg_attr(
|
||||
all(staged_api, target_pointer_width = "64"),
|
||||
rustc_layout_scalar_valid_range_end(0xFF_FF_FF_FF_FF_FF_FF_FE)
|
||||
)]
|
||||
#[cfg_attr(staged_api, rustc_nonnull_optimization_guaranteed)]
|
||||
#[cfg_attr(staged_api, stable(feature = "io_safety", since = "1.63.0"))]
|
||||
pub struct OwnedSocket {
|
||||
socket: RawSocket,
|
||||
}
|
||||
|
||||
impl BorrowedSocket<'_> {
|
||||
/// Return a `BorrowedSocket` holding the given raw socket.
|
||||
///
|
||||
/// # Safety
|
||||
///
|
||||
/// The resource pointed to by `raw` must remain open for the duration of
|
||||
/// the returned `BorrowedSocket`, and it must not have the value
|
||||
/// `INVALID_SOCKET`.
|
||||
#[inline]
|
||||
#[cfg_attr(
|
||||
staged_api,
|
||||
rustc_const_stable(feature = "io_safety", since = "1.63.0")
|
||||
)]
|
||||
#[cfg_attr(staged_api, stable(feature = "io_safety", since = "1.63.0"))]
|
||||
pub const unsafe fn borrow_raw(socket: RawSocket) -> Self {
|
||||
assert!(socket != c::INVALID_SOCKET as RawSocket);
|
||||
Self {
|
||||
socket,
|
||||
_phantom: PhantomData,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg_attr(staged_api, stable(feature = "io_safety", since = "1.63.0"))]
|
||||
impl AsRawSocket for BorrowedSocket<'_> {
|
||||
#[inline]
|
||||
fn as_raw_socket(&self) -> RawSocket {
|
||||
self.socket
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg_attr(staged_api, stable(feature = "io_safety", since = "1.63.0"))]
|
||||
impl AsRawSocket for OwnedSocket {
|
||||
#[inline]
|
||||
fn as_raw_socket(&self) -> RawSocket {
|
||||
self.socket
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg_attr(staged_api, stable(feature = "io_safety", since = "1.63.0"))]
|
||||
impl IntoRawSocket for OwnedSocket {
|
||||
#[inline]
|
||||
fn into_raw_socket(self) -> RawSocket {
|
||||
let socket = self.socket;
|
||||
forget(self);
|
||||
socket
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg_attr(staged_api, stable(feature = "io_safety", since = "1.63.0"))]
|
||||
impl FromRawSocket for OwnedSocket {
|
||||
#[inline]
|
||||
unsafe fn from_raw_socket(socket: RawSocket) -> Self {
|
||||
debug_assert_ne!(socket, c::INVALID_SOCKET as RawSocket);
|
||||
Self { socket }
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg_attr(staged_api, stable(feature = "io_safety", since = "1.63.0"))]
|
||||
impl Drop for OwnedSocket {
|
||||
#[inline]
|
||||
fn drop(&mut self) {
|
||||
unsafe {
|
||||
let _ = c::closesocket(self.socket as LibcSocket);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg_attr(staged_api, stable(feature = "io_safety", since = "1.63.0"))]
|
||||
impl fmt::Debug for BorrowedSocket<'_> {
|
||||
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
||||
f.debug_struct("BorrowedSocket")
|
||||
.field("socket", &self.socket)
|
||||
.finish()
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg_attr(staged_api, stable(feature = "io_safety", since = "1.63.0"))]
|
||||
impl fmt::Debug for OwnedSocket {
|
||||
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
||||
f.debug_struct("OwnedSocket")
|
||||
.field("socket", &self.socket)
|
||||
.finish()
|
||||
}
|
||||
}
|
||||
|
||||
/// A trait to borrow the socket from an underlying object.
|
||||
#[cfg_attr(staged_api, stable(feature = "io_safety", since = "1.63.0"))]
|
||||
pub trait AsSocket {
|
||||
/// Borrows the socket.
|
||||
#[cfg_attr(staged_api, stable(feature = "io_safety", since = "1.63.0"))]
|
||||
fn as_socket(&self) -> BorrowedSocket<'_>;
|
||||
}
|
||||
|
||||
#[cfg_attr(staged_api, stable(feature = "io_safety", since = "1.63.0"))]
|
||||
impl<T: AsSocket> AsSocket for &T {
|
||||
#[inline]
|
||||
fn as_socket(&self) -> BorrowedSocket<'_> {
|
||||
T::as_socket(self)
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg_attr(staged_api, stable(feature = "io_safety", since = "1.63.0"))]
|
||||
impl<T: AsSocket> AsSocket for &mut T {
|
||||
#[inline]
|
||||
fn as_socket(&self) -> BorrowedSocket<'_> {
|
||||
T::as_socket(self)
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg_attr(staged_api, stable(feature = "io_safety", since = "1.63.0"))]
|
||||
impl AsSocket for BorrowedSocket<'_> {
|
||||
#[inline]
|
||||
fn as_socket(&self) -> BorrowedSocket<'_> {
|
||||
*self
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg_attr(staged_api, stable(feature = "io_safety", since = "1.63.0"))]
|
||||
impl AsSocket for OwnedSocket {
|
||||
#[inline]
|
||||
fn as_socket(&self) -> BorrowedSocket<'_> {
|
||||
// Safety: `OwnedSocket` and `BorrowedSocket` have the same validity
|
||||
// invariants, and the `BorrowdSocket` is bounded by the lifetime
|
||||
// of `&self`.
|
||||
unsafe { BorrowedSocket::borrow_raw(self.as_raw_socket()) }
|
||||
}
|
||||
}
|
||||
19
third-party/vendor/rustix/src/maybe_polyfill/no_std/os/windows/mod.rs
vendored
Normal file
19
third-party/vendor/rustix/src/maybe_polyfill/no_std/os/windows/mod.rs
vendored
Normal file
|
|
@ -0,0 +1,19 @@
|
|||
//! The following is derived from Rust's
|
||||
//! library/std/src/os/windows/raw.rs,
|
||||
//! library/std/src/os/windows/io/raw.rs and
|
||||
//! library/std/src/os/windows/io/socket.rs
|
||||
//! at revision
|
||||
//! 4f9b394c8a24803e57ba892fa00e539742ebafc0.
|
||||
//!
|
||||
//! All code in this file is licensed MIT or Apache 2.0 at your option.
|
||||
|
||||
mod raw {
|
||||
#[cfg(target_pointer_width = "32")]
|
||||
#[cfg_attr(staged_api, stable(feature = "raw_ext", since = "1.1.0"))]
|
||||
pub type SOCKET = u32;
|
||||
#[cfg(target_pointer_width = "64")]
|
||||
#[cfg_attr(staged_api, stable(feature = "raw_ext", since = "1.1.0"))]
|
||||
pub type SOCKET = u64;
|
||||
}
|
||||
|
||||
pub mod io;
|
||||
43
third-party/vendor/rustix/src/maybe_polyfill/std/mod.rs
vendored
Normal file
43
third-party/vendor/rustix/src/maybe_polyfill/std/mod.rs
vendored
Normal file
|
|
@ -0,0 +1,43 @@
|
|||
//! Imports from `std` that would be polyfilled for `no_std` builds (see
|
||||
//! `src/polyfill/no_std`).
|
||||
//!
|
||||
//! This implementation is used when `std` is available and just imports the
|
||||
//! necessary items from `std`. For `no_std` builds, the file
|
||||
//! `src/polyfill/no_std` is used instead, which doesn't depend on the standard
|
||||
//! library.
|
||||
|
||||
#[cfg(not(windows))]
|
||||
pub mod io {
|
||||
pub use std::io::{IoSlice, IoSliceMut};
|
||||
}
|
||||
|
||||
#[cfg(not(any(target_os = "redox", target_os = "wasi")))]
|
||||
#[cfg(feature = "net")]
|
||||
pub mod net {
|
||||
pub use std::net::{IpAddr, Ipv4Addr, Ipv6Addr, SocketAddr, SocketAddrV4, SocketAddrV6};
|
||||
}
|
||||
|
||||
pub mod os {
|
||||
pub mod fd {
|
||||
// Change to use `std::os::fd` when MSRV becomes 1.66 or higher.
|
||||
|
||||
#[cfg(unix)]
|
||||
pub use std::os::unix::io::{
|
||||
AsFd, AsRawFd, BorrowedFd, FromRawFd, IntoRawFd, OwnedFd, RawFd,
|
||||
};
|
||||
#[cfg(target_os = "wasi")]
|
||||
pub use std::os::wasi::io::{
|
||||
AsFd, AsRawFd, BorrowedFd, FromRawFd, IntoRawFd, OwnedFd, RawFd,
|
||||
};
|
||||
}
|
||||
|
||||
#[cfg(windows)]
|
||||
pub mod windows {
|
||||
pub mod io {
|
||||
pub use std::os::windows::io::{
|
||||
AsRawSocket, AsSocket, BorrowedSocket, FromRawSocket, IntoRawSocket, OwnedSocket,
|
||||
RawSocket,
|
||||
};
|
||||
}
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue