From 7a0c32c19164e60488105a3c6142d41384b0a8cf Mon Sep 17 00:00:00 2001 From: Alex Zenla Date: Tue, 14 Oct 2025 01:45:49 -0700 Subject: [PATCH] add support for partition type uuid matching --- src/extractors/filesystem_device_match.rs | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/src/extractors/filesystem_device_match.rs b/src/extractors/filesystem_device_match.rs index b2e6649..4c34546 100644 --- a/src/extractors/filesystem_device_match.rs +++ b/src/extractors/filesystem_device_match.rs @@ -21,6 +21,8 @@ pub struct FilesystemDeviceMatchExtractor { pub has_item: Option, #[serde(default, rename = "has-partition-uuid")] pub has_partition_uuid: Option, + #[serde(default, rename = "has-partition-type-uuid")] + pub has_partition_type_uuid: Option, #[serde(default)] pub fallback: Option, } @@ -34,14 +36,15 @@ pub fn extract( for handle in handles { let mut has_match = false; - let partition_uuid = { + let partition_info = { let partition_info = uefi::boot::open_protocol_exclusive::(handle); match partition_info { Ok(partition_info) => { if let Some(gpt) = partition_info.gpt_partition_entry() { let uuid = gpt.unique_partition_guid; - Some(uuid) + let type_uuid = gpt.partition_type_guid; + Some((uuid, type_uuid.0)) } else { None } @@ -59,17 +62,28 @@ pub fn extract( } }; - if let Some(partition_uuid) = partition_uuid + if let Some((partition_uuid, _partition_type_guid)) = partition_info && let Some(ref has_partition_uuid) = extractor.has_partition_uuid { let parsed_uuid = Guid::from_str(has_partition_uuid) - .map_err(|e| anyhow!("failed to parse has-uuid: {}", e))?; + .map_err(|e| anyhow!("failed to parse has-partition-uuid: {}", e))?; if partition_uuid != parsed_uuid { continue; } has_match = true; } + if let Some((_partition_uuid, partition_type_guid)) = partition_info + && let Some(ref has_partition_type_uuid) = extractor.has_partition_type_uuid + { + let parsed_uuid = Guid::from_str(has_partition_type_uuid) + .map_err(|e| anyhow!("failed to parse has-partition-type-uuid: {}", e))?; + if partition_type_guid != parsed_uuid { + continue; + } + has_match = true; + } + let mut filesystem = uefi::boot::open_protocol_exclusive::(handle) .context("failed to open filesystem protocol")?;