Skip to content

Commit adf4a54

Browse files
committed
utils: Make filter_errno a method on the result instead of a function
I.e. instead of `filter(open(), ENOENT)`, you do `open().filter(ENOENT)`.
1 parent fff41b1 commit adf4a54

File tree

2 files changed

+31
-25
lines changed

2 files changed

+31
-25
lines changed

crates/composefs/src/repository.rs

Lines changed: 11 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ use crate::{
2525
},
2626
mount::mount_composefs_at,
2727
splitstream::{DigestMap, SplitStreamReader, SplitStreamWriter},
28-
util::{filter_errno, proc_self_fd, replace_symlinkat, Sha256Digest},
28+
util::{proc_self_fd, replace_symlinkat, ErrnoFilter, Sha256Digest},
2929
};
3030

3131
/// Call openat() on the named subdirectory of "dirfd", possibly creating it first.
@@ -483,24 +483,21 @@ impl<ObjectID: FsVerityHashValue> Repository<ObjectID> {
483483
fn gc_category(&self, category: &str) -> Result<HashSet<ObjectID>> {
484484
let mut objects = HashSet::new();
485485

486-
let Some(category_fd) = filter_errno(
487-
self.openat(category, OFlags::RDONLY | OFlags::DIRECTORY),
488-
Errno::NOENT,
489-
)
490-
.context("Opening {category} dir in repository")?
486+
let Some(category_fd) = self
487+
.openat(category, OFlags::RDONLY | OFlags::DIRECTORY)
488+
.filter_errno(Errno::NOENT)
489+
.context("Opening {category} dir in repository")?
491490
else {
492491
return Ok(objects);
493492
};
494493

495-
if let Some(refs) = filter_errno(
496-
openat(
497-
&category_fd,
498-
"refs",
499-
OFlags::RDONLY | OFlags::DIRECTORY,
500-
Mode::empty(),
501-
),
502-
Errno::NOENT,
494+
if let Some(refs) = openat(
495+
&category_fd,
496+
"refs",
497+
OFlags::RDONLY | OFlags::DIRECTORY,
498+
Mode::empty(),
503499
)
500+
.filter_errno(Errno::NOENT)
504501
.context("Opening {category}/refs dir in repository")?
505502
{
506503
Self::walk_symlinkdir(refs, &mut objects)?;

crates/composefs/src/util.rs

Lines changed: 20 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -106,14 +106,17 @@ pub fn parse_sha256(string: impl AsRef<str>) -> Result<Sha256Digest> {
106106
Ok(value)
107107
}
108108

109-
pub(crate) fn filter_errno<T>(
110-
result: rustix::io::Result<T>,
111-
ignored: Errno,
112-
) -> ErrnoResult<Option<T>> {
113-
match result {
114-
Ok(result) => Ok(Some(result)),
115-
Err(err) if err == ignored => Ok(None),
116-
Err(err) => Err(err),
109+
pub(crate) trait ErrnoFilter<T> {
110+
fn filter_errno(self, ignored: Errno) -> ErrnoResult<Option<T>>;
111+
}
112+
113+
impl<T> ErrnoFilter<T> for ErrnoResult<T> {
114+
fn filter_errno(self, ignored: Errno) -> ErrnoResult<Option<T>> {
115+
match self {
116+
Ok(result) => Ok(Some(result)),
117+
Err(err) if err == ignored => Ok(None),
118+
Err(err) => Err(err),
119+
}
117120
}
118121
}
119122

@@ -135,12 +138,15 @@ pub(crate) fn replace_symlinkat(
135138
let target = target.as_ref();
136139

137140
// Step 1: try to create the symlink
138-
if filter_errno(symlinkat(target, dirfd, name), Errno::EXIST)?.is_some() {
141+
if symlinkat(target, dirfd, name)
142+
.filter_errno(Errno::EXIST)?
143+
.is_some()
144+
{
139145
return Ok(());
140146
};
141147

142148
// Step 2: the symlink already exists. Maybe it already has the correct target?
143-
if let Some(current_target) = filter_errno(readlinkat(dirfd, name, []), Errno::NOENT)? {
149+
if let Some(current_target) = readlinkat(dirfd, name, []).filter_errno(Errno::NOENT)? {
144150
if current_target.into_bytes() == target.as_os_str().as_bytes() {
145151
return Ok(());
146152
}
@@ -149,7 +155,10 @@ pub(crate) fn replace_symlinkat(
149155
// Step 3: full atomic replace path
150156
for _ in 0..16 {
151157
let tmp_name = generate_tmpname(".symlink-");
152-
if filter_errno(symlinkat(target, dirfd, &tmp_name), Errno::EXIST)?.is_none() {
158+
if symlinkat(target, dirfd, &tmp_name)
159+
.filter_errno(Errno::EXIST)?
160+
.is_none()
161+
{
153162
// This temporary filename already exists, try another
154163
continue;
155164
}

0 commit comments

Comments
 (0)