Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'helix-stdx/src/faccess.rs')
-rw-r--r--helix-stdx/src/faccess.rs27
1 files changed, 24 insertions, 3 deletions
diff --git a/helix-stdx/src/faccess.rs b/helix-stdx/src/faccess.rs
index 0270c1f8..c69571b6 100644
--- a/helix-stdx/src/faccess.rs
+++ b/helix-stdx/src/faccess.rs
@@ -74,6 +74,11 @@ mod imp {
Ok(())
}
+
+ pub fn hardlink_count(p: &Path) -> std::io::Result<u64> {
+ let metadata = p.metadata()?;
+ Ok(metadata.nlink())
+ }
}
// Licensed under MIT from faccess except for `chown`, `copy_metadata` and `is_acl_inherited`
@@ -94,8 +99,8 @@ mod imp {
SID_IDENTIFIER_AUTHORITY, TOKEN_DUPLICATE, TOKEN_QUERY,
};
use windows_sys::Win32::Storage::FileSystem::{
- FILE_ACCESS_RIGHTS, FILE_ALL_ACCESS, FILE_GENERIC_EXECUTE, FILE_GENERIC_READ,
- FILE_GENERIC_WRITE,
+ GetFileInformationByHandle, BY_HANDLE_FILE_INFORMATION, FILE_ACCESS_RIGHTS,
+ FILE_ALL_ACCESS, FILE_GENERIC_EXECUTE, FILE_GENERIC_READ, FILE_GENERIC_WRITE,
};
use windows_sys::Win32::System::Threading::{GetCurrentThread, OpenThreadToken};
@@ -103,7 +108,7 @@ mod imp {
use std::ffi::c_void;
- use std::os::windows::{ffi::OsStrExt, fs::OpenOptionsExt};
+ use std::os::windows::{ffi::OsStrExt, fs::OpenOptionsExt, io::AsRawHandle};
struct SecurityDescriptor {
sd: PSECURITY_DESCRIPTOR,
@@ -411,6 +416,18 @@ mod imp {
Ok(())
}
+
+ pub fn hardlink_count(p: &Path) -> std::io::Result<u64> {
+ let file = std::fs::File::open(p)?;
+ let handle = file.as_raw_handle() as isize;
+ let mut info: BY_HANDLE_FILE_INFORMATION = unsafe { std::mem::zeroed() };
+
+ if unsafe { GetFileInformationByHandle(handle, &mut info) } == 0 {
+ Err(std::io::Error::last_os_error())
+ } else {
+ Ok(info.nNumberOfLinks as u64)
+ }
+ }
}
// Licensed under MIT from faccess except for `copy_metadata`
@@ -457,3 +474,7 @@ pub fn readonly(p: &Path) -> bool {
pub fn copy_metadata(from: &Path, to: &Path) -> io::Result<()> {
imp::copy_metadata(from, to)
}
+
+pub fn hardlink_count(p: &Path) -> io::Result<u64> {
+ imp::hardlink_count(p)
+}