From 94dffc431166d5ab67f49069dda3ab781224410b Mon Sep 17 00:00:00 2001 From: Abdullah Al-Banna Date: Tue, 17 Feb 2026 20:24:08 +0300 Subject: [PATCH] default to configuration 0 if the `bConfigurationValue` file is empty (#181) Co-authored-by: Kevin Mehall --- src/platform/linux_usbfs/device.rs | 27 ++++++++++++++++++++----- src/platform/linux_usbfs/enumeration.rs | 4 ++-- 2 files changed, 24 insertions(+), 7 deletions(-) diff --git a/src/platform/linux_usbfs/device.rs b/src/platform/linux_usbfs/device.rs index f4edee4..6a48714 100644 --- a/src/platform/linux_usbfs/device.rs +++ b/src/platform/linux_usbfs/device.rs @@ -29,7 +29,10 @@ use super::{ }; #[cfg(not(target_os = "android"))] -use super::SysfsPath; +use super::{ + enumeration::{SysfsError, SysfsErrorKind}, + SysfsPath, +}; use crate::{ bitset::EndpointBitSet, @@ -140,10 +143,20 @@ impl LinuxDevice { #[cfg(not(target_os = "android"))] let active_config: u8 = if let Some(sysfs) = sysfs.as_ref() { - sysfs.read_attr("bConfigurationValue").map_err(|e| { - warn!("failed to read sysfs bConfigurationValue: {e}"); - Error::new(ErrorKind::Other, "failed to read sysfs bConfigurationValue") - })? + match sysfs.read_attr("bConfigurationValue") { + Ok(v) => v, + // Linux returns an empty string when the device is unconfigured. + // We'll assume all parse errors are the empty string. + Err(SysfsError(_, SysfsErrorKind::Parse(_))) => 0, + + Err(e) => { + warn!("failed to read sysfs bConfigurationValue: {e}"); + return Err(Error::new( + ErrorKind::Other, + "failed to read sysfs bConfigurationValue", + )); + } + } } else { guess_active_configuration(&fd, &descriptors) }; @@ -325,6 +338,10 @@ impl LinuxDevice { self.active_config.store(v, Ordering::SeqCst); return v; } + Err(SysfsError(_, SysfsErrorKind::Parse(_))) => { + self.active_config.store(0, Ordering::SeqCst); + return 0; + } Err(e) => { error!("Failed to read sysfs bConfigurationValue: {e}, using cached value"); } diff --git a/src/platform/linux_usbfs/enumeration.rs b/src/platform/linux_usbfs/enumeration.rs index f5e63f0..eadc412 100644 --- a/src/platform/linux_usbfs/enumeration.rs +++ b/src/platform/linux_usbfs/enumeration.rs @@ -15,10 +15,10 @@ use crate::{BusInfo, DeviceInfo, Error, Speed, UsbControllerType}; pub struct SysfsPath(pub(crate) PathBuf); #[derive(Debug)] -pub struct SysfsError(PathBuf, SysfsErrorKind); +pub struct SysfsError(pub(crate) PathBuf, pub(crate) SysfsErrorKind); #[derive(Debug)] -enum SysfsErrorKind { +pub(crate) enum SysfsErrorKind { Io(io::Error), Parse(String), }