Skip to content

Commit 595e706

Browse files
committed
feat(api): newtype for inode numbers
1 parent 2b21f71 commit 595e706

4 files changed

Lines changed: 34 additions & 8 deletions

File tree

src/hook/record_hardlink.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ pub use storage::RecordHardLinkStorage;
44

55
use super::{Hook, HookArgument};
66
use crate::{
7+
inode::InodeNumber,
78
reporter::{event::EncounterHardlink, Event, Reporter},
89
size,
910
};
@@ -52,6 +53,7 @@ where
5253
links,
5354
}));
5455

55-
self.storage.add(stats.ino(), size, path).unwrap(); // TODO: propagate the error
56+
let ino = InodeNumber::get(stats);
57+
self.storage.add(ino, size, path).unwrap(); // TODO: propagate the error
5658
}
5759
}

src/hook/record_hardlink/storage.rs

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use crate::{hardlink::LinkPathList, size};
1+
use crate::{hardlink::LinkPathList, inode::InodeNumber, size};
22
use dashmap::{iter::Iter as DashIter, mapref::multiple::RefMulti, DashMap};
33
use derive_more::{Display, Error};
44
use pipe_trait::Pipe;
@@ -8,7 +8,7 @@ use std::{fmt::Debug, path::Path};
88
#[derive(Debug, Clone)]
99
pub struct RecordHardLinkStorage<Size>(
1010
/// Map an inode number to its size and detected paths.
11-
DashMap<u64, (Size, LinkPathList)>, // TODO: benchmark against Mutex<HashMap<u64, (Size, LinkPathList)>>
11+
DashMap<InodeNumber, (Size, LinkPathList)>, // TODO: benchmark against Mutex<HashMap<InodeNumber, (Size, LinkPathList)>>
1212
);
1313

1414
impl<Size> RecordHardLinkStorage<Size> {
@@ -34,7 +34,7 @@ impl<Size> Default for RecordHardLinkStorage<Size> {
3434
#[display(bound(Size: Debug))]
3535
#[display("Size for inode {ino} changed from {recorded:?} to {detected:?}")]
3636
pub struct SizeConflictError<Size> {
37-
pub ino: u64, // TODO: define a newtype of ino.
37+
pub ino: InodeNumber,
3838
pub recorded: Size,
3939
pub detected: Size,
4040
}
@@ -52,7 +52,12 @@ where
5252
Size: size::Size,
5353
{
5454
/// Add an entry to the record.
55-
pub(crate) fn add(&self, ino: u64, size: Size, path: &Path) -> Result<(), AddError<Size>> {
55+
pub(crate) fn add(
56+
&self,
57+
ino: InodeNumber,
58+
size: Size,
59+
path: &Path,
60+
) -> Result<(), AddError<Size>> {
5661
let mut size_assertion = Ok(());
5762
self.0
5863
.entry(ino)
@@ -77,13 +82,13 @@ where
7782
#[derive(derive_more::Debug)]
7883
#[debug(bound())]
7984
#[debug("Iter(..)")]
80-
pub struct Iter<'a, Size>(DashIter<'a, u64, (Size, LinkPathList)>);
85+
pub struct Iter<'a, Size>(DashIter<'a, InodeNumber, (Size, LinkPathList)>);
8186

8287
/// [Item](Iterator::Item) of [`Iter`].
8388
#[derive(derive_more::Debug)]
8489
#[debug(bound())]
8590
#[debug("IterItem(..)")]
86-
pub struct IterItem<'a, Size>(RefMulti<'a, u64, (Size, LinkPathList)>);
91+
pub struct IterItem<'a, Size>(RefMulti<'a, InodeNumber, (Size, LinkPathList)>);
8792

8893
impl<'a, Size> Iterator for Iter<'a, Size> {
8994
type Item = IterItem<'a, Size>;
@@ -94,7 +99,7 @@ impl<'a, Size> Iterator for Iter<'a, Size> {
9499

95100
impl<'a, Size> IterItem<'a, Size> {
96101
/// Number of the inode.
97-
pub fn ino(&self) -> u64 {
102+
pub fn ino(&self) -> InodeNumber {
98103
*self.0.key()
99104
}
100105

src/inode.rs

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
use derive_more::{Display, From, Into, LowerHex, Octal, UpperHex};
2+
3+
/// The inode number of a file or directory.
4+
#[derive(
5+
Debug, Display, LowerHex, UpperHex, Octal, Clone, Copy, PartialEq, Eq, Hash, From, Into,
6+
)]
7+
pub struct InodeNumber(u64);
8+
9+
/// POSIX-exclusive functions.
10+
#[cfg(unix)]
11+
impl InodeNumber {
12+
/// Get inode number of a [`std::fs::Metadata`].
13+
pub fn get(stats: &std::fs::Metadata) -> Self {
14+
use pipe_trait::Pipe;
15+
use std::os::unix::fs::MetadataExt;
16+
stats.ino().pipe(InodeNumber)
17+
}
18+
}

src/lib.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ pub mod fs_tree_builder;
3535
pub mod get_size;
3636
pub mod hardlink;
3737
pub mod hook;
38+
pub mod inode;
3839
pub mod json_data;
3940
pub mod os_string_display;
4041
pub mod reporter;

0 commit comments

Comments
 (0)