[cs] Fix to search for multiple childs with same name.
fixing it to search for
/hub/r/my_realm/1
/hub/r/my_realm/2
/hub/r/my_realm/3
/hub/c/my_c/1
/hub/c/my_c/2
/hub/c/my_c/3
Change-Id: I7692843ef6fe4e304e008989b5dc7e202488504e
diff --git a/garnet/bin/cs/src/main.rs b/garnet/bin/cs/src/main.rs
index 4e20e98..b1d902e 100644
--- a/garnet/bin/cs/src/main.rs
+++ b/garnet/bin/cs/src/main.rs
@@ -16,7 +16,7 @@
type ComponentsResult = Result<Vec<Component>, Error>;
type RealmsResult = Result<Vec<Realm>, Error>;
type TraversalResult = Result<(), Error>;
-type DirEntryResult = Result<fs::DirEntry, Error>;
+type DirEntryResult = Result<Vec<fs::DirEntry>, Error>;
struct Realm {
job_id: u32,
@@ -108,17 +108,20 @@
for entry in entries {
let entry = entry?;
// visit <realm id>/r/<child realm name>/<child realm id>/
- let child_realm_id_dir_entry = find_id_directory(&entry.path())?;
- let path = child_realm_id_dir_entry.path();
- child_realms.push(Realm::create(&path)?);
+ let child_realm_id_dir_entries = find_id_directories(&entry.path())?;
+ for child_realm_id_dir_entry in child_realm_id_dir_entries {
+ let path = child_realm_id_dir_entry.path();
+ child_realms.push(Realm::create(&path)?);
+ }
}
Ok(child_realms)
}
/// Used as a helper function to traverse <realm id>/r/, <realm id>/c/,
/// <component instance id>/c/, following through into their id subdirectories.
-fn find_id_directory(dir: &Path) -> DirEntryResult {
+fn find_id_directories(dir: &Path) -> DirEntryResult {
let entries = fs::read_dir(dir)?;
+ let mut vec = vec![];
for entry in entries {
let entry = entry?;
let path = entry.path();
@@ -127,12 +130,15 @@
name.to_string_lossy()
};
- // Find the first numeric directory name and return its directory entry.
+ // check for numeric directory name.
if id.chars().all(char::is_numeric) {
- return Ok(entry);
+ vec.push(entry)
}
}
- return Err(err_msg("Directory not found"));
+ match !vec.is_empty() {
+ true => Ok(vec),
+ false => Err(err_msg("Directory not found")),
+ }
}
fn visit_system_objects(component_path: &Path, exclude_objects: &Vec<String>) -> TraversalResult {
@@ -189,9 +195,11 @@
for entry in entries {
let entry = entry?;
// Visits */c/<component name>/<component instance id>.
- let component_instance_id_dir_entry = find_id_directory(&entry.path())?;
- let path = component_instance_id_dir_entry.path();
- child_components.push(Component::create(&path)?);
+ let component_instance_id_dir_entries = find_id_directories(&entry.path())?;
+ for component_instance_id_dir_entry in component_instance_id_dir_entries {
+ let path = component_instance_id_dir_entry.path();
+ child_components.push(Component::create(&path)?);
+ }
}
Ok(child_components)
}