ax_driver_block/partition/
mod.rs1mod device;
2mod gpt;
3mod mbr;
4
5use alloc::{string::String, vec::Vec};
6
7pub use self::device::PartitionBlockDevice;
8use crate::{BlockDriverOps, DevResult};
9
10#[derive(Clone, Copy, Debug, Eq, PartialEq)]
11pub enum PartitionTableKind {
12 Gpt,
13 Mbr,
14 None,
15}
16
17#[derive(Clone, Copy, Debug, Eq, PartialEq)]
18pub struct PartitionRegion {
19 pub start_lba: u64,
20 pub end_lba: u64,
21}
22
23impl PartitionRegion {
24 pub const fn from_num_blocks(num_blocks: u64) -> Self {
25 Self {
26 start_lba: 0,
27 end_lba: num_blocks,
28 }
29 }
30
31 pub const fn num_blocks(self) -> u64 {
32 self.end_lba.saturating_sub(self.start_lba)
33 }
34}
35
36#[derive(Clone, Debug, Eq, PartialEq)]
37pub struct PartitionInfo {
38 pub index: usize,
39 pub table_kind: PartitionTableKind,
40 pub region: PartitionRegion,
41 pub name: Option<String>,
42 pub part_uuid: Option<String>,
43 pub bootable: bool,
44}
45
46#[derive(Clone, Debug, Eq, PartialEq)]
47pub struct PartitionTable {
48 pub kind: PartitionTableKind,
49 pub partitions: Vec<PartitionInfo>,
50}
51
52impl PartitionTable {
53 pub const fn empty() -> Self {
54 Self {
55 kind: PartitionTableKind::None,
56 partitions: Vec::new(),
57 }
58 }
59}
60
61pub fn scan_partitions<T: BlockDriverOps + ?Sized>(inner: &mut T) -> DevResult<PartitionTable> {
62 if let Some(table) = gpt::scan_gpt_partitions(inner)? {
63 return Ok(table);
64 }
65 if let Some(table) = mbr::scan_mbr_partitions(inner)? {
66 return Ok(table);
67 }
68
69 Ok(PartitionTable::empty())
70}