allow device matching by udev properties

This commit is contained in:
Mikaël Cluseau
2025-11-10 19:15:22 +01:00
parent 148aa0cc44
commit ac9d7e8d9d
9 changed files with 518 additions and 393 deletions
+23
View File
@@ -2,6 +2,8 @@ use log::error;
use std::collections::BTreeSet as Set;
use std::sync::LazyLock;
use crate::udev;
static CMDLINE: LazyLock<String> = LazyLock::new(|| {
std::fs::read("/proc/cmdline")
.inspect_err(|e| error!("failed to read kernel cmdline: {e}"))
@@ -88,3 +90,24 @@ pub fn select_n_by_regex<'t>(
nas.take(n as usize).collect()
}
}
pub async fn select_n_by_udev<'t>(
n: i16,
subsystem: &str,
result_property: &str,
filter: &udev::Filter,
in_use: &Set<String>,
) -> eyre::Result<Vec<String>> {
let devs = udev::all().await?;
let nas = devs
.of_subsystem(subsystem)
.filter(|dev| filter.matches(dev))
.filter_map(|dev| Some(dev.property(result_property)?.to_string()))
.filter(|name| !in_use.contains(name));
Ok(if n == -1 {
nas.collect()
} else {
nas.take(n as usize).collect()
})
}