diff --git a/src/uu/chmod/src/chmod.rs b/src/uu/chmod/src/chmod.rs index 8da715e39..bde2ae773 100644 --- a/src/uu/chmod/src/chmod.rs +++ b/src/uu/chmod/src/chmod.rs @@ -344,14 +344,9 @@ impl Chmoder { } #[cfg(unix)] fn chmod_file(&self, file: &Path) -> UResult<()> { - use uucore::mode::get_umask; + use uucore::{mode::get_umask, perms::get_metadata}; - // Determine metadata based on dereference flag - let metadata = if self.dereference { - file.metadata() // Follow symlinks - } else { - file.symlink_metadata() // Act on the symlink itself - }; + let metadata = get_metadata(file, self.dereference); let fperm = match metadata { Ok(meta) => meta.mode() & 0o7777, diff --git a/src/uucore/src/lib/features/perms.rs b/src/uucore/src/lib/features/perms.rs index dcb797341..214335820 100644 --- a/src/uucore/src/lib/features/perms.rs +++ b/src/uucore/src/lib/features/perms.rs @@ -250,6 +250,14 @@ fn is_root(path: &Path, would_traverse_symlink: bool) -> bool { false } +pub fn get_metadata(file: &Path, follow: bool) -> Result { + if follow { + file.metadata() + } else { + file.symlink_metadata() + } +} + impl ChownExecutor { pub fn exec(&self) -> UResult<()> { let mut ret = 0; @@ -417,11 +425,9 @@ impl ChownExecutor { fn obtain_meta>(&self, path: P, follow: bool) -> Option { let path = path.as_ref(); - let meta = if follow { - path.metadata() - } else { - path.symlink_metadata() - }; + + let meta = get_metadata(path, follow); + match meta { Err(e) => { match self.verbosity.level {