Skip to main content

fping/
dns.rs

1use std::net::{IpAddr, ToSocketAddrs};
2
3pub fn resolve(name: &str, only_ipv4: bool, only_ipv6: bool) -> Option<IpAddr> {
4
5  if let Ok(ip) = name.parse::<IpAddr>() {
6    if only_ipv4 && ip.is_ipv6() {
7      return None;
8    }
9    if only_ipv6 && ip.is_ipv4() {
10      return None;
11    }
12    return Some(ip);
13  }
14
15  let addrs: Vec<IpAddr> = match (name, 0u16).to_socket_addrs() {
16    Ok(iter) => iter.map(|sa| sa.ip()).collect(),
17    Err(_) => return None,
18  };
19
20  if only_ipv6 {
21    addrs.iter().find(|a| a.is_ipv6()).copied()
22  } else if only_ipv4 {
23    addrs.iter().find(|a| a.is_ipv4()).copied() 
24  } else {
25    addrs.iter().find(|a| a.is_ipv4()).copied()
26      .or_else(|| addrs.first().copied())
27  }
28}