xref: /wasmtime-44.0.1/crates/wasi/src/p2/network.rs (revision 40b1009e)
1 use crate::TrappableError;
2 use crate::p2::bindings::sockets::network::ErrorCode;
3 use crate::sockets::{SocketAddrCheck, SocketAddrUse};
4 use std::net::SocketAddr;
5 
6 pub type SocketResult<T> = Result<T, SocketError>;
7 
8 pub type SocketError = TrappableError<ErrorCode>;
9 
10 impl From<wasmtime::component::ResourceTableError> for SocketError {
from(error: wasmtime::component::ResourceTableError) -> Self11     fn from(error: wasmtime::component::ResourceTableError) -> Self {
12         Self::trap(error)
13     }
14 }
15 
16 impl From<std::io::Error> for SocketError {
from(error: std::io::Error) -> Self17     fn from(error: std::io::Error) -> Self {
18         ErrorCode::from(error).into()
19     }
20 }
21 
22 impl From<rustix::io::Errno> for SocketError {
from(error: rustix::io::Errno) -> Self23     fn from(error: rustix::io::Errno) -> Self {
24         ErrorCode::from(error).into()
25     }
26 }
27 
28 impl From<crate::sockets::util::ErrorCode> for SocketError {
from(error: crate::sockets::util::ErrorCode) -> Self29     fn from(error: crate::sockets::util::ErrorCode) -> Self {
30         ErrorCode::from(error).into()
31     }
32 }
33 
34 impl From<crate::sockets::util::ErrorCode> for ErrorCode {
from(error: crate::sockets::util::ErrorCode) -> Self35     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 
57 pub struct Network {
58     pub(crate) socket_addr_check: SocketAddrCheck,
59     pub(crate) allow_ip_name_lookup: bool,
60 }
61 
62 impl Network {
check_socket_addr( &self, addr: SocketAddr, reason: SocketAddrUse, ) -> std::io::Result<()>63     pub 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 }
71