diff options
author | HimbeerserverDE <himbeerserverde@gmail.com> | 2023-08-13 23:54:11 +0200 |
---|---|---|
committer | HimbeerserverDE <himbeerserverde@gmail.com> | 2023-08-13 23:54:11 +0200 |
commit | f994176105823d0129ae0b4175b1d4c456f17c47 (patch) | |
tree | c6ff71ba15650531c8509bfa620fcd53b7bdefc6 | |
parent | 2f4f15a8f7501021af74bcf97e73350502cba4fd (diff) |
retry dns resolution multiple times
-rw-r--r-- | src/main.rs | 23 |
1 files changed, 22 insertions, 1 deletions
diff --git a/src/main.rs b/src/main.rs index f597b04..3c1510f 100644 --- a/src/main.rs +++ b/src/main.rs @@ -16,6 +16,8 @@ use trust_dns_resolver::Resolver; const ADDR4_AFTR: Ipv4Addr = Ipv4Addr::new(192, 0, 0, 1); const ADDR4_B4: Ipv4Addr = Ipv4Addr::new(192, 0, 0, 2); +const MAX_ATTEMPTS: usize = 3; + fn main() -> Result<()> { println!("wait for up ppp0"); link::wait_up("ppp0".into())?; @@ -32,7 +34,7 @@ fn main() -> Result<()> { if let Some(ref aftr) = pdconfig.aftr { let local = local_address(&pdconfig)?; - let remote = resolve6(&pdconfig, aftr)?; + let remote = multitry_resolve6(&pdconfig, aftr)?; let _tnl = IpIp6::new("dslite0", "ppp0", local, remote)?; configure_dslite(); @@ -99,3 +101,22 @@ fn resolve6(pdconfig: &PdConfig, fqdn: &str) -> Result<Ipv6Addr> { let addr = response.iter().next().ok_or(Error::NoDnsRecord)?; Ok(*addr) } + +fn multitry_resolve6(pdconfig: &PdConfig, fqdn: &str) -> Result<Ipv6Addr> { + for i in 0..MAX_ATTEMPTS { + match resolve6(pdconfig, fqdn) { + Ok(v) => return Ok(v), + Err(e) => { + if i >= MAX_ATTEMPTS - 1 { + return Err(e); + } else { + println!("{}", e) + } + } + } + + thread::sleep(Duration::from_secs(8)); + } + + unreachable!() +} |