Skip to content

Commit c2641e5

Browse files
committed
Update default DNS resolver to load system configuration cross-platform
- Replace ResolverConfig::default() with manual loading of system DNS servers - On Unix: Parse /etc/resolv.conf to get nameservers - On Windows: Use ipconfig crate to retrieve DNS servers from adapters - Add fallback to Google DNS if no system nameservers found - Add comments explaining the cross-platform logic - Suppress false positive unused import warnings Fixes issue where default resolver didn't use system's DNS server on some platforms.
1 parent 4f46658 commit c2641e5

File tree

1 file changed

+52
-1
lines changed

1 file changed

+52
-1
lines changed

src/main.rs

Lines changed: 52 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,12 @@ use hickory_resolver::config::{ResolverConfig, ResolverOpts, NameServerConfig, P
2727
use hickory_resolver::error::ResolveErrorKind;
2828

2929
use std::collections::HashSet;
30+
use std::fs;
31+
#[allow(unused_imports)]
32+
use std::net::{IpAddr, SocketAddr};
33+
34+
// Windows-specific import for retrieving system DNS servers via ipconfig
35+
#[cfg(windows)] use ipconfig;
3036

3137
mod colours;
3238
mod hints;
@@ -159,11 +165,56 @@ async fn run(Options { requests, format, verbose }: Options) -> i32 {
159165
}
160166
}
161167

168+
// Load DNS resolver configuration: use system defaults if no custom nameservers provided
162169
let config = if requests.inputs.nameservers.is_empty() {
163170
match requests.inputs.transport_type {
164171
Some(TransportType::TLS) => ResolverConfig::cloudflare_tls(),
165172
Some(TransportType::HTTPS) => ResolverConfig::google_https(),
166-
_ => ResolverConfig::default(),
173+
_ => {
174+
// Cross-platform loading of system DNS servers for UDP/TCP transport
175+
let nameservers: Vec<IpAddr> = if cfg!(target_os = "windows") {
176+
#[cfg(windows)]
177+
{
178+
// On Windows, use ipconfig to retrieve DNS servers from network adapters
179+
ipconfig::get_adapters()
180+
.unwrap_or_default()
181+
.into_iter()
182+
.flat_map(|adapter| adapter.dns_servers)
183+
.collect()
184+
}
185+
#[cfg(not(windows))]
186+
{
187+
vec![]
188+
}
189+
} else {
190+
// On Unix/Linux, parse /etc/resolv.conf for DNS server entries
191+
match fs::read_to_string("/etc/resolv.conf") {
192+
Ok(content) => {
193+
content.lines()
194+
.filter_map(|line| {
195+
let line = line.trim();
196+
line.strip_prefix("nameserver ")?
197+
.trim()
198+
.parse::<IpAddr>()
199+
.ok()
200+
})
201+
.collect()
202+
}
203+
Err(_) => vec![],
204+
}
205+
};
206+
let mut config = ResolverConfig::new();
207+
for ns in nameservers {
208+
let socket_addr = SocketAddr::new(ns, 53);
209+
let ns_config = NameServerConfig::new(socket_addr, Protocol::Udp);
210+
config.add_name_server(ns_config);
211+
}
212+
if config.name_servers().is_empty() {
213+
ResolverConfig::google()
214+
} else {
215+
config
216+
}
217+
}
167218
}
168219
} else {
169220
let mut config = ResolverConfig::new();

0 commit comments

Comments
 (0)