diff --git a/drivers/rtcd/src/main.rs b/drivers/rtcd/src/main.rs index 3e913780..41383ca3 100644 --- a/drivers/rtcd/src/main.rs +++ b/drivers/rtcd/src/main.rs @@ -1,4 +1,5 @@ use anyhow::{Context, Result}; +use std::io::Write; // TODO: Do not use target architecture to distinguish these. #[cfg(any(target_arch = "x86", target_arch = "x86_64"))] @@ -17,7 +18,14 @@ fn main() -> Result<()> { let time_s = self::x86::get_time(); let time_ns = u128::from(time_s) * 1_000_000_000; - std::fs::write("/scheme/sys/update_time_offset", &time_ns.to_ne_bytes()) + // Open the sys scheme resource directly without O_CREAT, since update_time_offset + // is a pre-existing kernel resource. Using std::fs::write (which sets O_CREAT) can + // trigger EEXIST from the kernel's named pipe subsystem. + let mut file = std::fs::OpenOptions::new() + .write(true) + .open("/scheme/sys/update_time_offset") + .context("failed to open time offset")?; + file.write_all(&time_ns.to_ne_bytes()) .context("failed to write to time offset")?; } // TODO: aarch64 is currently handled in the kernel