1 /* 2 * Copyright (C) 2021 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 use bitflags::bitflags; 18 use zerocopy::FromZeroes; 19 20 // This UAPI is copied and converted from include/uapi/linux/loop.h Note that this module doesn't 21 // implement all the features introduced in loop(4). Only the features that are required to support 22 // the `apkdmverity` use cases are implemented. 23 24 pub const LOOP_CONTROL: &str = "/dev/loop-control"; 25 26 pub const LOOP_CTL_GET_FREE: libc::c_ulong = 0x4C82; 27 pub const LOOP_CONFIGURE: libc::c_ulong = 0x4C0A; 28 pub const LOOP_CLR_FD: libc::c_ulong = 0x4C01; 29 30 #[repr(C)] 31 #[derive(Copy, Clone, FromZeroes)] 32 pub struct loop_config { 33 pub fd: u32, 34 pub block_size: u32, 35 pub info: loop_info64, 36 pub reserved: [u64; 8], 37 } 38 39 #[repr(C)] 40 #[derive(Copy, Clone, FromZeroes)] 41 pub struct loop_info64 { 42 pub lo_device: u64, 43 pub lo_inode: u64, 44 pub lo_rdevice: u64, 45 pub lo_offset: u64, 46 pub lo_sizelimit: u64, 47 pub lo_number: u32, 48 pub lo_encrypt_type: u32, 49 pub lo_encrypt_key_size: u32, 50 pub lo_flags: Flag, 51 pub lo_file_name: [u8; LO_NAME_SIZE], 52 pub lo_crypt_name: [u8; LO_NAME_SIZE], 53 pub lo_encrypt_key: [u8; LO_KEY_SIZE], 54 pub lo_init: [u64; 2], 55 } 56 57 #[repr(transparent)] 58 #[derive(Copy, Clone, Debug, Eq, Hash, Ord, PartialEq, PartialOrd, FromZeroes)] 59 pub struct Flag(u32); 60 61 bitflags! { 62 impl Flag: u32 { 63 const LO_FLAGS_READ_ONLY = 1 << 0; 64 const LO_FLAGS_AUTOCLEAR = 1 << 2; 65 const LO_FLAGS_PARTSCAN = 1 << 3; 66 const LO_FLAGS_DIRECT_IO = 1 << 4; 67 } 68 } 69 70 pub const LO_NAME_SIZE: usize = 64; 71 pub const LO_KEY_SIZE: usize = 32; 72