libcryptsetup_rs/luks2/
flags.rs

1// This Source Code Form is subject to the terms of the Mozilla Public
2// License, v. 2.0. If a copy of the MPL was not distributed with this
3// file, You can obtain one at http://mozilla.org/MPL/2.0/.
4
5use std::marker::PhantomData;
6
7use crate::{
8    consts::{
9        flags::{CryptActivate, CryptRequirement},
10        vals::CryptFlagsType,
11    },
12    device::CryptDevice,
13    err::LibcryptErr,
14};
15
16/// Handle for LUKS2 persistent flag operations
17pub struct CryptLuks2FlagsHandle<'a, T> {
18    reference: &'a mut CryptDevice,
19    data: PhantomData<T>,
20}
21
22impl<'a, T> CryptLuks2FlagsHandle<'a, T> {
23    pub(crate) fn new(reference: &'a mut CryptDevice) -> Self {
24        CryptLuks2FlagsHandle {
25            reference,
26            data: PhantomData,
27        }
28    }
29}
30
31impl CryptLuks2FlagsHandle<'_, CryptActivate> {
32    /// Implementation for setting persistent flags for activation
33    pub fn persistent_flags_set(&mut self, flags: CryptActivate) -> Result<(), LibcryptErr> {
34        errno!(mutex!(libcryptsetup_rs_sys::crypt_persistent_flags_set(
35            self.reference.as_ptr(),
36            CryptFlagsType::Activation as u32,
37            flags.bits(),
38        )))
39    }
40
41    /// Implementation for getting persistent flags for activation
42    pub fn persistent_flags_get(&mut self) -> Result<CryptActivate, LibcryptErr> {
43        let mut flags_u32 = 0u32;
44        errno!(unsafe {
45            libcryptsetup_rs_sys::crypt_persistent_flags_get(
46                self.reference.as_ptr(),
47                CryptFlagsType::Activation as u32,
48                &mut flags_u32 as *mut _,
49            )
50        })
51        .and_then(|_| CryptActivate::from_bits(flags_u32).ok_or(LibcryptErr::InvalidConversion))
52    }
53}
54
55impl CryptLuks2FlagsHandle<'_, CryptRequirement> {
56    /// Implementation for setting persistent flags for requirements
57    pub fn persistent_flags_set(&mut self, flags: CryptRequirement) -> Result<(), LibcryptErr> {
58        errno!(unsafe {
59            libcryptsetup_rs_sys::crypt_persistent_flags_set(
60                self.reference.as_ptr(),
61                CryptFlagsType::Requirements as u32,
62                flags.bits(),
63            )
64        })
65    }
66
67    /// Implementation for getting persistent flags for requirements
68    pub fn persistent_flags_get(&mut self) -> Result<CryptRequirement, LibcryptErr> {
69        let mut flags_u32 = 0u32;
70        errno!(unsafe {
71            libcryptsetup_rs_sys::crypt_persistent_flags_get(
72                self.reference.as_ptr(),
73                CryptFlagsType::Requirements as u32,
74                &mut flags_u32 as *mut _,
75            )
76        })
77        .and_then(|_| CryptRequirement::from_bits(flags_u32).ok_or(LibcryptErr::InvalidConversion))
78    }
79}