Path: blob/main/crates/wasi/src/p3/sockets/conv.rs
1692 views
use crate::p3::bindings::sockets::types;1use crate::p3::sockets::SocketError;2use crate::sockets::SocketAddressFamily;3use crate::sockets::util::{from_ipv4_addr, from_ipv6_addr, to_ipv4_addr, to_ipv6_addr};4use core::net::{IpAddr, SocketAddr, SocketAddrV4, SocketAddrV6};5use rustix::io::Errno;6use std::net::ToSocketAddrs;7use tracing::debug;89impl From<IpAddr> for types::IpAddress {10fn from(addr: IpAddr) -> Self {11match addr {12IpAddr::V4(v4) => Self::Ipv4(from_ipv4_addr(v4)),13IpAddr::V6(v6) => Self::Ipv6(from_ipv6_addr(v6)),14}15}16}1718impl From<types::IpAddress> for IpAddr {19fn from(addr: types::IpAddress) -> Self {20match addr {21types::IpAddress::Ipv4(v4) => Self::V4(to_ipv4_addr(v4)),22types::IpAddress::Ipv6(v6) => Self::V6(to_ipv6_addr(v6)),23}24}25}2627impl From<types::IpSocketAddress> for SocketAddr {28fn from(addr: types::IpSocketAddress) -> Self {29match addr {30types::IpSocketAddress::Ipv4(ipv4) => Self::V4(ipv4.into()),31types::IpSocketAddress::Ipv6(ipv6) => Self::V6(ipv6.into()),32}33}34}3536impl From<SocketAddr> for types::IpSocketAddress {37fn from(addr: SocketAddr) -> Self {38match addr {39SocketAddr::V4(v4) => Self::Ipv4(v4.into()),40SocketAddr::V6(v6) => Self::Ipv6(v6.into()),41}42}43}4445impl From<types::Ipv4SocketAddress> for SocketAddrV4 {46fn from(addr: types::Ipv4SocketAddress) -> Self {47Self::new(to_ipv4_addr(addr.address), addr.port)48}49}5051impl From<SocketAddrV4> for types::Ipv4SocketAddress {52fn from(addr: SocketAddrV4) -> Self {53Self {54address: from_ipv4_addr(*addr.ip()),55port: addr.port(),56}57}58}5960impl From<types::Ipv6SocketAddress> for SocketAddrV6 {61fn from(addr: types::Ipv6SocketAddress) -> Self {62Self::new(63to_ipv6_addr(addr.address),64addr.port,65addr.flow_info,66addr.scope_id,67)68}69}7071impl From<SocketAddrV6> for types::Ipv6SocketAddress {72fn from(addr: SocketAddrV6) -> Self {73Self {74address: from_ipv6_addr(*addr.ip()),75port: addr.port(),76flow_info: addr.flowinfo(),77scope_id: addr.scope_id(),78}79}80}8182impl ToSocketAddrs for types::IpSocketAddress {83type Iter = <SocketAddr as ToSocketAddrs>::Iter;8485fn to_socket_addrs(&self) -> std::io::Result<Self::Iter> {86SocketAddr::from(*self).to_socket_addrs()87}88}8990impl ToSocketAddrs for types::Ipv4SocketAddress {91type Iter = <SocketAddrV4 as ToSocketAddrs>::Iter;9293fn to_socket_addrs(&self) -> std::io::Result<Self::Iter> {94SocketAddrV4::from(*self).to_socket_addrs()95}96}9798impl ToSocketAddrs for types::Ipv6SocketAddress {99type Iter = <SocketAddrV6 as ToSocketAddrs>::Iter;100101fn to_socket_addrs(&self) -> std::io::Result<Self::Iter> {102SocketAddrV6::from(*self).to_socket_addrs()103}104}105106impl From<types::IpAddressFamily> for cap_net_ext::AddressFamily {107fn from(family: types::IpAddressFamily) -> Self {108match family {109types::IpAddressFamily::Ipv4 => Self::Ipv4,110types::IpAddressFamily::Ipv6 => Self::Ipv6,111}112}113}114115impl From<cap_net_ext::AddressFamily> for types::IpAddressFamily {116fn from(family: cap_net_ext::AddressFamily) -> Self {117match family {118cap_net_ext::AddressFamily::Ipv4 => Self::Ipv4,119cap_net_ext::AddressFamily::Ipv6 => Self::Ipv6,120}121}122}123124impl From<SocketAddressFamily> for types::IpAddressFamily {125fn from(family: SocketAddressFamily) -> Self {126match family {127SocketAddressFamily::Ipv4 => Self::Ipv4,128SocketAddressFamily::Ipv6 => Self::Ipv6,129}130}131}132133impl From<types::IpAddressFamily> for SocketAddressFamily {134fn from(family: types::IpAddressFamily) -> Self {135match family {136types::IpAddressFamily::Ipv4 => Self::Ipv4,137types::IpAddressFamily::Ipv6 => Self::Ipv6,138}139}140}141142impl From<std::io::Error> for types::ErrorCode {143fn from(value: std::io::Error) -> Self {144(&value).into()145}146}147148impl From<&std::io::Error> for types::ErrorCode {149fn from(value: &std::io::Error) -> Self {150// Attempt the more detailed native error code first:151if let Some(errno) = Errno::from_io_error(value) {152return errno.into();153}154155match value.kind() {156std::io::ErrorKind::AddrInUse => Self::AddressInUse,157std::io::ErrorKind::AddrNotAvailable => Self::AddressNotBindable,158std::io::ErrorKind::ConnectionAborted => Self::ConnectionAborted,159std::io::ErrorKind::ConnectionRefused => Self::ConnectionRefused,160std::io::ErrorKind::ConnectionReset => Self::ConnectionReset,161std::io::ErrorKind::InvalidInput => Self::InvalidArgument,162std::io::ErrorKind::NotConnected => Self::InvalidState,163std::io::ErrorKind::OutOfMemory => Self::OutOfMemory,164std::io::ErrorKind::PermissionDenied => Self::AccessDenied,165std::io::ErrorKind::TimedOut => Self::Timeout,166std::io::ErrorKind::Unsupported => Self::NotSupported,167_ => {168debug!("unknown I/O error: {value}");169Self::Unknown170}171}172}173}174175impl From<Errno> for types::ErrorCode {176fn from(value: Errno) -> Self {177(&value).into()178}179}180181impl From<&Errno> for types::ErrorCode {182fn from(value: &Errno) -> Self {183match *value {184#[cfg(not(windows))]185Errno::PERM => Self::AccessDenied,186Errno::ACCESS => Self::AccessDenied,187Errno::ADDRINUSE => Self::AddressInUse,188Errno::ADDRNOTAVAIL => Self::AddressNotBindable,189Errno::TIMEDOUT => Self::Timeout,190Errno::CONNREFUSED => Self::ConnectionRefused,191Errno::CONNRESET => Self::ConnectionReset,192Errno::CONNABORTED => Self::ConnectionAborted,193Errno::INVAL => Self::InvalidArgument,194Errno::HOSTUNREACH => Self::RemoteUnreachable,195Errno::HOSTDOWN => Self::RemoteUnreachable,196Errno::NETDOWN => Self::RemoteUnreachable,197Errno::NETUNREACH => Self::RemoteUnreachable,198#[cfg(target_os = "linux")]199Errno::NONET => Self::RemoteUnreachable,200Errno::ISCONN => Self::InvalidState,201Errno::NOTCONN => Self::InvalidState,202Errno::DESTADDRREQ => Self::InvalidState,203Errno::MSGSIZE => Self::DatagramTooLarge,204#[cfg(not(windows))]205Errno::NOMEM => Self::OutOfMemory,206Errno::NOBUFS => Self::OutOfMemory,207Errno::OPNOTSUPP => Self::NotSupported,208Errno::NOPROTOOPT => Self::NotSupported,209Errno::PFNOSUPPORT => Self::NotSupported,210Errno::PROTONOSUPPORT => Self::NotSupported,211Errno::PROTOTYPE => Self::NotSupported,212Errno::SOCKTNOSUPPORT => Self::NotSupported,213Errno::AFNOSUPPORT => Self::NotSupported,214215// FYI, EINPROGRESS should have already been handled by connect.216_ => {217debug!("unknown I/O error: {value}");218Self::Unknown219}220}221}222}223224impl From<crate::sockets::util::ErrorCode> for types::ErrorCode {225fn from(code: crate::sockets::util::ErrorCode) -> Self {226match code {227crate::sockets::util::ErrorCode::Unknown => Self::Unknown,228crate::sockets::util::ErrorCode::AccessDenied => Self::AccessDenied,229crate::sockets::util::ErrorCode::NotSupported => Self::NotSupported,230crate::sockets::util::ErrorCode::InvalidArgument => Self::InvalidArgument,231crate::sockets::util::ErrorCode::OutOfMemory => Self::OutOfMemory,232crate::sockets::util::ErrorCode::Timeout => Self::Timeout,233crate::sockets::util::ErrorCode::InvalidState => Self::InvalidState,234crate::sockets::util::ErrorCode::AddressNotBindable => Self::AddressNotBindable,235crate::sockets::util::ErrorCode::AddressInUse => Self::AddressInUse,236crate::sockets::util::ErrorCode::RemoteUnreachable => Self::RemoteUnreachable,237crate::sockets::util::ErrorCode::ConnectionRefused => Self::ConnectionRefused,238crate::sockets::util::ErrorCode::ConnectionReset => Self::ConnectionReset,239crate::sockets::util::ErrorCode::ConnectionAborted => Self::ConnectionAborted,240crate::sockets::util::ErrorCode::DatagramTooLarge => Self::DatagramTooLarge,241crate::sockets::util::ErrorCode::NotInProgress => Self::InvalidState,242crate::sockets::util::ErrorCode::ConcurrencyConflict => Self::InvalidState,243}244}245}246247impl From<crate::sockets::util::ErrorCode> for SocketError {248fn from(code: crate::sockets::util::ErrorCode) -> Self {249SocketError::from(types::ErrorCode::from(code))250}251}252253254