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);