1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
use std::{
convert::TryFrom,
os::raw::{c_char, c_int, c_void},
ptr,
};
use crate::{device::CryptDevice, err::LibcryptErr};
type LoggingCallback = unsafe extern "C" fn(level: c_int, msg: *const c_char, usrptr: *mut c_void);
#[derive(Debug, PartialEq)]
pub enum CryptLogLevel {
#[allow(missing_docs)]
Normal = libcryptsetup_rs_sys::CRYPT_LOG_NORMAL as isize,
#[allow(missing_docs)]
Error = libcryptsetup_rs_sys::CRYPT_LOG_ERROR as isize,
#[allow(missing_docs)]
Verbose = libcryptsetup_rs_sys::CRYPT_LOG_VERBOSE as isize,
#[allow(missing_docs)]
Debug = libcryptsetup_rs_sys::CRYPT_LOG_DEBUG as isize,
#[allow(missing_docs)]
DebugJson = libcryptsetup_rs_sys::CRYPT_LOG_DEBUG_JSON as isize,
}
impl TryFrom<c_int> for CryptLogLevel {
type Error = LibcryptErr;
fn try_from(v: c_int) -> Result<Self, <Self as TryFrom<c_int>>::Error> {
let level = match v {
i if i == CryptLogLevel::Normal as c_int => CryptLogLevel::Normal,
i if i == CryptLogLevel::Error as c_int => CryptLogLevel::Error,
i if i == CryptLogLevel::Verbose as c_int => CryptLogLevel::Verbose,
i if i == CryptLogLevel::Debug as c_int => CryptLogLevel::Debug,
i if i == CryptLogLevel::DebugJson as c_int => CryptLogLevel::DebugJson,
_ => return Err(LibcryptErr::InvalidConversion),
};
Ok(level)
}
}
pub struct CryptLog<'a> {
reference: &'a mut CryptDevice,
}
impl<'a> CryptLog<'a> {
pub(crate) fn new(reference: &'a mut CryptDevice) -> Self {
CryptLog { reference }
}
pub fn log(&mut self, level: CryptLogLevel, msg: &str) -> Result<(), LibcryptErr> {
let msg_cstring = to_cstring!(msg)?;
unsafe {
libcryptsetup_rs_sys::crypt_log(
self.reference.as_ptr(),
level as c_int,
msg_cstring.as_ptr(),
)
};
Ok(())
}
pub fn set_log_callback<T>(
&mut self,
callback: Option<LoggingCallback>,
usrdata: Option<&mut T>,
) {
unsafe {
libcryptsetup_rs_sys::crypt_set_log_callback(
self.reference.as_ptr(),
callback,
match usrdata {
Some(ud) => ud as *mut _ as *mut c_void,
None => ptr::null_mut(),
},
)
}
}
}