From 64a8ff46e1e82e085b26b1ee876ba032e81540bc Mon Sep 17 00:00:00 2001 From: Wildan M Date: Fri, 27 Feb 2026 14:27:34 +0700 Subject: [PATCH] Implements utimens for directory --- src/mount/redox/resource.rs | 31 +++++++++++++++++++++++++++++-- 1 file changed, 29 insertions(+), 2 deletions(-) diff --git a/src/mount/redox/resource.rs b/src/mount/redox/resource.rs index 992722f722..182dbd072a 100644 --- a/src/mount/redox/resource.rs +++ b/src/mount/redox/resource.rs @@ -241,8 +241,35 @@ impl Resource for DirResource { Err(Error::new(EBADF)) } - fn utimens(&mut self, _times: &[TimeSpec], _tx: &mut Transaction) -> Result<()> { - Err(Error::new(EBADF)) + fn utimens(&mut self, times: &[TimeSpec], tx: &mut Transaction) -> Result<()> { + let mut node = tx.read_tree(self.node_ptr)?; + + if node.data().uid() == self.uid || self.uid == 0 { + if let &[atime, mtime] = times { + let mut node_changed = false; + + let old_mtime = node.data().mtime(); + let new_mtime = (mtime.tv_sec as u64, mtime.tv_nsec as u32); + if old_mtime != new_mtime { + node.data_mut().set_mtime(new_mtime.0, new_mtime.1); + node_changed = true; + } + + let old_atime = node.data().atime(); + let new_atime = (atime.tv_sec as u64, atime.tv_nsec as u32); + if old_atime != new_atime { + node.data_mut().set_atime(new_atime.0, new_atime.1); + node_changed = true; + } + + if node_changed { + tx.sync_tree(node)?; + } + } + Ok(()) + } else { + Err(Error::new(EPERM)) + } } fn getdents<'buf>(