gpt_partition/
write_dev_with_gpt_img.rs1use 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 }