blob: 98b508590a9b7f3bf2429faf48fb2993d208b8a7 [file] [log] [blame]
/*
* Copyright (C) 2021 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
use bitflags::bitflags;
use data_model::DataInit;
// This UAPI is copied and converted from include/uapi/linux/loop.h Note that this module doesn't
// implement all the features introduced in loop(4). Only the features that are required to support
// the `apkdmverity` use cases are implemented.
pub const LOOP_CONTROL: &str = "/dev/loop-control";
pub const LOOP_CTL_GET_FREE: libc::c_ulong = 0x4C82;
pub const LOOP_CONFIGURE: libc::c_ulong = 0x4C0A;
pub const LOOP_CLR_FD: libc::c_ulong = 0x4C01;
#[repr(C)]
#[derive(Copy, Clone)]
pub struct loop_config {
pub fd: u32,
pub block_size: u32,
pub info: loop_info64,
pub reserved: [u64; 8],
}
// SAFETY: C struct is safe to be initialized from raw data
unsafe impl DataInit for loop_config {}
#[repr(C)]
#[derive(Copy, Clone)]
pub struct loop_info64 {
pub lo_device: u64,
pub lo_inode: u64,
pub lo_rdevice: u64,
pub lo_offset: u64,
pub lo_sizelimit: u64,
pub lo_number: u32,
pub lo_encrypt_type: u32,
pub lo_encrypt_key_size: u32,
pub lo_flags: Flag,
pub lo_file_name: [u8; LO_NAME_SIZE],
pub lo_crypt_name: [u8; LO_NAME_SIZE],
pub lo_encrypt_key: [u8; LO_KEY_SIZE],
pub lo_init: [u64; 2],
}
// SAFETY: C struct is safe to be initialized from raw data
unsafe impl DataInit for loop_info64 {}
bitflags! {
pub struct Flag: u32 {
const LO_FLAGS_READ_ONLY = 1 << 0;
const LO_FLAGS_AUTOCLEAR = 1 << 2;
const LO_FLAGS_PARTSCAN = 1 << 3;
const LO_FLAGS_DIRECT_IO = 1 << 4;
}
}
pub const LO_NAME_SIZE: usize = 64;
pub const LO_KEY_SIZE: usize = 32;