Skip to main content

ax_driver_block/partition/
mod.rs

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