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