From 4c3e36cbf9c4f778b11ced610aa5fc065a10e156 Mon Sep 17 00:00:00 2001 From: jtnunley Date: Thu, 11 Aug 2022 14:51:13 -0700 Subject: [PATCH 1/2] add I/O-safe traits --- Cargo.toml | 2 ++ src/sys/unix.rs | 28 ++++++++++++++++++++++++++++ src/sys/windows.rs | 25 +++++++++++++++++++++++++ 3 files changed, 55 insertions(+) diff --git a/Cargo.toml b/Cargo.toml index b530bf55..a617fa54 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -47,3 +47,5 @@ features = [ [features] # Enable all API, even ones not available on all OSs. all = [] +# Use I/O safe traits (requires Rust 1.63.0) +io_safety = [] diff --git a/src/sys/unix.rs b/src/sys/unix.rs index 13e09662..567da213 100644 --- a/src/sys/unix.rs +++ b/src/sys/unix.rs @@ -37,6 +37,8 @@ use std::os::unix::ffi::OsStrExt; ) ))] use std::os::unix::io::RawFd; +#[cfg(feature = "io_safety")] +use std::os::unix::io::{AsFd, BorrowedFd, OwnedFd}; use std::os::unix::io::{AsRawFd, FromRawFd, IntoRawFd}; #[cfg(feature = "all")] use std::os::unix::net::{UnixDatagram, UnixListener, UnixStream}; @@ -2031,6 +2033,32 @@ impl FromRawFd for crate::Socket { } } +#[cfg_attr(docsrs, doc(cfg(all(feature = "io_safety", unix))))] +#[cfg(feature = "io_safety")] +impl AsFd for crate::Socket { + fn as_fd(&self) -> BorrowedFd<'_> { + // SAFETY: lifetime is bound by "self" + unsafe { BorrowedFd::borrow_raw(self.as_raw()) } + } +} + +#[cfg_attr(docsrs, doc(cfg(all(feature = "io_safety", unix))))] +#[cfg(feature = "io_safety")] +impl From for crate::Socket { + fn from(fd: OwnedFd) -> Self { + Self::from_raw(fd.into_raw_fd()) + } +} + +#[cfg_attr(docsrs, doc(cfg(all(feature = "io_safety", unix))))] +#[cfg(feature = "io_safety")] +impl From for OwnedFd { + fn from(sock: crate::Socket) -> Self { + // SAFETY: sock.into_raw() is a valid fd + unsafe { OwnedFd::from_raw_fd(sock.into_raw()) } + } +} + #[cfg(feature = "all")] from!(UnixStream, crate::Socket); #[cfg(feature = "all")] diff --git a/src/sys/windows.rs b/src/sys/windows.rs index 9ca6abdf..997e3928 100644 --- a/src/sys/windows.rs +++ b/src/sys/windows.rs @@ -12,6 +12,8 @@ use std::marker::PhantomData; use std::mem::{self, size_of, MaybeUninit}; use std::net::{self, Ipv4Addr, Ipv6Addr, Shutdown}; use std::os::windows::io::{AsRawSocket, FromRawSocket, IntoRawSocket, RawSocket}; +#[cfg(feature = "io_safety")] +use std::os::windows::io::{AsSocket, BorrowedSocket, OwnedSocket}; use std::sync::Once; use std::time::{Duration, Instant}; use std::{process, ptr, slice}; @@ -818,6 +820,29 @@ impl FromRawSocket for crate::Socket { } } +#[cfg(feature = "io_safety")] +impl AsSocket for crate::Socket { + fn as_socket(&self) -> BorrowedSocket<'_> { + // SAFETY: lifetime is bound by "self" + unsafe { BorrowedSocket::borrow_raw(self.as_raw() as RawSocket) } + } +} + +#[cfg(feature = "io_safety")] +impl From for crate::Socket { + fn from(fd: OwnedSocket) -> Self { + Self::from_raw(fd.into_raw_socket() as Socket) + } +} + +#[cfg(feature = "io_safety")] +impl From for OwnedSocket { + fn from(sock: crate::Socket) -> Self { + // SAFETY: sock.into_raw() is a valid fd + unsafe { OwnedSocket::from_raw_socket(sock.into_raw() as RawSocket) } + } +} + #[test] fn in_addr_convertion() { let ip = Ipv4Addr::new(127, 0, 0, 1); From 2fbde0b51e3821df4e45e67291d4e977a3992b22 Mon Sep 17 00:00:00 2001 From: jtnunley Date: Thu, 11 Aug 2022 15:45:33 -0700 Subject: [PATCH 2/2] remove feature --- Cargo.toml | 4 +--- src/sys/unix.rs | 13 ++++--------- src/sys/windows.rs | 9 +++------ 3 files changed, 8 insertions(+), 18 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index a617fa54..cb287d2c 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -46,6 +46,4 @@ features = [ [features] # Enable all API, even ones not available on all OSs. -all = [] -# Use I/O safe traits (requires Rust 1.63.0) -io_safety = [] +all = [] \ No newline at end of file diff --git a/src/sys/unix.rs b/src/sys/unix.rs index 567da213..d2b6f9e8 100644 --- a/src/sys/unix.rs +++ b/src/sys/unix.rs @@ -37,9 +37,7 @@ use std::os::unix::ffi::OsStrExt; ) ))] use std::os::unix::io::RawFd; -#[cfg(feature = "io_safety")] -use std::os::unix::io::{AsFd, BorrowedFd, OwnedFd}; -use std::os::unix::io::{AsRawFd, FromRawFd, IntoRawFd}; +use std::os::unix::io::{AsFd, AsRawFd, BorrowedFd, FromRawFd, IntoRawFd, OwnedFd}; #[cfg(feature = "all")] use std::os::unix::net::{UnixDatagram, UnixListener, UnixStream}; #[cfg(feature = "all")] @@ -2033,8 +2031,7 @@ impl FromRawFd for crate::Socket { } } -#[cfg_attr(docsrs, doc(cfg(all(feature = "io_safety", unix))))] -#[cfg(feature = "io_safety")] +#[cfg_attr(docsrs, doc(cfg(unix)))] impl AsFd for crate::Socket { fn as_fd(&self) -> BorrowedFd<'_> { // SAFETY: lifetime is bound by "self" @@ -2042,16 +2039,14 @@ impl AsFd for crate::Socket { } } -#[cfg_attr(docsrs, doc(cfg(all(feature = "io_safety", unix))))] -#[cfg(feature = "io_safety")] +#[cfg_attr(docsrs, doc(cfg(unix)))] impl From for crate::Socket { fn from(fd: OwnedFd) -> Self { Self::from_raw(fd.into_raw_fd()) } } -#[cfg_attr(docsrs, doc(cfg(all(feature = "io_safety", unix))))] -#[cfg(feature = "io_safety")] +#[cfg_attr(docsrs, doc(cfg(unix)))] impl From for OwnedFd { fn from(sock: crate::Socket) -> Self { // SAFETY: sock.into_raw() is a valid fd diff --git a/src/sys/windows.rs b/src/sys/windows.rs index 997e3928..20174e56 100644 --- a/src/sys/windows.rs +++ b/src/sys/windows.rs @@ -11,9 +11,9 @@ use std::io::{self, IoSlice}; use std::marker::PhantomData; use std::mem::{self, size_of, MaybeUninit}; use std::net::{self, Ipv4Addr, Ipv6Addr, Shutdown}; -use std::os::windows::io::{AsRawSocket, FromRawSocket, IntoRawSocket, RawSocket}; -#[cfg(feature = "io_safety")] -use std::os::windows::io::{AsSocket, BorrowedSocket, OwnedSocket}; +use std::os::windows::io::{ + AsRawSocket, AsSocket, BorrowedSocket, FromRawSocket, IntoRawSocket, OwnedSocket, RawSocket, +}; use std::sync::Once; use std::time::{Duration, Instant}; use std::{process, ptr, slice}; @@ -820,7 +820,6 @@ impl FromRawSocket for crate::Socket { } } -#[cfg(feature = "io_safety")] impl AsSocket for crate::Socket { fn as_socket(&self) -> BorrowedSocket<'_> { // SAFETY: lifetime is bound by "self" @@ -828,14 +827,12 @@ impl AsSocket for crate::Socket { } } -#[cfg(feature = "io_safety")] impl From for crate::Socket { fn from(fd: OwnedSocket) -> Self { Self::from_raw(fd.into_raw_socket() as Socket) } } -#[cfg(feature = "io_safety")] impl From for OwnedSocket { fn from(sock: crate::Socket) -> Self { // SAFETY: sock.into_raw() is a valid fd