ax_driver_block/partition/
mod.rs1mod 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}