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#[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}