1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
use async_std::{
io,
net::{self, ToSocketAddrs},
};
use futures::{future, Future};
use embedded_nal_async::heapless::String;
#[derive(Debug)]
struct NotFound;
impl embedded_nal_async::Dns for crate::Stack {
type Error = io::Error;
type GetHostByNameFuture<'m> = impl Future<Output = Result<embedded_nal_async::IpAddr, Self::Error>>
where
Self: 'm;
fn get_host_by_name<'m>(
&'m self,
host: &'m str,
addr_type: embedded_nal_async::AddrType,
) -> Self::GetHostByNameFuture<'m> {
async move {
let fake_port = match host.find(':') {
Some(_) => format!("[{}]:1234", host),
None => format!("{}:1234", host),
};
for addr in fake_port.to_socket_addrs().await? {
match addr {
net::SocketAddr::V4(v4) if addr_type != embedded_nal_async::AddrType::IPv6 => {
return Ok(embedded_nal_async::IpAddr::from(v4.ip().octets()));
}
net::SocketAddr::V6(v6) if addr_type != embedded_nal_async::AddrType::IPv4 => {
return Ok(embedded_nal_async::IpAddr::from(v6.ip().octets()));
}
_ => continue,
}
}
Err(io::ErrorKind::NotFound.into())
}
}
type GetHostByAddressFuture<'m> = future::Ready<Result<String<256>, Self::Error>>
where
Self: 'm;
fn get_host_by_address(
&self,
_addr: embedded_nal_async::IpAddr,
) -> Self::GetHostByAddressFuture<'_> {
future::ready(Err(io::ErrorKind::NotFound.into()))
}
}