Rollup merge of #131449 - nickrum:wasip2-net-decouple-fd, r=alexcrichton

Decouple WASIp2 sockets from WasiFd

This is a follow up to #129638, decoupling WASIp2's socket implementation from WASIp1's `WasiFd` as discussed with `@alexcrichton.`

Quite a few trait implementations in `std::os::fd` rely on the fact that there is an additional layer of abstraction between `Socket` and `OwnedFd`. I thus had to add a thin `WasiSocket` wrapper struct that just "forwards" to `OwnedFd`. Alternatively, I could have added a lot of conditional compilation to `std::os::fd`, which feels even worse.

Since `WasiFd::sock_accept` is no longer accessible from `TcpListener` and since WASIp2 has proper support for accepting sockets through `Socket::accept`, the `std::os::wasi::net` module has been removed from WASIp2, which only contains a single `TcpListenerExt` trait with a `sock_accept` method as well as an implementation for `TcpListener`. Let me know if this is an acceptable solution.
This commit is contained in:
Matthias Krüger 2024-10-09 23:03:50 +02:00 committed by GitHub
commit 866869bbbd
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 58 additions and 18 deletions

View File

@ -36,6 +36,8 @@
pub mod ffi; pub mod ffi;
pub mod fs; pub mod fs;
pub mod io; pub mod io;
#[cfg(all(target_os = "wasi", target_env = "p1"))]
pub mod net; pub mod net;
/// A prelude for conveniently writing platform-specific code. /// A prelude for conveniently writing platform-specific code.

View File

@ -2,13 +2,12 @@
use libc::{c_int, c_void, size_t}; use libc::{c_int, c_void, size_t};
use super::fd::WasiFd;
use crate::ffi::CStr; use crate::ffi::CStr;
use crate::io::{self, BorrowedBuf, BorrowedCursor, IoSlice, IoSliceMut}; use crate::io::{self, BorrowedBuf, BorrowedCursor, IoSlice, IoSliceMut};
use crate::net::{Shutdown, SocketAddr}; use crate::net::{Shutdown, SocketAddr};
use crate::os::wasi::io::{AsFd, AsRawFd, BorrowedFd, FromRawFd, IntoRawFd, RawFd}; use crate::os::wasi::io::{AsFd, AsRawFd, BorrowedFd, FromRawFd, IntoRawFd, OwnedFd, RawFd};
use crate::sys::unsupported; use crate::sys::unsupported;
use crate::sys_common::net::{TcpListener, getsockopt, setsockopt, sockaddr_to_addr}; use crate::sys_common::net::{getsockopt, setsockopt, sockaddr_to_addr};
use crate::sys_common::{AsInner, FromInner, IntoInner}; use crate::sys_common::{AsInner, FromInner, IntoInner};
use crate::time::{Duration, Instant}; use crate::time::{Duration, Instant};
use crate::{cmp, mem, str}; use crate::{cmp, mem, str};
@ -71,7 +70,9 @@ pub fn cvt_gai(err: c_int) -> io::Result<()> {
pub fn init() {} pub fn init() {}
pub struct Socket(WasiFd); pub struct WasiSocket(OwnedFd);
pub struct Socket(WasiSocket);
impl Socket { impl Socket {
pub fn new(addr: &SocketAddr, ty: c_int) -> io::Result<Socket> { pub fn new(addr: &SocketAddr, ty: c_int) -> io::Result<Socket> {
@ -327,22 +328,66 @@ pub fn as_raw(&self) -> RawFd {
} }
} }
impl AsInner<WasiFd> for Socket { impl AsInner<OwnedFd> for WasiSocket {
#[inline] #[inline]
fn as_inner(&self) -> &WasiFd { fn as_inner(&self) -> &OwnedFd {
&self.0 &self.0
} }
} }
impl IntoInner<WasiFd> for Socket { impl IntoInner<OwnedFd> for WasiSocket {
fn into_inner(self) -> WasiFd { fn into_inner(self) -> OwnedFd {
self.0 self.0
} }
} }
impl FromInner<WasiFd> for Socket { impl FromInner<OwnedFd> for WasiSocket {
fn from_inner(inner: WasiFd) -> Socket { fn from_inner(owned_fd: OwnedFd) -> Self {
Socket(inner) Self(owned_fd)
}
}
impl AsFd for WasiSocket {
fn as_fd(&self) -> BorrowedFd<'_> {
self.0.as_fd()
}
}
impl AsRawFd for WasiSocket {
#[inline]
fn as_raw_fd(&self) -> RawFd {
self.0.as_raw_fd()
}
}
impl IntoRawFd for WasiSocket {
fn into_raw_fd(self) -> RawFd {
self.0.into_raw_fd()
}
}
impl FromRawFd for WasiSocket {
unsafe fn from_raw_fd(raw_fd: RawFd) -> Self {
unsafe { Self(FromRawFd::from_raw_fd(raw_fd)) }
}
}
impl AsInner<WasiSocket> for Socket {
#[inline]
fn as_inner(&self) -> &WasiSocket {
&self.0
}
}
impl IntoInner<WasiSocket> for Socket {
fn into_inner(self) -> WasiSocket {
self.0
}
}
impl FromInner<WasiSocket> for Socket {
fn from_inner(sock: WasiSocket) -> Socket {
Socket(sock)
} }
} }
@ -370,10 +415,3 @@ unsafe fn from_raw_fd(raw_fd: RawFd) -> Self {
unsafe { Self(FromRawFd::from_raw_fd(raw_fd)) } unsafe { Self(FromRawFd::from_raw_fd(raw_fd)) }
} }
} }
impl AsInner<Socket> for TcpListener {
#[inline]
fn as_inner(&self) -> &Socket {
&self.socket()
}
}