Explorar o código

Only parse /etc/resolv.conf on Unix

This commit extracts the "find system nameservers" code into its own function, which is made OS-dependent so it only runs on Unix.
Benjamin Sago %!s(int64=4) %!d(string=hai) anos
pai
achega
4607bcf9bd
Modificáronse 1 ficheiros con 27 adicións e 21 borrados
  1. 27 21
      src/resolve.rs

+ 27 - 21
src/resolve.rs

@@ -19,37 +19,43 @@ pub enum Resolver {
 
 pub type Nameserver = String;
 
-
 impl Resolver {
     pub fn lookup(self) -> io::Result<Option<Nameserver>> {
         match self {
-            Self::Specified(ns) => {
-                Ok(Some(ns))
-            }
+            Self::Specified(ns)  => Ok(Some(ns)),
+            Self::SystemDefault  => system_nameservers(),
+        }
+    }
+}
 
-            Self::SystemDefault => {
-                use std::io::{BufRead, BufReader};
-                use std::fs::File;
 
-                let f = File::open("/etc/resolv.conf")?;
-                let reader = BufReader::new(f);
+#[cfg(unix)]
+fn system_nameservers() -> io::Result<Option<Nameserver>> {
+    use std::io::{BufRead, BufReader};
+    use std::fs::File;
 
-                let mut nameservers = Vec::new();
-                for line in reader.lines() {
-                    let line = line?;
+    let f = File::open("/etc/resolv.conf")?;
+    let reader = BufReader::new(f);
 
-                    if let Some(nameserver_str) = line.strip_prefix("nameserver ") {
-                        let ip: Result<std::net::Ipv4Addr, _> = nameserver_str.parse();
+    let mut nameservers = Vec::new();
+    for line in reader.lines() {
+        let line = line?;
 
-                        match ip {
-                            Ok(_ip) => nameservers.push(nameserver_str.into()),
-                            Err(e)  => warn!("Failed to parse nameserver line {:?}: {}", line, e),
-                        }
-                    }
-                }
+        if let Some(nameserver_str) = line.strip_prefix("nameserver ") {
+            let ip: Result<std::net::Ipv4Addr, _> = nameserver_str.parse();
 
-                Ok(nameservers.first().cloned())
+            match ip {
+                Ok(_ip) => nameservers.push(nameserver_str.into()),
+                Err(e)  => warn!("Failed to parse nameserver line {:?}: {}", line, e),
             }
         }
     }
+
+    Ok(nameservers.first().cloned())
+}
+
+#[cfg(not(unix))]
+fn system_nameservers() -> io::Result<Option<Nameserver>> {
+    warn!("Unable to fetch default nameservers on this platform.");
+    Ok(None)
 }