From df6070b75cb05a1807f03329c72fdd8d6898dc85 Mon Sep 17 00:00:00 2001 From: Lucy Date: Wed, 2 Feb 2022 15:07:20 -0500 Subject: [PATCH] Implement `AccessPoint::last_seen`, using `procfs` to get the boot time. --- networkmanager/Cargo.toml | 2 ++ networkmanager/src/access_point.rs | 20 ++++++++++---------- networkmanager/src/lib.rs | 1 + networkmanager/src/util.rs | 10 ++++++++++ 4 files changed, 23 insertions(+), 10 deletions(-) create mode 100644 networkmanager/src/util.rs diff --git a/networkmanager/Cargo.toml b/networkmanager/Cargo.toml index 783edce..bb1fef5 100644 --- a/networkmanager/Cargo.toml +++ b/networkmanager/Cargo.toml @@ -7,6 +7,8 @@ license = "MPL-2.0" [dependencies] bitflags = "1.3.2" derive_builder = "0.10.2" +procfs = { version = "0.12.0", default-features = false } +time = "0.3.7" zbus = "2.0.1" [features] diff --git a/networkmanager/src/access_point.rs b/networkmanager/src/access_point.rs index 99a5f07..8fc9de3 100644 --- a/networkmanager/src/access_point.rs +++ b/networkmanager/src/access_point.rs @@ -1,23 +1,23 @@ // SPDX-License-Identifier: MPL-2.0 -use crate::interface::{ - access_point::AccessPointProxy, - enums::{ApFlags, ApSecurityFlags}, +use crate::{ + interface::{ + access_point::AccessPointProxy, + enums::{ApFlags, ApSecurityFlags}, + }, + util::clock_boottime_to_time, }; use std::ops::Deref; +use time::OffsetDateTime; use zbus::Result; #[derive(Debug)] pub struct AccessPoint<'a>(AccessPointProxy<'a>); impl<'a> AccessPoint<'a> { - /* TODO: figure out how to convert CLOCK_BOOTTIME to SystemTime, as CLOCK_BOOTTIME's starting point is arbritary and not guaranteed to match up with the UNIX Epoch - pub async fn last_seen(&self) -> Result> { - let last_seen = self.0.last_seen().await?; - if !last_seen.is_positive() { - return Ok(None); - } - }*/ + pub async fn last_seen(&self) -> Result> { + Ok(clock_boottime_to_time(self.0.last_seen().await?)) + } pub async fn flags(&self) -> Result { self.0.flags().await.map(ApFlags::from_bits_truncate) diff --git a/networkmanager/src/lib.rs b/networkmanager/src/lib.rs index 2a40074..fc42ac9 100644 --- a/networkmanager/src/lib.rs +++ b/networkmanager/src/lib.rs @@ -7,3 +7,4 @@ pub mod device; pub mod interface; pub mod nm; pub mod settings; +pub(crate) mod util; diff --git a/networkmanager/src/util.rs b/networkmanager/src/util.rs new file mode 100644 index 0000000..0c60fee --- /dev/null +++ b/networkmanager/src/util.rs @@ -0,0 +1,10 @@ +// SPDX-License-Identifier: MPL-2.0 + +use time::OffsetDateTime; + +pub fn clock_boottime_to_time(time: i32) -> Option { + let boot_time = procfs::boot_time_secs() + .ok() + .and_then(|boot_time| i64::try_from(boot_time).ok())?; + OffsetDateTime::from_unix_timestamp(boot_time + time as i64).ok() +}