sysctl/
ctl_type.rs

1// ctl_type.rs
2
3use ctl_value::*;
4
5/// An Enum that represents a sysctl's type information.
6///
7/// # Example
8///
9/// ```
10/// # use sysctl::Sysctl;
11/// if let Ok(ctl) = sysctl::Ctl::new("kern.osrevision") {
12///     if let Ok(value) = ctl.value() {
13///         let val_type: sysctl::CtlType = value.into();
14///         assert_eq!(val_type, sysctl::CtlType::Int);
15///     }
16/// }
17/// ```
18#[derive(Debug, Copy, Clone, PartialEq)]
19#[repr(u32)]
20pub enum CtlType {
21    Node = 1,
22    Int = 2,
23    String = 3,
24    S64 = 4,
25    Struct = 5,
26    Uint = 6,
27    Long = 7,
28    Ulong = 8,
29    U64 = 9,
30    U8 = 10,
31    U16 = 11,
32    S8 = 12,
33    S16 = 13,
34    S32 = 14,
35    U32 = 15,
36    // Added custom types below
37    None = 0,
38    #[cfg(target_os = "freebsd")]
39    Temperature = 16,
40}
41impl std::convert::From<u32> for CtlType {
42    fn from(t: u32) -> Self {
43        assert!(t <= 16);
44        unsafe { std::mem::transmute(t) }
45    }
46}
47impl std::convert::From<&CtlValue> for CtlType {
48    fn from(t: &CtlValue) -> Self {
49        match t {
50            CtlValue::None => CtlType::None,
51            CtlValue::Node(_) => CtlType::Node,
52            CtlValue::Int(_) => CtlType::Int,
53            CtlValue::String(_) => CtlType::String,
54            CtlValue::S64(_) => CtlType::S64,
55            CtlValue::Struct(_) => CtlType::Struct,
56            CtlValue::Uint(_) => CtlType::Uint,
57            CtlValue::Long(_) => CtlType::Long,
58            CtlValue::Ulong(_) => CtlType::Ulong,
59            CtlValue::U64(_) => CtlType::U64,
60            CtlValue::U8(_) => CtlType::U8,
61            CtlValue::U16(_) => CtlType::U16,
62            CtlValue::S8(_) => CtlType::S8,
63            CtlValue::S16(_) => CtlType::S16,
64            CtlValue::S32(_) => CtlType::S32,
65            CtlValue::U32(_) => CtlType::U32,
66            #[cfg(target_os = "freebsd")]
67            CtlValue::Temperature(_) => CtlType::Temperature,
68        }
69    }
70}
71impl std::convert::From<CtlValue> for CtlType {
72    fn from(t: CtlValue) -> Self {
73        Self::from(&t)
74    }
75}
76
77impl CtlType {
78    pub fn min_type_size(&self) -> usize {
79        match self {
80            CtlType::None => 0,
81            CtlType::Node => 0,
82            CtlType::Int => std::mem::size_of::<libc::c_int>(),
83            CtlType::String => 0,
84            CtlType::S64 => std::mem::size_of::<i64>(),
85            CtlType::Struct => 0,
86            CtlType::Uint => std::mem::size_of::<libc::c_uint>(),
87            CtlType::Long => std::mem::size_of::<libc::c_long>(),
88            CtlType::Ulong => std::mem::size_of::<libc::c_ulong>(),
89            CtlType::U64 => std::mem::size_of::<u64>(),
90            CtlType::U8 => std::mem::size_of::<u8>(),
91            CtlType::U16 => std::mem::size_of::<u16>(),
92            CtlType::S8 => std::mem::size_of::<i8>(),
93            CtlType::S16 => std::mem::size_of::<i16>(),
94            CtlType::S32 => std::mem::size_of::<i32>(),
95            CtlType::U32 => std::mem::size_of::<u32>(),
96            // Added custom types below
97            #[cfg(target_os = "freebsd")]
98            CtlType::Temperature => 0,
99        }
100    }
101}
102