mirror of
https://github.com/rust-lang/cargo.git
synced 2025-10-01 11:30:39 +00:00
Move Windows path test function to test code
This commit is contained in:
parent
d03530f261
commit
e9c7544c19
@ -25,5 +25,8 @@ termcolor = "1.1.2"
|
|||||||
toml_edit = { version = "0.14.3", features = ["serde", "easy", "perf"] }
|
toml_edit = { version = "0.14.3", features = ["serde", "easy", "perf"] }
|
||||||
url = "2.2.2"
|
url = "2.2.2"
|
||||||
|
|
||||||
|
[target.'cfg(windows)'.dependencies]
|
||||||
|
winapi = "0.3"
|
||||||
|
|
||||||
[features]
|
[features]
|
||||||
deny-warnings = []
|
deny-warnings = []
|
||||||
|
@ -287,3 +287,54 @@ pub fn sysroot() -> String {
|
|||||||
let sysroot = String::from_utf8(output.stdout).unwrap();
|
let sysroot = String::from_utf8(output.stdout).unwrap();
|
||||||
sysroot.trim().to_string()
|
sysroot.trim().to_string()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Returns true if names such as aux.* are allowed.
|
||||||
|
///
|
||||||
|
/// Traditionally, Windows did not allow a set of file names (see `is_windows_reserved`
|
||||||
|
/// for a list). More recent versions of Windows have relaxed this restriction. This test
|
||||||
|
/// determines whether we are running in a mode that allows Windows reserved names.
|
||||||
|
#[cfg(windows)]
|
||||||
|
pub fn windows_reserved_names_are_allowed() -> bool {
|
||||||
|
use std::ffi::OsStr;
|
||||||
|
use std::os::windows::ffi::OsStrExt;
|
||||||
|
use std::ptr;
|
||||||
|
use winapi::um::fileapi::GetFullPathNameW;
|
||||||
|
|
||||||
|
let test_file_name: Vec<_> = OsStr::new("aux.rs").encode_wide().collect();
|
||||||
|
|
||||||
|
let buffer_length =
|
||||||
|
unsafe { GetFullPathNameW(test_file_name.as_ptr(), 0, ptr::null_mut(), ptr::null_mut()) };
|
||||||
|
|
||||||
|
if buffer_length == 0 {
|
||||||
|
// This means the call failed, so we'll conservatively assume reserved names are not allowed.
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
let mut buffer = vec![0u16; buffer_length as usize];
|
||||||
|
|
||||||
|
let result = unsafe {
|
||||||
|
GetFullPathNameW(
|
||||||
|
test_file_name.as_ptr(),
|
||||||
|
buffer_length,
|
||||||
|
buffer.as_mut_ptr(),
|
||||||
|
ptr::null_mut(),
|
||||||
|
)
|
||||||
|
};
|
||||||
|
|
||||||
|
if result == 0 {
|
||||||
|
// Once again, conservatively assume reserved names are not allowed if the
|
||||||
|
// GetFullPathNameW call failed.
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Under the old rules, a file name like aux.rs would get converted into \\.\aux, so
|
||||||
|
// we detect this case by checking if the string starts with \\.\
|
||||||
|
//
|
||||||
|
// Otherwise, the filename will be something like C:\Users\Foo\Documents\aux.rs
|
||||||
|
let prefix: Vec<_> = OsStr::new("\\\\.\\").encode_wide().collect();
|
||||||
|
if buffer.starts_with(&prefix) {
|
||||||
|
false
|
||||||
|
} else {
|
||||||
|
true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -97,59 +97,3 @@ pub fn is_windows_reserved_path(path: &Path) -> bool {
|
|||||||
pub fn is_glob_pattern<T: AsRef<str>>(name: T) -> bool {
|
pub fn is_glob_pattern<T: AsRef<str>>(name: T) -> bool {
|
||||||
name.as_ref().contains(&['*', '?', '[', ']'][..])
|
name.as_ref().contains(&['*', '?', '[', ']'][..])
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Returns true if names such as aux.* are allowed.
|
|
||||||
///
|
|
||||||
/// Traditionally, Windows did not allow a set of file names (see `is_windows_reserved`
|
|
||||||
/// for a list). More recent versions of Windows have relaxed this restriction. This test
|
|
||||||
/// determines whether we are running in a mode that allows Windows reserved names.
|
|
||||||
pub fn windows_reserved_names_are_allowed() -> bool {
|
|
||||||
#[cfg(windows)]
|
|
||||||
{
|
|
||||||
use std::ffi::OsStr;
|
|
||||||
use std::os::windows::ffi::OsStrExt;
|
|
||||||
use std::ptr;
|
|
||||||
use winapi::um::fileapi::GetFullPathNameW;
|
|
||||||
|
|
||||||
let test_file_name: Vec<_> = OsStr::new("aux.rs").encode_wide().collect();
|
|
||||||
|
|
||||||
let buffer_length = unsafe {
|
|
||||||
GetFullPathNameW(test_file_name.as_ptr(), 0, ptr::null_mut(), ptr::null_mut())
|
|
||||||
};
|
|
||||||
|
|
||||||
if buffer_length == 0 {
|
|
||||||
// This means the call failed, so we'll conservatively assume reserved names are not allowed.
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
let mut buffer = vec![0u16; buffer_length as usize];
|
|
||||||
|
|
||||||
let result = unsafe {
|
|
||||||
GetFullPathNameW(
|
|
||||||
test_file_name.as_ptr(),
|
|
||||||
buffer_length,
|
|
||||||
buffer.as_mut_ptr(),
|
|
||||||
ptr::null_mut(),
|
|
||||||
)
|
|
||||||
};
|
|
||||||
|
|
||||||
if result == 0 {
|
|
||||||
// Once again, conservatively assume reserved names are not allowed if the
|
|
||||||
// GetFullPathNameW call failed.
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Under the old rules, a file name like aux.rs would get converted into \\.\aux, so
|
|
||||||
// we detect this case by checking if the string starts with \\.\
|
|
||||||
//
|
|
||||||
// Otherwise, the filename will be something like C:\Users\Foo\Documents\aux.rs
|
|
||||||
let prefix: Vec<_> = OsStr::new("\\\\.\\").encode_wide().collect();
|
|
||||||
if buffer.starts_with(&prefix) {
|
|
||||||
false
|
|
||||||
} else {
|
|
||||||
true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#[cfg(not(windows))]
|
|
||||||
true
|
|
||||||
}
|
|
||||||
|
@ -2011,7 +2011,7 @@ src/lib.rs
|
|||||||
fn reserved_windows_name() {
|
fn reserved_windows_name() {
|
||||||
// If we are running on a version of Windows that allows these reserved filenames,
|
// If we are running on a version of Windows that allows these reserved filenames,
|
||||||
// skip this test.
|
// skip this test.
|
||||||
if cargo::util::restricted_names::windows_reserved_names_are_allowed() {
|
if paths::windows_reserved_names_are_allowed() {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user