std_embedded_nal/
dns.rs

1use core::net::IpAddr;
2use embedded_nal::{nb, AddrType, Dns};
3use std::error;
4use std::fmt::{self, Display, Formatter};
5use std::io::{Error, ErrorKind};
6use std::net::{SocketAddr, ToSocketAddrs};
7
8/// An std::io::Error compatible error type constructable when to_socket_addrs comes up empty
9/// (because it does not produce an error of its own)
10#[derive(Debug)]
11struct NotFound;
12
13impl Display for NotFound {
14    fn fmt(&self, f: &mut Formatter) -> fmt::Result {
15        write!(f, "Not found")
16    }
17}
18
19impl error::Error for NotFound {}
20
21impl Dns for crate::Stack {
22    type Error = Error;
23
24    fn get_host_by_name(
25        &mut self,
26        hostname: &str,
27        addr_type: AddrType,
28    ) -> Result<IpAddr, nb::Error<Error>> {
29        let with_fake_port = if hostname.find(':').is_some() {
30            format!("[{}]:1234", hostname)
31        } else {
32            format!("{}:1234", hostname)
33        };
34
35        let accept_v4 = addr_type != AddrType::IPv6;
36        let accept_v6 = addr_type != AddrType::IPv4;
37
38        for addr in with_fake_port.to_socket_addrs()? {
39            match addr {
40                SocketAddr::V4(v) if accept_v4 => {
41                    return Ok(v.ip().octets().into());
42                }
43                SocketAddr::V6(v) if accept_v6 => {
44                    return Ok(v.ip().octets().into());
45                }
46                _ => continue,
47            }
48        }
49
50        Err(nb::Error::Other(Error::new(ErrorKind::NotFound, NotFound)))
51    }
52
53    fn get_host_by_address(
54        &mut self,
55        _addr: IpAddr,
56        _result: &mut [u8],
57    ) -> Result<usize, embedded_nal::nb::Error<Self::Error>> {
58        Err(Error::new(ErrorKind::NotFound, NotFound).into())
59    }
60}