From 754fb064655ec6fcd1640c9cbcaf7b294ef6512a Mon Sep 17 00:00:00 2001 From: Timo Glane Date: Fri, 22 Mar 2024 20:24:43 +0100 Subject: [PATCH 1/5] Implemented the From trait for converting mio socket types into std socket types without using the unsafe keyword --- src/net/tcp/listener.rs | 18 ++++++++++++++++++ src/net/tcp/stream.rs | 18 ++++++++++++++++++ src/net/udp.rs | 18 ++++++++++++++++++ 3 files changed, 54 insertions(+) diff --git a/src/net/tcp/listener.rs b/src/net/tcp/listener.rs index 962af2603..0e550f731 100644 --- a/src/net/tcp/listener.rs +++ b/src/net/tcp/listener.rs @@ -248,3 +248,21 @@ impl FromRawFd for TcpListener { TcpListener::from_std(FromRawFd::from_raw_fd(fd)) } } + +impl From for net::TcpListener { + /// Converts a `mio::net::TcpListener` into a `std::net::TcpListener` + fn from(listener: TcpListener) -> Self { + // Safety: This is safe since we are extracting the raw fd from a well-constructed + // mio::net::TcpListener which ensures that we actually pass in a valid file + // descriptor/socket + unsafe { + #[cfg(any(unix, target_os = "hermit"))] + let std_listener = net::TcpListener::from_raw_fd(listener.into_raw_fd()); + + #[cfg(windows)] + let std_listener = net::TcpListener::from_raw_socket(listener.into_raw_socket()); + + std_listener + } + } +} diff --git a/src/net/tcp/stream.rs b/src/net/tcp/stream.rs index 608f95e99..ad6abd570 100644 --- a/src/net/tcp/stream.rs +++ b/src/net/tcp/stream.rs @@ -430,3 +430,21 @@ impl FromRawFd for TcpStream { TcpStream::from_std(FromRawFd::from_raw_fd(fd)) } } + +impl From for net::TcpStream { + /// Converts a `mio::net::TcpStream` into a `std::net::TcpStream` + fn from(stream: TcpStream) -> Self { + // Safety: This is safe since we are extracting the raw fd from a well-constructed + // mio::net::TcpStream which ensures that we actually pass in a valid file + // descriptor/socket + unsafe { + #[cfg(any(unix, target_os = "hermit"))] + let std_stream = net::TcpStream::from_raw_fd(stream.into_raw_fd()); + + #[cfg(windows)] + let std_stream = net::TcpStream::from_raw_socket(stream.into_raw_socket()); + + std_stream + } + } +} diff --git a/src/net/udp.rs b/src/net/udp.rs index afde3f884..ba4568665 100644 --- a/src/net/udp.rs +++ b/src/net/udp.rs @@ -697,3 +697,21 @@ impl FromRawSocket for UdpSocket { UdpSocket::from_std(FromRawSocket::from_raw_socket(socket)) } } + +impl From for net::UdpSocket { + /// Converts a `mio::net::UdpSocket` into a `std::net::UdpSocket` + fn from(socket: UdpSocket) -> Self { + // Safety: This is safe since we are extracting the raw fd from a well-constructed + // mio::net::UdpSocket which ensures that we actually pass in a valid file + // descriptor/socket + unsafe { + #[cfg(any(unix, target_os = "hermit"))] + let std_sock = net::UdpSocket::from_raw_fd(socket.into_raw_fd()); + + #[cfg(windows)] + let std_sock = net::UdpSocket::from_raw_socket(socket.into_raw_socket()); + + std_sock + } + } +} From 2439e9429d60ae4d07c308bf5a20683356f66563 Mon Sep 17 00:00:00 2001 From: Timo Glane Date: Sun, 24 Mar 2024 12:48:00 +0100 Subject: [PATCH 2/5] Applied MR review suggestions: - Return temporaries instead of bound variables. - Removed unnecessary documentation for impl of std types. --- src/net/tcp/listener.rs | 8 ++------ src/net/tcp/stream.rs | 8 ++------ src/net/udp.rs | 8 ++------ 3 files changed, 6 insertions(+), 18 deletions(-) diff --git a/src/net/tcp/listener.rs b/src/net/tcp/listener.rs index 0e550f731..68fe9cb65 100644 --- a/src/net/tcp/listener.rs +++ b/src/net/tcp/listener.rs @@ -250,19 +250,15 @@ impl FromRawFd for TcpListener { } impl From for net::TcpListener { - /// Converts a `mio::net::TcpListener` into a `std::net::TcpListener` fn from(listener: TcpListener) -> Self { // Safety: This is safe since we are extracting the raw fd from a well-constructed // mio::net::TcpListener which ensures that we actually pass in a valid file // descriptor/socket unsafe { #[cfg(any(unix, target_os = "hermit"))] - let std_listener = net::TcpListener::from_raw_fd(listener.into_raw_fd()); - + net::TcpListener::from_raw_fd(listener.into_raw_fd()) #[cfg(windows)] - let std_listener = net::TcpListener::from_raw_socket(listener.into_raw_socket()); - - std_listener + net::TcpListener::from_raw_socket(listener.into_raw_socket()) } } } diff --git a/src/net/tcp/stream.rs b/src/net/tcp/stream.rs index ad6abd570..8a6ba8978 100644 --- a/src/net/tcp/stream.rs +++ b/src/net/tcp/stream.rs @@ -432,19 +432,15 @@ impl FromRawFd for TcpStream { } impl From for net::TcpStream { - /// Converts a `mio::net::TcpStream` into a `std::net::TcpStream` fn from(stream: TcpStream) -> Self { // Safety: This is safe since we are extracting the raw fd from a well-constructed // mio::net::TcpStream which ensures that we actually pass in a valid file // descriptor/socket unsafe { #[cfg(any(unix, target_os = "hermit"))] - let std_stream = net::TcpStream::from_raw_fd(stream.into_raw_fd()); - + net::TcpStream::from_raw_fd(stream.into_raw_fd()) #[cfg(windows)] - let std_stream = net::TcpStream::from_raw_socket(stream.into_raw_socket()); - - std_stream + net::TcpStream::from_raw_socket(stream.into_raw_socket()) } } } diff --git a/src/net/udp.rs b/src/net/udp.rs index ba4568665..50e0498d9 100644 --- a/src/net/udp.rs +++ b/src/net/udp.rs @@ -699,19 +699,15 @@ impl FromRawSocket for UdpSocket { } impl From for net::UdpSocket { - /// Converts a `mio::net::UdpSocket` into a `std::net::UdpSocket` fn from(socket: UdpSocket) -> Self { // Safety: This is safe since we are extracting the raw fd from a well-constructed // mio::net::UdpSocket which ensures that we actually pass in a valid file // descriptor/socket unsafe { #[cfg(any(unix, target_os = "hermit"))] - let std_sock = net::UdpSocket::from_raw_fd(socket.into_raw_fd()); - + net::UdpSocket::from_raw_fd(socket.into_raw_fd()) #[cfg(windows)] - let std_sock = net::UdpSocket::from_raw_socket(socket.into_raw_socket()); - - std_sock + net::UdpSocket::from_raw_socket(socket.into_raw_socket()) } } } From 1dab44a7edc2154468394c9bbdea6b53291b5c99 Mon Sep 17 00:00:00 2001 From: Timo Glane Date: Sun, 24 Mar 2024 12:59:08 +0100 Subject: [PATCH 3/5] Fixed compilation error --- src/net/tcp/listener.rs | 8 ++++++-- src/net/tcp/stream.rs | 8 ++++++-- src/net/udp.rs | 8 ++++++-- 3 files changed, 18 insertions(+), 6 deletions(-) diff --git a/src/net/tcp/listener.rs b/src/net/tcp/listener.rs index 68fe9cb65..53732d047 100644 --- a/src/net/tcp/listener.rs +++ b/src/net/tcp/listener.rs @@ -256,9 +256,13 @@ impl From for net::TcpListener { // descriptor/socket unsafe { #[cfg(any(unix, target_os = "hermit"))] - net::TcpListener::from_raw_fd(listener.into_raw_fd()) + { + net::TcpListener::from_raw_fd(listener.into_raw_fd()) + } #[cfg(windows)] - net::TcpListener::from_raw_socket(listener.into_raw_socket()) + { + net::TcpListener::from_raw_socket(listener.into_raw_socket()) + } } } } diff --git a/src/net/tcp/stream.rs b/src/net/tcp/stream.rs index 8a6ba8978..49324f189 100644 --- a/src/net/tcp/stream.rs +++ b/src/net/tcp/stream.rs @@ -438,9 +438,13 @@ impl From for net::TcpStream { // descriptor/socket unsafe { #[cfg(any(unix, target_os = "hermit"))] - net::TcpStream::from_raw_fd(stream.into_raw_fd()) + { + net::TcpStream::from_raw_fd(stream.into_raw_fd()) + } #[cfg(windows)] - net::TcpStream::from_raw_socket(stream.into_raw_socket()) + { + net::TcpStream::from_raw_socket(stream.into_raw_socket()) + } } } } diff --git a/src/net/udp.rs b/src/net/udp.rs index 50e0498d9..cb2264c1a 100644 --- a/src/net/udp.rs +++ b/src/net/udp.rs @@ -705,9 +705,13 @@ impl From for net::UdpSocket { // descriptor/socket unsafe { #[cfg(any(unix, target_os = "hermit"))] - net::UdpSocket::from_raw_fd(socket.into_raw_fd()) + { + net::UdpSocket::from_raw_fd(socket.into_raw_fd()) + } #[cfg(windows)] - net::UdpSocket::from_raw_socket(socket.into_raw_socket()) + { + net::UdpSocket::from_raw_socket(socket.into_raw_socket()) + } } } } From e88788b57580a08a2a9728eac2eefe9e64a64531 Mon Sep 17 00:00:00 2001 From: Timo Glane Date: Sun, 24 Mar 2024 13:04:24 +0100 Subject: [PATCH 4/5] Implemented From trait to convert mio unix domain sockets into std unix domain sockets as well --- src/net/uds/datagram.rs | 9 +++++++++ src/net/uds/listener.rs | 9 +++++++++ src/net/uds/stream.rs | 9 +++++++++ 3 files changed, 27 insertions(+) diff --git a/src/net/uds/datagram.rs b/src/net/uds/datagram.rs index e963d6e2f..4d8ff82f3 100644 --- a/src/net/uds/datagram.rs +++ b/src/net/uds/datagram.rs @@ -234,3 +234,12 @@ impl FromRawFd for UnixDatagram { UnixDatagram::from_std(FromRawFd::from_raw_fd(fd)) } } + +impl From for net::UnixDatagram { + fn from(datagram: UnixDatagram) -> Self { + // Safety: This is safe since we are extracting the raw fd from a well-constructed + // mio::net::uds::UnixListener which ensures that we actually pass in a valid file + // descriptor/socket + unsafe { net::UnixDatagram::from_raw_fd(datagram.into_raw_fd()) } + } +} diff --git a/src/net/uds/listener.rs b/src/net/uds/listener.rs index eeffe042e..da1605375 100644 --- a/src/net/uds/listener.rs +++ b/src/net/uds/listener.rs @@ -107,3 +107,12 @@ impl FromRawFd for UnixListener { UnixListener::from_std(FromRawFd::from_raw_fd(fd)) } } + +impl From for net::UnixListener { + fn from(listener: UnixListener) -> Self { + // Safety: This is safe since we are extracting the raw fd from a well-constructed + // mio::net::uds::UnixListener which ensures that we actually pass in a valid file + // descriptor/socket + unsafe { net::UnixListener::from_raw_fd(listener.into_raw_fd()) } + } +} diff --git a/src/net/uds/stream.rs b/src/net/uds/stream.rs index 1c17d84a1..70b5085b3 100644 --- a/src/net/uds/stream.rs +++ b/src/net/uds/stream.rs @@ -252,3 +252,12 @@ impl FromRawFd for UnixStream { UnixStream::from_std(FromRawFd::from_raw_fd(fd)) } } + +impl From for net::UnixStream { + fn from(stream: UnixStream) -> Self { + // Safety: This is safe since we are extracting the raw fd from a well-constructed + // mio::net::uds::UnixStream which ensures that we actually pass in a valid file + // descriptor/socket + unsafe { net::UnixStream::from_raw_fd(stream.into_raw_fd()) } + } +} From c586a623e8acf24e9ddbcae9d291c922215297c8 Mon Sep 17 00:00:00 2001 From: Timo Glane Date: Tue, 26 Mar 2024 11:07:11 +0100 Subject: [PATCH 5/5] Fixed build for WASI target --- src/net/tcp/listener.rs | 2 +- src/net/tcp/stream.rs | 2 +- src/net/udp.rs | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/net/tcp/listener.rs b/src/net/tcp/listener.rs index 53732d047..2ed7ec85e 100644 --- a/src/net/tcp/listener.rs +++ b/src/net/tcp/listener.rs @@ -255,7 +255,7 @@ impl From for net::TcpListener { // mio::net::TcpListener which ensures that we actually pass in a valid file // descriptor/socket unsafe { - #[cfg(any(unix, target_os = "hermit"))] + #[cfg(any(unix, target_os = "hermit", target_os = "wasi"))] { net::TcpListener::from_raw_fd(listener.into_raw_fd()) } diff --git a/src/net/tcp/stream.rs b/src/net/tcp/stream.rs index 49324f189..8c2fba61d 100644 --- a/src/net/tcp/stream.rs +++ b/src/net/tcp/stream.rs @@ -437,7 +437,7 @@ impl From for net::TcpStream { // mio::net::TcpStream which ensures that we actually pass in a valid file // descriptor/socket unsafe { - #[cfg(any(unix, target_os = "hermit"))] + #[cfg(any(unix, target_os = "hermit", target_os = "wasi"))] { net::TcpStream::from_raw_fd(stream.into_raw_fd()) } diff --git a/src/net/udp.rs b/src/net/udp.rs index cb2264c1a..4fa65cf83 100644 --- a/src/net/udp.rs +++ b/src/net/udp.rs @@ -704,7 +704,7 @@ impl From for net::UdpSocket { // mio::net::UdpSocket which ensures that we actually pass in a valid file // descriptor/socket unsafe { - #[cfg(any(unix, target_os = "hermit"))] + #[cfg(any(unix, target_os = "hermit", target_os = "wasi"))] { net::UdpSocket::from_raw_fd(socket.into_raw_fd()) }