[package-directory] Use VFS read_dirents helper
Change-Id: I23e51ccf26a58df4083ac2153afc2b743e19248b
Reviewed-on: https://fuchsia-review.googlesource.com/c/fuchsia/+/666956
Reviewed-by: John Wittrock <wittrock@google.com>
Commit-Queue: Ben Keller <galbanum@google.com>
diff --git a/src/sys/pkg/lib/package-directory/src/lib.rs b/src/sys/pkg/lib/package-directory/src/lib.rs
index c328743..fb79f9a 100644
--- a/src/sys/pkg/lib/package-directory/src/lib.rs
+++ b/src/sys/pkg/lib/package-directory/src/lib.rs
@@ -8,11 +8,7 @@
std::{collections::HashSet, convert::TryInto as _, sync::Arc},
vfs::{
common::send_on_open_with_error,
- directory::{
- dirents_sink::AppendResult,
- entry::{DirectoryEntry, EntryInfo},
- traversal_position::TraversalPosition,
- },
+ directory::entry::{DirectoryEntry, EntryInfo},
path::Path as VfsPath,
},
};
@@ -156,48 +152,6 @@
res
}
-// Implements vfs::directory::entry_container::Directory::read_dirents given `entries`, a sorted
-// list of all the Directory's entries.
-async fn read_dirents<'a>(
- entries: &'a [(EntryInfo, String)],
- pos: &'a TraversalPosition,
- mut sink: Box<(dyn vfs::directory::dirents_sink::Sink + 'static)>,
-) -> Result<
- (TraversalPosition, Box<(dyn vfs::directory::dirents_sink::Sealed + 'static)>),
- zx::Status,
-> {
- let starting_position = match pos {
- TraversalPosition::End => {
- return Ok((TraversalPosition::End, sink.seal()));
- }
- TraversalPosition::Name(_) => {
- // The VFS should never send this to us, since we never return it here.
- unreachable!();
- }
- TraversalPosition::Start => {
- match sink.append(&EntryInfo::new(fio::INO_UNKNOWN, fio::DirentType::Directory), ".") {
- AppendResult::Ok(new_sink) => sink = new_sink,
- AppendResult::Sealed(sealed) => {
- return Ok((TraversalPosition::Start, sealed));
- }
- };
- 0 as usize
- }
- TraversalPosition::Index(i) => crate::u64_to_usize_safe(*i),
- };
-
- for i in starting_position..entries.len() {
- let (info, name) = &entries[i];
- match sink.append(info, name) {
- AppendResult::Ok(new_sink) => sink = new_sink,
- AppendResult::Sealed(sealed) => {
- return Ok((TraversalPosition::Index(crate::usize_to_u64_safe(i)), sealed));
- }
- }
- }
- Ok((TraversalPosition::End, sink.seal()))
-}
-
#[cfg(test)]
async fn verify_open_adjusts_flags(
entry: &Arc<dyn DirectoryEntry>,
@@ -229,7 +183,7 @@
fuchsia_pkg_testing::{blobfs::Fake as FakeBlobfs, PackageBuilder},
futures::StreamExt,
std::any::Any,
- vfs::directory::dirents_sink::{self, Sealed, Sink},
+ vfs::directory::dirents_sink::{self, AppendResult, Sealed, Sink},
};
#[fuchsia_async::run_singlethreaded(test)]
@@ -479,69 +433,4 @@
self
}
}
-
- #[fuchsia_async::run_singlethreaded(test)]
- async fn read_dirents_start() {
- let entries = get_dir_children(["resource", "meta/file"], "");
-
- let (start_pos, sealed) =
- read_dirents(&entries, &TraversalPosition::Start, Box::new(FakeSink::new(0)))
- .await
- .expect("read_dirents failed");
- assert_eq!(FakeSink::from_sealed(sealed).entries, vec![]);
- assert_eq!(start_pos, TraversalPosition::Start);
-
- let (end_pos, sealed) =
- read_dirents(&entries, &TraversalPosition::Start, Box::new(FakeSink::new(3)))
- .await
- .expect("read_dirents failed");
- assert_eq!(
- FakeSink::from_sealed(sealed).entries,
- vec![
- (".".to_string(), EntryInfo::new(fio::INO_UNKNOWN, fio::DirentType::Directory)),
- ("meta".to_string(), EntryInfo::new(fio::INO_UNKNOWN, fio::DirentType::Directory)),
- ("resource".to_string(), EntryInfo::new(fio::INO_UNKNOWN, fio::DirentType::File))
- ]
- );
- assert_eq!(end_pos, TraversalPosition::End);
- }
-
- #[fuchsia_async::run_singlethreaded(test)]
- async fn read_dirents_end() {
- let entries = get_dir_children(["resource", "meta/file"], "");
-
- let (pos, sealed) =
- read_dirents(&entries, &TraversalPosition::End, Box::new(FakeSink::new(3)))
- .await
- .expect("read_dirents failed");
- assert_eq!(FakeSink::from_sealed(sealed).entries, vec![]);
- assert_eq!(pos, TraversalPosition::End);
- }
-
- #[fuchsia_async::run_singlethreaded(test)]
- async fn read_dirents_index() {
- let entries = get_dir_children(["resource", "meta/file"], "");
-
- let (pos, sealed) =
- read_dirents(&entries, &TraversalPosition::Start, Box::new(FakeSink::new(2)))
- .await
- .expect("read_dirents failed");
- assert_eq!(
- FakeSink::from_sealed(sealed).entries,
- vec![
- (".".to_string(), EntryInfo::new(fio::INO_UNKNOWN, fio::DirentType::Directory)),
- ("meta".to_string(), EntryInfo::new(fio::INO_UNKNOWN, fio::DirentType::Directory)),
- ]
- );
- assert_eq!(pos, TraversalPosition::Index(1));
-
- let (end_pos, sealed) = read_dirents(&entries, &pos, Box::new(FakeSink::new(2)))
- .await
- .expect("read_dirents failed");
- assert_eq!(
- FakeSink::from_sealed(sealed).entries,
- vec![("resource".to_string(), EntryInfo::new(fio::INO_UNKNOWN, fio::DirentType::File))]
- );
- assert_eq!(end_pos, TraversalPosition::End);
- }
}
diff --git a/src/sys/pkg/lib/package-directory/src/meta_as_dir.rs b/src/sys/pkg/lib/package-directory/src/meta_as_dir.rs
index b0d7c01..23631c6 100644
--- a/src/sys/pkg/lib/package-directory/src/meta_as_dir.rs
+++ b/src/sys/pkg/lib/package-directory/src/meta_as_dir.rs
@@ -113,7 +113,7 @@
(TraversalPosition, Box<(dyn vfs::directory::dirents_sink::Sealed + 'static)>),
zx::Status,
> {
- crate::read_dirents(
+ vfs::directory::read_dirents::read_dirents(
&crate::get_dir_children(self.root_dir.meta_files.keys().map(|s| s.as_str()), "meta/"),
pos,
sink,
diff --git a/src/sys/pkg/lib/package-directory/src/meta_subdir.rs b/src/sys/pkg/lib/package-directory/src/meta_subdir.rs
index 1c197d3..8d3fbbd 100644
--- a/src/sys/pkg/lib/package-directory/src/meta_subdir.rs
+++ b/src/sys/pkg/lib/package-directory/src/meta_subdir.rs
@@ -114,7 +114,7 @@
(TraversalPosition, Box<(dyn vfs::directory::dirents_sink::Sealed + 'static)>),
zx::Status,
> {
- crate::read_dirents(
+ vfs::directory::read_dirents::read_dirents(
&crate::get_dir_children(
self.root_dir.meta_files.keys().map(|s| s.as_str()),
&self.path,
diff --git a/src/sys/pkg/lib/package-directory/src/non_meta_subdir.rs b/src/sys/pkg/lib/package-directory/src/non_meta_subdir.rs
index 3a922c9..5c05476 100644
--- a/src/sys/pkg/lib/package-directory/src/non_meta_subdir.rs
+++ b/src/sys/pkg/lib/package-directory/src/non_meta_subdir.rs
@@ -116,7 +116,7 @@
(TraversalPosition, Box<(dyn vfs::directory::dirents_sink::Sealed + 'static)>),
zx::Status,
> {
- crate::read_dirents(
+ vfs::directory::read_dirents::read_dirents(
&crate::get_dir_children(
self.root_dir.non_meta_files.keys().map(|s| s.as_str()),
&self.path,
diff --git a/src/sys/pkg/lib/package-directory/src/root_dir.rs b/src/sys/pkg/lib/package-directory/src/root_dir.rs
index 288e900..ae4baf9 100644
--- a/src/sys/pkg/lib/package-directory/src/root_dir.rs
+++ b/src/sys/pkg/lib/package-directory/src/root_dir.rs
@@ -292,7 +292,7 @@
(TraversalPosition, Box<(dyn vfs::directory::dirents_sink::Sealed + 'static)>),
zx::Status,
> {
- crate::read_dirents(
+ vfs::directory::read_dirents::read_dirents(
// Add "meta/placeholder" file so the "meta" dir is included in the results
&crate::get_dir_children(
self.non_meta_files.keys().map(|s| s.as_str()).chain(["meta/placeholder"]),