apple_nvram/
mtd.rs

1use std::{
2    io::{Seek, SeekFrom, Write},
3    os::unix::io::AsRawFd,
4};
5
6use crate::NvramWriter;
7
8impl<T> NvramWriter for T
9where
10    T: Seek + Write + AsRawFd,
11{
12    fn erase_if_needed(&mut self, offset: u32, size: usize) {
13        if unsafe { mtd_mem_get_info(self.as_raw_fd(), &mut MtdInfoUser::default()) }.is_err() {
14            return;
15        }
16        let erase_info = EraseInfoUser {
17            start: offset,
18            length: size as u32,
19        };
20        unsafe {
21            mtd_mem_erase(self.as_raw_fd(), &erase_info).unwrap();
22        }
23    }
24
25    fn write_all(&mut self, offset: u32, buf: &[u8]) -> std::io::Result<()> {
26        self.seek(SeekFrom::Start(offset as u64))?;
27        self.write_all(buf)?;
28
29        Ok(())
30    }
31}
32
33#[repr(C)]
34pub struct EraseInfoUser {
35    start: u32,
36    length: u32,
37}
38
39#[repr(C)]
40#[derive(Default)]
41pub struct MtdInfoUser {
42    ty: u8,
43    flags: u32,
44    size: u32,
45    erasesize: u32,
46    writesize: u32,
47    oobsize: u32,
48    padding: u64,
49}
50
51nix::ioctl_write_ptr!(mtd_mem_erase, b'M', 2, EraseInfoUser);
52nix::ioctl_read!(mtd_mem_get_info, b'M', 1, MtdInfoUser);