From fe25b51a6658dffb2288c1b409b1c5ca50322d71 Mon Sep 17 00:00:00 2001 From: Dean Li Date: Wed, 26 May 2021 21:34:02 +0800 Subject: [PATCH] chmod: match GNU error Related to #2260 Signed-off-by: Dean Li --- src/uu/chmod/src/chmod.rs | 4 +++- tests/by-util/test_chmod.rs | 20 ++++++++++++++++++++ 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/src/uu/chmod/src/chmod.rs b/src/uu/chmod/src/chmod.rs index 9dea3c842..c4bf309d6 100644 --- a/src/uu/chmod/src/chmod.rs +++ b/src/uu/chmod/src/chmod.rs @@ -262,8 +262,10 @@ impl Chmoder { ); } return Ok(()); + } else if err.kind() == std::io::ErrorKind::PermissionDenied { + show_error!("'{}': Permission denied", file.display()); } else { - show_error!("{}: '{}'", err, file.display()); + show_error!("'{}': {}", file.display(), err); } return Err(1); } diff --git a/tests/by-util/test_chmod.rs b/tests/by-util/test_chmod.rs index 733722b7c..f20429a6e 100644 --- a/tests/by-util/test_chmod.rs +++ b/tests/by-util/test_chmod.rs @@ -282,6 +282,26 @@ fn test_chmod_reference_file() { run_single_test(&tests[0], at, ucmd); } +#[test] +fn test_permission_denied() { + let scene = TestScenario::new(util_name!()); + let at = &scene.fixtures; + + at.mkdir("d/"); + at.mkdir("d/no-x"); + at.mkdir("d/no-x/y"); + + scene.ucmd().arg("u=rw").arg("d/no-x").succeeds(); + + scene + .ucmd() + .arg("-R") + .arg("o=r") + .arg("d") + .fails() + .stderr_is("chmod: 'd/no-x/y': Permission denied"); +} + #[test] fn test_chmod_recursive() { let _guard = UMASK_MUTEX.lock();