starry_api/
time.rs

1use axhal::time::TimeValue;
2use linux_raw_sys::general::{
3    __kernel_old_timespec, __kernel_old_timeval, __kernel_sock_timeval, __kernel_timespec,
4    timespec, timeval,
5};
6
7/// A helper trait for converting from and to `TimeValue`.
8pub trait TimeValueLike {
9    /// Converts from `TimeValue`.
10    fn from_time_value(tv: TimeValue) -> Self;
11
12    /// Converts to `TimeValue`.
13    fn to_time_value(self) -> TimeValue;
14}
15
16impl TimeValueLike for TimeValue {
17    fn from_time_value(tv: TimeValue) -> Self {
18        tv
19    }
20
21    fn to_time_value(self) -> TimeValue {
22        self
23    }
24}
25
26impl TimeValueLike for timespec {
27    fn from_time_value(tv: TimeValue) -> Self {
28        Self {
29            tv_sec: tv.as_secs() as _,
30            tv_nsec: tv.subsec_nanos() as _,
31        }
32    }
33
34    fn to_time_value(self) -> TimeValue {
35        TimeValue::new(self.tv_sec as u64, self.tv_nsec as u32)
36    }
37}
38
39impl TimeValueLike for __kernel_timespec {
40    fn from_time_value(tv: TimeValue) -> Self {
41        Self {
42            tv_sec: tv.as_secs() as _,
43            tv_nsec: tv.subsec_nanos() as _,
44        }
45    }
46
47    fn to_time_value(self) -> TimeValue {
48        TimeValue::new(self.tv_sec as u64, self.tv_nsec as u32)
49    }
50}
51
52impl TimeValueLike for __kernel_old_timespec {
53    fn from_time_value(tv: TimeValue) -> Self {
54        Self {
55            tv_sec: tv.as_secs() as _,
56            tv_nsec: tv.subsec_nanos() as _,
57        }
58    }
59
60    fn to_time_value(self) -> TimeValue {
61        TimeValue::new(self.tv_sec as u64, self.tv_nsec as u32)
62    }
63}
64
65impl TimeValueLike for timeval {
66    fn from_time_value(tv: TimeValue) -> Self {
67        Self {
68            tv_sec: tv.as_secs() as _,
69            tv_usec: tv.subsec_micros() as _,
70        }
71    }
72
73    fn to_time_value(self) -> TimeValue {
74        TimeValue::new(self.tv_sec as u64, self.tv_usec as u32 * 1000)
75    }
76}
77
78impl TimeValueLike for __kernel_old_timeval {
79    fn from_time_value(tv: TimeValue) -> Self {
80        Self {
81            tv_sec: tv.as_secs() as _,
82            tv_usec: tv.subsec_micros() as _,
83        }
84    }
85
86    fn to_time_value(self) -> TimeValue {
87        TimeValue::new(self.tv_sec as u64, self.tv_usec as u32 * 1000)
88    }
89}
90
91impl TimeValueLike for __kernel_sock_timeval {
92    fn from_time_value(tv: TimeValue) -> Self {
93        Self {
94            tv_sec: tv.as_secs() as _,
95            tv_usec: tv.subsec_micros() as _,
96        }
97    }
98
99    fn to_time_value(self) -> TimeValue {
100        TimeValue::new(self.tv_sec as u64, self.tv_usec as u32 * 1000)
101    }
102}