Skip to content

Commit

Permalink
fix(ext/node): stat.mode on windows (#24434)
Browse files Browse the repository at this point in the history
  • Loading branch information
littledivy committed Jul 18, 2024
1 parent f122845 commit bf9c08b
Show file tree
Hide file tree
Showing 5 changed files with 63 additions and 5 deletions.
5 changes: 3 additions & 2 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -211,7 +211,7 @@ nix = "=0.26.2"
# windows deps
junction = "=0.2.0"
winapi = "=0.3.9"
windows-sys = { version = "0.48.0", features = ["Win32_Foundation", "Win32_Media", "Win32_Storage_FileSystem"] }
windows-sys = { version = "0.52.0", features = ["Win32_Foundation", "Win32_Media", "Win32_Storage_FileSystem", "Win32_System_IO", "Win32_System_WindowsProgramming", "Wdk", "Wdk_System", "Wdk_System_SystemInformation", "Win32_System_Pipes", "Wdk_Storage_FileSystem", "Win32_System_Registry"] }
winres = "=0.1.12"

# NB: the `bench` and `release` profiles must remain EXACTLY the same.
Expand Down
1 change: 1 addition & 0 deletions ext/fs/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -34,4 +34,5 @@ nix.workspace = true

[target.'cfg(windows)'.dependencies]
winapi = { workspace = true, features = ["winbase"] }
windows-sys.workspace = true
junction.workspace = true
56 changes: 56 additions & 0 deletions ext/fs/std_fs.rs
Original file line number Diff line number Diff line change
Expand Up @@ -821,6 +821,29 @@ fn stat_extra(
Ok(info.dwVolumeSerialNumber as u64)
}

use windows_sys::Wdk::Storage::FileSystem::FILE_ALL_INFORMATION;

unsafe fn query_file_information(
handle: winapi::shared::ntdef::HANDLE,
) -> std::io::Result<FILE_ALL_INFORMATION> {
use windows_sys::Wdk::Storage::FileSystem::NtQueryInformationFile;

let mut info = std::mem::MaybeUninit::<FILE_ALL_INFORMATION>::zeroed();
let status = NtQueryInformationFile(
handle as _,
std::ptr::null_mut(),
info.as_mut_ptr() as *mut _,
std::mem::size_of::<FILE_ALL_INFORMATION>() as _,
18, /* FileAllInformation */
);

if status < 0 {
return Err(std::io::Error::last_os_error());
}

Ok(info.assume_init())
}

// SAFETY: winapi calls
unsafe {
let mut path: Vec<_> = path.as_os_str().encode_wide().collect();
Expand All @@ -842,6 +865,39 @@ fn stat_extra(
CloseHandle(file_handle);
fsstat.dev = result?;

if let Ok(file_info) = query_file_information(file_handle) {
if file_info.BasicInformation.FileAttributes
& winapi::um::winnt::FILE_ATTRIBUTE_REPARSE_POINT
!= 0
{
fsstat.is_symlink = true;
}

if file_info.BasicInformation.FileAttributes
& winapi::um::winnt::FILE_ATTRIBUTE_DIRECTORY
!= 0
{
fsstat.mode |= libc::S_IFDIR as u32;
fsstat.size = 0;
} else {
fsstat.mode |= libc::S_IFREG as u32;
fsstat.size = file_info.StandardInformation.EndOfFile as u64;
}

if file_info.BasicInformation.FileAttributes
& winapi::um::winnt::FILE_ATTRIBUTE_READONLY
!= 0
{
fsstat.mode |=
(libc::S_IREAD | (libc::S_IREAD >> 3) | (libc::S_IREAD >> 6)) as u32;
} else {
fsstat.mode |= ((libc::S_IREAD | libc::S_IWRITE)
| ((libc::S_IREAD | libc::S_IWRITE) >> 3)
| ((libc::S_IREAD | libc::S_IWRITE) >> 6))
as u32;
}
}

Ok(())
}
}
Expand Down
4 changes: 2 additions & 2 deletions ext/node/ops/os/cpus.rs
Original file line number Diff line number Diff line change
Expand Up @@ -122,8 +122,8 @@ pub fn cpu_info() -> Option<Vec<CpuInfo>> {

#[cfg(target_os = "windows")]
pub fn cpu_info() -> Option<Vec<CpuInfo>> {
use windows_sys::Win32::System::WindowsProgramming::NtQuerySystemInformation;
use windows_sys::Win32::System::WindowsProgramming::SystemProcessorPerformanceInformation;
use windows_sys::Wdk::System::SystemInformation::NtQuerySystemInformation;
use windows_sys::Wdk::System::SystemInformation::SystemProcessorPerformanceInformation;
use windows_sys::Win32::System::WindowsProgramming::SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION;

use std::os::windows::ffi::OsStrExt;
Expand Down

0 comments on commit bf9c08b

Please sign in to comment.