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