wasmtime_wasi/p2/
network.rs

1use crate::TrappableError;
2use crate::p2::bindings::sockets::network::ErrorCode;
3use crate::sockets::{SocketAddrCheck, SocketAddrUse};
4use std::net::SocketAddr;
5
6pub type SocketResult<T> = Result<T, SocketError>;
7
8pub type SocketError = TrappableError<ErrorCode>;
9
10impl From<wasmtime::component::ResourceTableError> for SocketError {
11    fn from(error: wasmtime::component::ResourceTableError) -> Self {
12        Self::trap(error)
13    }
14}
15
16impl From<std::io::Error> for SocketError {
17    fn from(error: std::io::Error) -> Self {
18        ErrorCode::from(error).into()
19    }
20}
21
22impl From<rustix::io::Errno> for SocketError {
23    fn from(error: rustix::io::Errno) -> Self {
24        ErrorCode::from(error).into()
25    }
26}
27
28impl From<crate::sockets::util::ErrorCode> for SocketError {
29    fn from(error: crate::sockets::util::ErrorCode) -> Self {
30        ErrorCode::from(error).into()
31    }
32}
33
34impl From<crate::sockets::util::ErrorCode> for ErrorCode {
35    fn from(error: crate::sockets::util::ErrorCode) -> Self {
36        match error {
37            crate::sockets::util::ErrorCode::Unknown => Self::Unknown,
38            crate::sockets::util::ErrorCode::AccessDenied => Self::AccessDenied,
39            crate::sockets::util::ErrorCode::NotSupported => Self::NotSupported,
40            crate::sockets::util::ErrorCode::InvalidArgument => Self::InvalidArgument,
41            crate::sockets::util::ErrorCode::OutOfMemory => Self::OutOfMemory,
42            crate::sockets::util::ErrorCode::Timeout => Self::Timeout,
43            crate::sockets::util::ErrorCode::InvalidState => Self::InvalidState,
44            crate::sockets::util::ErrorCode::AddressNotBindable => Self::AddressNotBindable,
45            crate::sockets::util::ErrorCode::AddressInUse => Self::AddressInUse,
46            crate::sockets::util::ErrorCode::RemoteUnreachable => Self::RemoteUnreachable,
47            crate::sockets::util::ErrorCode::ConnectionRefused => Self::ConnectionRefused,
48            crate::sockets::util::ErrorCode::ConnectionReset => Self::ConnectionReset,
49            crate::sockets::util::ErrorCode::ConnectionAborted => Self::ConnectionAborted,
50            crate::sockets::util::ErrorCode::DatagramTooLarge => Self::DatagramTooLarge,
51            crate::sockets::util::ErrorCode::NotInProgress => Self::NotInProgress,
52            crate::sockets::util::ErrorCode::ConcurrencyConflict => Self::ConcurrencyConflict,
53        }
54    }
55}
56
57pub struct Network {
58    pub(crate) socket_addr_check: SocketAddrCheck,
59    pub(crate) allow_ip_name_lookup: bool,
60}
61
62impl Network {
63    pub(crate) async fn check_socket_addr(
64        &self,
65        addr: SocketAddr,
66        reason: SocketAddrUse,
67    ) -> std::io::Result<()> {
68        self.socket_addr_check.check(addr, reason).await
69    }
70}