From 41fb27e0a7107a0b092a6e0b7b01170df70b7258 Mon Sep 17 00:00:00 2001 From: Roy Ivy III Date: Wed, 14 Nov 2018 19:54:15 -0600 Subject: [PATCH] rm: fix dir-type symlink removal on windows --- src/rm/rm.rs | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/src/rm/rm.rs b/src/rm/rm.rs index 27fb6cc3a..8c2fc08ba 100644 --- a/src/rm/rm.rs +++ b/src/rm/rm.rs @@ -163,6 +163,8 @@ fn remove(files: Vec, options: Options) -> bool { Ok(metadata) => { if metadata.is_dir() { handle_dir(file, &options) + } else if is_symlink_dir(&metadata) { + remove_dir(file, &options) } else { remove_file(file, &options) } @@ -305,3 +307,20 @@ fn prompt(msg: &str) -> bool { _ => false, } } + +#[cfg(not(windows))] +fn is_symlink_dir(_metadata: &fs::Metadata) -> bool { + false +} + +#[cfg(windows)] +use std::os::windows::prelude::MetadataExt; + +#[cfg(windows)] +fn is_symlink_dir(metadata: &fs::Metadata) -> bool { + use std::os::raw::c_ulong; + pub type DWORD = c_ulong; + pub const FILE_ATTRIBUTE_DIRECTORY: DWORD = 0x10; + + metadata.file_type().is_symlink() && ((metadata.file_attributes() & FILE_ATTRIBUTE_DIRECTORY) != 0) +}