Skip to main content

ax_driver_block/partition/
mod.rs

1mod 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}