use super::device::Device;
use bitflags::bitflags;
use std::fs;
bitflags! {
pub struct BlockCap: u32 {
const REMOVABLE = 1;
const MEDIA_CHANGE_NOTIFY = 4;
const CD = 8;
const UP = 16;
const SUPPRESS_PARTITION_INFO = 32;
const EXT_DEVT = 64;
const NATIVE_CAPACITY = 128;
const BLOCK_EVENTS_ON_EXCL_WRITE = 256;
const NO_PART_SCAN = 512;
const HIDDEN = 1024;
}
}
pub trait BlockDevice: Device {
fn major(&self) -> u64 {
fs::read_to_string(self.device_path().join("dev"))
.map(|s| s.split(':').next().unwrap().parse().unwrap())
.unwrap()
}
fn minor(&self) -> u64 {
fs::read_to_string(self.device_path().join("dev"))
.map(|s| s.rsplit(':').next().unwrap().parse().unwrap())
.unwrap()
}
fn capability(&self) -> BlockCap {
unsafe {
BlockCap::from_bits_unchecked(
fs::read_to_string(self.device_path().join("capability"))
.map(|s| s.parse().unwrap())
.unwrap(),
)
}
}
fn size(&self) -> u64 {
fs::read_to_string(self.device_path().join("size"))
.map(|s| s.parse::<u64>().unwrap() * 512)
.unwrap()
}
fn alignment_offset(&self) -> u64 {
fs::read_to_string(self.device_path().join("discard_alignment"))
.map(|s| s.parse().unwrap())
.unwrap()
}
fn discard_alignment_offset(&self) -> u64 {
fs::read_to_string(self.device_path().join("discard_alignment"))
.map(|s| s.parse().unwrap())
.unwrap()
}
fn partitions(&self) -> Vec<Box<dyn BlockDevicePartition>> {
todo!()
}
}
pub trait BlockDevicePartition: Device {
fn parent(&self) -> Box<dyn BlockDevice>;
fn alignment_offset(&self) -> u64 {
fs::read_to_string(self.device_path().join("alignment_offset"))
.map(|s| s.parse().unwrap())
.unwrap()
}
fn discard_alignment_offset(&self) -> u64 {
fs::read_to_string(self.device_path().join("discard_alignment"))
.map(|s| s.parse().unwrap())
.unwrap()
}
fn size(&self) -> u64 {
fs::read_to_string(self.device_path().join("size"))
.map(|s| s.parse::<u64>().unwrap() * 512)
.unwrap()
}
fn start(&self) -> u64 {
fs::read_to_string(self.device_path().join("start"))
.map(|s| s.parse::<u64>().unwrap() * 512)
.unwrap()
}
}