1use 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
39cfg_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 fn supports_block_cloning(&self) -> Option<bool>;
71}
72
73pub trait DirMeta {
74 fn file_system_flags(&self) -> io::Result<impl FileSystemFlags>;
75}