shadowsocks_service/local/dns/
config.rs

1//! DNS configurations
2
3#[cfg(unix)]
4use std::{convert::Infallible, path::PathBuf};
5use std::{
6    fmt::{self, Display},
7    net::{IpAddr, SocketAddr},
8    str::FromStr,
9};
10
11/// DNS name server address
12#[derive(Debug, Clone, Eq, PartialEq, Hash)]
13pub enum NameServerAddr {
14    /// IP address
15    SocketAddr(SocketAddr),
16    /// Unix Domain Socket address
17    ///
18    /// Specifically used by Android, which served as a stream protocol based DNS server
19    #[cfg(unix)]
20    UnixSocketAddr(PathBuf),
21}
22
23/// Parse `NameServerAddr` error
24#[cfg(unix)]
25pub type NameServerAddrError = Infallible;
26/// Parse `NameServerAddr` error
27#[cfg(not(unix))]
28pub type NameServerAddrError = <SocketAddr as FromStr>::Err;
29
30impl FromStr for NameServerAddr {
31    type Err = NameServerAddrError;
32
33    fn from_str(s: &str) -> Result<Self, Self::Err> {
34        if let Ok(ip) = s.parse::<IpAddr>() {
35            return Ok(Self::SocketAddr(SocketAddr::new(ip, 53)));
36        }
37
38        match s.parse::<SocketAddr>() {
39            Ok(addr) => Ok(Self::SocketAddr(addr)),
40            #[cfg(unix)]
41            Err(..) => Ok(Self::UnixSocketAddr(PathBuf::from(s))),
42            #[cfg(not(unix))]
43            Err(err) => Err(err),
44        }
45    }
46}
47
48impl Display for NameServerAddr {
49    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
50        match *self {
51            Self::SocketAddr(ref sa) => Display::fmt(sa, f),
52            #[cfg(unix)]
53            Self::UnixSocketAddr(ref p) => write!(f, "{}", p.display()),
54        }
55    }
56}