head 1.1; access; symbols pkgsrc-2026Q3:1.1.0.2 pkgsrc-2026Q3-base:1.1; locks; strict; comment @# @; 1.1 date 2026.09.14.14.31.42; author pin; state Exp; branches; next ; commitid thMRTF1SPCpW7BVG; desc @@ 1.1 log @shells/starship: fix battery readout See sysutils/mirador for details. @ text @$NetBSD: patch-.._vendor_starship-battery-0.11.0_src_platform_netbsd_sysmon.rs,v 1.1 2026/09/14 12:14:18 pin Exp $ Fix battery readout using upstreams pull request. https://github.com/starship/rust-battery/pull/168 --- ../vendor/starship-battery-0.11.0/src/platform/netbsd/sysmon.rs.orig 2026-09-14 11:26:29.446107617 +0000 +++ ../vendor/starship-battery-0.11.0/src/platform/netbsd/sysmon.rs @@@@ -1,3 +1,4 @@@@ +use std::ffi::CStr; use std::fs; use std::os::fd::AsRawFd; use std::ptr::{addr_of_mut, null_mut, NonNull}; @@@@ -49,9 +50,9 @@@@ pub fn get_system_envsys_plist() -> Result Result`, so the buffer is +/// read as the C string it is, or every battery on NetBSD reads as +/// "Problem while processing plist". A buffer with no NUL is parsed whole. +fn parse_envsys_plist(bytes: &[u8]) -> Result { + let document = CStr::from_bytes_until_nul(bytes).map_or(bytes, CStr::to_bytes); + Ok(plist::from_bytes(document)?) +} + +#[cfg(test)] +mod tests { + use super::parse_envsys_plist; + + const ENVSYS: &str = concat!( + "\n", + "\n", + "\n\n\tacpibat0\n\t\n", + "\t\t\n\t\t\tcur-value\n\t\t\t1\n", + "\t\t\tdescription\n\t\t\tpresent\n", + "\t\t\tstate\n\t\t\tvalid\n", + "\t\t\ttype\n\t\t\tIndicator\n\t\t\n", + "\t\n\n\n" + ); + + #[test] + fn the_kernels_trailing_nul_is_not_part_of_the_document() { + let mut bytes = ENVSYS.as_bytes().to_vec(); + bytes.push(0); + let dict = parse_envsys_plist(&bytes).expect("a NUL-terminated envsys plist parses"); + assert!(dict.contains_key("acpibat0")); + } + + #[test] + fn a_plist_without_the_nul_still_parses() { + let dict = parse_envsys_plist(ENVSYS.as_bytes()).expect("parses"); + assert!(dict.contains_key("acpibat0")); + } + + #[test] + fn only_nuls_is_an_error_not_a_panic() { + assert!(parse_envsys_plist(&[0, 0]).is_err()); + assert!(parse_envsys_plist(&[]).is_err()); + } } @