diff options
author | HimbeerserverDE <himbeerserverde@gmail.com> | 2023-10-11 18:32:23 +0200 |
---|---|---|
committer | HimbeerserverDE <himbeerserverde@gmail.com> | 2023-10-11 18:32:23 +0200 |
commit | 62cca5e07c1625cdebb17ad97c5a4a70e94bdb42 (patch) | |
tree | 8bc5689fe5de47a1579657fdb3b5618fea858e83 /src | |
parent | a605179db915e1e63f0336bf1e220e510c34511d (diff) |
add some amount of rollover handling
should now be able to handle rollovers if running continously and started in era 0
Diffstat (limited to 'src')
-rw-r--r-- | src/main.rs | 20 |
1 files changed, 18 insertions, 2 deletions
diff --git a/src/main.rs b/src/main.rs index 533a7cf..5d06e33 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,3 +1,4 @@ +use std::fs; use std::io; use std::net::{self, IpAddr, SocketAddr}; use std::path::Path; @@ -10,7 +11,7 @@ use thiserror::Error; use trust_dns_resolver::config::{NameServerConfig, Protocol, ResolverConfig, ResolverOpts}; use trust_dns_resolver::Resolver; -const EPOCH_OFFSET: i64 = 2208988800; +const EPOCH_OFFSET: u64 = 2208988800; const NTP_SERVER: &str = "2.pool.ntp.org"; const NTP_PORT: u16 = 123; const DNS_SERVER: &str = "[2620:fe::fe]:53"; @@ -53,15 +54,30 @@ fn main() -> Result<()> { } } +fn last_time_unix() -> Option<u64> { + Some(u64::from_be_bytes( + fs::read("/data/ntp.last_unix").ok()?[..8].try_into().ok()?, + )) +} + fn sync_time(server: &str) -> Result<()> { + let last = last_time_unix().unwrap_or(0); + let dns = DNS_SERVER.parse()?; let server_resolved = SocketAddr::new(resolve_custom_dns(server, dns)?, NTP_PORT); let time = ntp::request(server_resolved)?.transmit_time; - let timespec = TimeSpec::new(time.sec as i64 - EPOCH_OFFSET, 0); + let mut t = time.sec as u64 - EPOCH_OFFSET; + while t < last { + t += 2_u64.pow(32); // NTP era duration. + } + + let timespec = TimeSpec::new(t as i64, 0); nix::time::clock_settime(ClockId::CLOCK_REALTIME, timespec)?; + fs::write("/data/ntp.last_unix", t.to_be_bytes())?; + println!("set system time"); Ok(()) } |