allow device matching by udev properties
This commit is contained in:
@@ -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()
|
||||
})
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user