possum/sys/
mod.rs

1//! Exposes required lower-level OS primitives for sparse files, block cloning, and file locking.
2
3use super::*;
4
5mod clonefile;
6mod flock;
7mod pathconf;
8mod punchfile;
9pub mod seekhole;
10
11use std::fs::File;
12
13pub use clonefile::*;
14pub use flock::*;
15pub(crate) use pathconf::*;
16pub use punchfile::*;
17
18cfg_if! {
19    if #[cfg(windows)] {
20        mod windows;
21        pub use windows::*;
22        pub use ::windows::Win32::System::Ioctl::*;
23        use ::windows::Win32::Foundation::*;
24        use std::os::windows::io::AsRawHandle;
25        use ::windows::Win32::Storage::FileSystem::*;
26        use ::windows::Win32::System::IO::*;
27        use ::windows::Win32::System::SystemServices::*;
28        pub type NativeIoError = std::io::Error;
29    } else if #[cfg(unix)] {
30        mod unix;
31        pub use unix::*;
32        pub(crate) use std::os::unix::prelude::OsStrExt;
33        pub(crate) use std::os::fd::AsRawFd;
34        pub(crate) use std::os::fd::AsFd;
35        pub type NativeIoError = std::io::Error;
36    }
37}
38
39// These are typedefs for 64bit file syscalls.
40cfg_if! {
41    if #[cfg(not(target_pointer_width = "64"))] {
42        pub use libc::off64_t as off_t;
43        #[cfg(unix)]
44        pub use nix::libc::lseek64 as lseek;
45    } else {
46        #[cfg(unix)]
47         use nix::libc::lseek;
48    }
49}
50
51pub trait SparseFile {
52    fn set_sparse(&self, set_sparse: bool) -> io::Result<()>;
53}
54
55#[cfg(not(windows))]
56impl SparseFile for File {
57    fn set_sparse(&self, _set_sparse: bool) -> io::Result<()> {
58        Ok(())
59    }
60}
61
62#[cfg(not(windows))]
63pub(crate) fn open_dir_as_file<P: AsRef<Path>>(path: P) -> io::Result<File> {
64    OpenOptions::new().read(true).open(path)
65}
66
67pub trait FileSystemFlags {
68    fn supports_sparse_files(&self) -> bool;
69    /// Returns Some if we know for certain, and None if there's no indication from the system.
70    fn supports_block_cloning(&self) -> Option<bool>;
71}
72
73pub trait DirMeta {
74    fn file_system_flags(&self) -> io::Result<impl FileSystemFlags>;
75}