From 04b828ab6c504c7c3248c679ffb03b85122e0538 Mon Sep 17 00:00:00 2001 From: Aurorans Solis Date: Fri, 2 Jul 2021 10:26:32 -0700 Subject: [PATCH 1/2] Filter out non-AMD cards. --- src/config.rs | 23 ++++++++++++++++++++--- src/main.rs | 2 ++ 2 files changed, 22 insertions(+), 3 deletions(-) diff --git a/src/config.rs b/src/config.rs index 12ea1b8..6ceb7a6 100644 --- a/src/config.rs +++ b/src/config.rs @@ -1,4 +1,4 @@ -use crate::{AmdFanError, CONFIG_PATH}; +use crate::{AmdFanError, CONFIG_PATH, ROOT_DIR}; use log::LevelFilter; use serde::{Deserialize, Deserializer, Serialize, Serializer}; use std::fmt::Formatter; @@ -24,10 +24,20 @@ impl FromStr for Card { if value.len() < 5 { return Err(AmdFanError::InputTooShort); } - value[4..] + let card = value[4..] .parse::() .map_err(|e| AmdFanError::InvalidSuffix(format!("{:?}", e))) - .map(|n| Card(n)) + .map(|n| Card(n))?; + match std::fs::read_to_string(format!("{}/{}/device/vendor", ROOT_DIR, card)) { + Ok(vendor) => { + if vendor.trim() == "0x1002" { + Ok(card) + } else { + Err(AmdFanError::NotAmdCard) + } + } + Err(_) => Err(AmdFanError::FailedReadVendor), + } } } @@ -61,6 +71,13 @@ impl<'de> Deserialize<'de> for Card { "{:?} must have at least 5 characters", value ))), + Err(AmdFanError::NotAmdCard) => { + Err(E::custom(format!("{} is not an AMD GPU", value))) + } + Err(AmdFanError::FailedReadVendor) => Err(E::custom(format!( + "Failed to read vendor file for {}", + value + ))), } } } diff --git a/src/main.rs b/src/main.rs index 573aff4..6bd2a4f 100644 --- a/src/main.rs +++ b/src/main.rs @@ -16,6 +16,8 @@ pub enum AmdFanError { InvalidPrefix, InputTooShort, InvalidSuffix(String), + NotAmdCard, + FailedReadVendor, } #[derive(Debug)] From 6ba79825c922eb651175a77e9c63e2afaa23eb54 Mon Sep 17 00:00:00 2001 From: Aurorans Solis Date: Fri, 2 Jul 2021 15:37:05 -0700 Subject: [PATCH 2/2] Made suggested edits. --- src/config.rs | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/config.rs b/src/config.rs index 6ceb7a6..4e414fc 100644 --- a/src/config.rs +++ b/src/config.rs @@ -28,16 +28,15 @@ impl FromStr for Card { .parse::() .map_err(|e| AmdFanError::InvalidSuffix(format!("{:?}", e))) .map(|n| Card(n))?; - match std::fs::read_to_string(format!("{}/{}/device/vendor", ROOT_DIR, card)) { - Ok(vendor) => { + std::fs::read_to_string(format!("{}/{}/device/vendor", ROOT_DIR, card)) + .map_err(|_| AmdFanError::FailedReadVendor) + .and_then(|vendor| { if vendor.trim() == "0x1002" { Ok(card) } else { Err(AmdFanError::NotAmdCard) } - } - Err(_) => Err(AmdFanError::FailedReadVendor), - } + }) } }