diff --git a/src/uu/rmdir/src/rmdir.rs b/src/uu/rmdir/src/rmdir.rs index 7a7e8fc9b..bebb2844b 100644 --- a/src/uu/rmdir/src/rmdir.rs +++ b/src/uu/rmdir/src/rmdir.rs @@ -20,6 +20,11 @@ static OPT_VERBOSE: &str = "verbose"; static ARG_DIRS: &str = "dirs"; +#[cfg(unix)] +static ENOTDIR: i32 = 20; +#[cfg(windows)] +static ENOTDIR: i32 = 267; + fn get_usage() -> String { format!("{0} [OPTION]... DIRECTORY...", executable!()) } @@ -105,6 +110,10 @@ fn remove(dirs: Vec, ignore: bool, parents: bool, verbose: bool) -> Resu fn remove_dir(path: &Path, ignore: bool, verbose: bool) -> Result<(), i32> { let mut read_dir = match fs::read_dir(path) { Ok(m) => m, + Err(e) if e.raw_os_error() == Some(ENOTDIR) => { + show_error!("failed to remove '{}': Not a directory", path.display()); + return Err(1); + } Err(e) => { show_error!("reading directory '{}': {}", path.display(), e); return Err(1); diff --git a/tests/by-util/test_rmdir.rs b/tests/by-util/test_rmdir.rs index eef2d50f5..4b74b2522 100644 --- a/tests/by-util/test_rmdir.rs +++ b/tests/by-util/test_rmdir.rs @@ -108,3 +108,19 @@ fn test_rmdir_ignore_nonempty_directory_with_parents() { assert!(at.dir_exists(dir)); } + +#[test] +fn test_rmdir_remove_symlink_match_gnu_error() { + let (at, mut ucmd) = at_and_ucmd!(); + + let file = "file"; + let fl = "fl"; + at.touch(file); + assert!(at.file_exists(file)); + at.symlink_file(file, fl); + assert!(at.file_exists(fl)); + + ucmd.arg("fl/") + .fails() + .stderr_is("rmdir: failed to remove 'fl/': Not a directory"); +}