cap_fs_ext/
metadata_ext.rs

1#[cfg(windows)]
2use cap_primitives::fs::_WindowsByHandle;
3
4/// Extension trait for `Metadata`.
5pub trait MetadataExt {
6    /// Returns the ID of the device containing the file.
7    ///
8    /// This corresponds to [`std::os::unix::fs::MetadataExt::dev`], except
9    /// that it's supported on Windows platforms as well.
10    ///
11    /// [`std::os::unix::fs::MetadataExt::dev`]: https://doc.rust-lang.org/std/os/unix/fs/trait.MetadataExt.html#tymethod.dev
12    fn dev(&self) -> u64;
13
14    /// Returns the inode number.
15    ///
16    /// This corresponds to [`std::os::unix::fs::MetadataExt::ino`], except
17    /// that it's supported on Windows platforms as well.
18    ///
19    /// FIXME: On Windows' `ReFS`, file identifiers are 128-bit.
20    ///
21    /// [`std::os::unix::fs::MetadataExt::ino`]: https://doc.rust-lang.org/std/os/unix/fs/trait.MetadataExt.html#tymethod.ino
22    fn ino(&self) -> u64;
23
24    /// Returns the number of hard links pointing to this file.
25    ///
26    /// This corresponds to [`std::os::unix::fs::MetadataExt::nlink`], except
27    /// that it's supported on Windows platforms as well.
28    ///
29    /// [`std::os::unix::fs::MetadataExt::nlink`]: https://doc.rust-lang.org/std/os/unix/fs/trait.MetadataExt.html#tymethod.nlink
30    fn nlink(&self) -> u64;
31}
32
33#[cfg(not(windows))]
34impl MetadataExt for std::fs::Metadata {
35    #[inline]
36    fn dev(&self) -> u64 {
37        std::os::unix::fs::MetadataExt::dev(self)
38    }
39
40    #[inline]
41    fn ino(&self) -> u64 {
42        std::os::unix::fs::MetadataExt::ino(self)
43    }
44
45    #[inline]
46    fn nlink(&self) -> u64 {
47        std::os::unix::fs::MetadataExt::nlink(self)
48    }
49}
50
51#[cfg(all(windows, windows_by_handle))]
52impl MetadataExt for std::fs::Metadata {
53    #[inline]
54    fn dev(&self) -> u64 {
55        std::os::windows::fs::MetadataExt::volume_serial_number(self)
56            .expect("`dev` depends on a Metadata constructed from an open `File`")
57            .into()
58    }
59
60    #[inline]
61    fn ino(&self) -> u64 {
62        std::os::windows::fs::MetadataExt::file_index(self)
63            .expect("`ino` depends on a Metadata constructed from an open `File`")
64    }
65
66    #[inline]
67    fn nlink(&self) -> u64 {
68        std::os::windows::fs::MetadataExt::number_of_links(self)
69            .expect("`nlink` depends on a Metadata constructed from an open `File`")
70            .into()
71    }
72}
73
74#[cfg(all(not(windows), any(feature = "std", feature = "async_std")))]
75impl MetadataExt for cap_primitives::fs::Metadata {
76    #[inline]
77    fn dev(&self) -> u64 {
78        cap_primitives::fs::MetadataExt::dev(self)
79    }
80
81    #[inline]
82    fn ino(&self) -> u64 {
83        cap_primitives::fs::MetadataExt::ino(self)
84    }
85
86    #[inline]
87    fn nlink(&self) -> u64 {
88        cap_primitives::fs::MetadataExt::nlink(self)
89    }
90}
91
92#[cfg(all(windows, any(feature = "std", feature = "async_std")))]
93impl MetadataExt for cap_primitives::fs::Metadata {
94    fn dev(&self) -> u64 {
95        _WindowsByHandle::volume_serial_number(self)
96            .expect("`dev` depends on a Metadata constructed from an open `File`")
97            .into()
98    }
99
100    #[inline]
101    fn ino(&self) -> u64 {
102        _WindowsByHandle::file_index(self)
103            .expect("`ino` depends on a Metadata constructed from an open `File`")
104    }
105
106    #[inline]
107    fn nlink(&self) -> u64 {
108        _WindowsByHandle::number_of_links(self)
109            .expect("`nlink` depends on a Metadata constructed from an open `File`")
110            .into()
111    }
112}