gpt_partition/
write_dev_with_gpt_img.rs

1use std::io::{Write};
2
3trait ReadTrait {
4    fn read_vec(&mut self, size: isize) -> Result<Vec<u8>, std::io::Error>;
5    }
6
7impl<R: std::io::Read> ReadTrait for R {
8    fn read_vec(&mut self, size: isize) -> Result<Vec<u8>, std::io::Error> {
9        let mut vec:Vec<u8> = Vec::new();
10        if size < 0 {
11            self.read_to_end(&mut vec)?;
12            }
13        else if size > 0 {
14            vec = Vec::with_capacity(size as usize);
15            unsafe {vec.set_len(size as usize);}
16            let mut buf = &mut vec[..];
17            let mut readed = 0;
18            while !buf.is_empty() {
19                match self.read(buf) {
20                    Ok(0) => break,
21                    Ok(n) => {
22                        readed += n;
23                        let tmp = buf;
24                        buf = &mut tmp[n..];
25                        }
26                    Err(e) => return Err(e),
27                    }
28                }
29            unsafe {vec.set_len(readed);}
30            }
31        return Ok(vec);
32        }
33    }
34
35
36pub fn write_dev_with_gpt_img<R: std::io::Read>(gpt_img_reader: &mut R, dev_path: &str) -> Result<(), std::io::Error> {
37    let mut fdev = std::fs::File::create(dev_path)?;
38    loop {
39        let data = gpt_img_reader.read_vec(9 * 1024 * 1024)?;
40        if data.len() == 0 {break;}
41        fdev.write_all(&data)?;
42        }
43    fdev.flush()?;
44    Ok(())
45    }