diff --git a/src/uu/uptime/src/uptime.rs b/src/uu/uptime/src/uptime.rs index d6f38c3b835..ca53d418adc 100644 --- a/src/uu/uptime/src/uptime.rs +++ b/src/uu/uptime/src/uptime.rs @@ -168,7 +168,7 @@ fn uptime_with_file(file_path: &OsString) -> UResult<()> { #[cfg(target_os = "openbsd")] { - let upsecs = get_uptime(None); + let upsecs = get_uptime(None)?; if upsecs >= 0 { print_uptime(Some(upsecs))?; } else { diff --git a/src/uucore/src/lib/features/uptime.rs b/src/uucore/src/lib/features/uptime.rs index 38991a923b8..f9fe2875fb3 100644 --- a/src/uucore/src/lib/features/uptime.rs +++ b/src/uucore/src/lib/features/uptime.rs @@ -75,7 +75,7 @@ pub fn get_uptime(_boot_time: Option) -> UResult { Ok(uptime) } else { - Err(UptimeError::SystemUptime) + Err(UptimeError::SystemUptime)? } } @@ -213,27 +213,23 @@ pub fn get_nusers() -> usize { pub fn get_nusers(file: &str) -> usize { use utmp_classic::{UtmpEntry, parse_from_path}; - let mut nusers = 0; - let entries = match parse_from_path(file) { - Some(e) => e, - None => return 0, + Ok(e) => e, + Err(_) => return 0, }; - for entry in entries { - if let UtmpEntry::UTMP { - line: _, - user, - host: _, - time: _, - } = entry - { - if !user.is_empty() { - nusers += 1; - } - } + if entries.is_empty() { + return 0; } - nusers + + // Count entries that have a non-empty user field + entries + .iter() + .filter_map(|entry| match entry { + UtmpEntry::UTMP { user, .. } if !user.is_empty() => Some(()), + _ => None, + }) + .count() } /// Get the number of users currently logged in diff --git a/tests/by-util/test_uptime.rs b/tests/by-util/test_uptime.rs index e179f64eb3d..b80efd1a00a 100644 --- a/tests/by-util/test_uptime.rs +++ b/tests/by-util/test_uptime.rs @@ -6,7 +6,6 @@ // spell-checker:ignore bincode serde utmp runlevel testusr testx #![allow(clippy::cast_possible_wrap, clippy::unreadable_literal)] -#[cfg(not(target_os = "openbsd"))] use uutests::at_and_ucmd; use uutests::util::TestScenario; use uutests::{new_ucmd, util_name};