razor_libnvpair/
nvpair.rs

1use std::mem;
2
3use libc::{c_char, c_uchar};
4
5use super::*;
6
7macro_rules! nvpair_value {
8    ($accessor:ident, $output:ty) => {
9        #[inline]
10        pub unsafe fn $accessor(nvp: *mut nvpair_t) -> Result<$output, NvPairTypeMismatch> {
11            let mut value = mem::MaybeUninit::uninit();
12            match sys::$accessor(nvp, value.as_mut_ptr()) {
13                0 => Ok(value.assume_init()),
14                libc::EINVAL => Err(NvPairTypeMismatch),
15                other => panic!("Impossible return value '{other}' from nvpair_value accessor"),
16            }
17        }
18    };
19}
20
21nvpair_value!(nvpair_value_boolean_value, boolean_t);
22nvpair_value!(nvpair_value_byte, c_uchar);
23nvpair_value!(nvpair_value_int8, i8);
24nvpair_value!(nvpair_value_uint8, u8);
25nvpair_value!(nvpair_value_int16, i16);
26nvpair_value!(nvpair_value_uint16, u16);
27nvpair_value!(nvpair_value_int32, i32);
28nvpair_value!(nvpair_value_uint32, u32);
29nvpair_value!(nvpair_value_int64, i64);
30nvpair_value!(nvpair_value_uint64, u64);
31nvpair_value!(nvpair_value_double, f64);
32nvpair_value!(nvpair_value_string, *mut c_char);
33nvpair_value!(nvpair_value_nvlist, *mut nvlist_t);
34
35macro_rules! nvpair_value_array {
36    ($accessor:ident, $output:ty) => {
37        #[inline]
38        pub unsafe fn $accessor(nvp: *mut nvpair_t) -> Result<($output, u32), NvPairTypeMismatch> {
39            let mut len = 0;
40            let mut value = mem::MaybeUninit::uninit();
41            match sys::$accessor(nvp, value.as_mut_ptr(), &mut len) {
42                0 => Ok((value.assume_init(), len)),
43                libc::EINVAL => Err(NvPairTypeMismatch),
44                other => panic!("Impossible return value '{other}' from nvpair_value accessor"),
45            }
46        }
47    };
48}
49
50nvpair_value_array!(nvpair_value_byte_array, *mut c_uchar);
51nvpair_value_array!(nvpair_value_boolean_array, *mut boolean_t);
52nvpair_value_array!(nvpair_value_int8_array, *mut i8);
53nvpair_value_array!(nvpair_value_uint8_array, *mut u8);
54nvpair_value_array!(nvpair_value_int16_array, *mut i16);
55nvpair_value_array!(nvpair_value_uint16_array, *mut u16);
56nvpair_value_array!(nvpair_value_int32_array, *mut i32);
57nvpair_value_array!(nvpair_value_uint32_array, *mut u32);
58nvpair_value_array!(nvpair_value_int64_array, *mut i64);
59nvpair_value_array!(nvpair_value_uint64_array, *mut u64);
60nvpair_value_array!(nvpair_value_string_array, *mut *mut c_char);
61nvpair_value_array!(nvpair_value_nvlist_array, *mut *mut nvlist_t);