1 | use std::io; |
2 | |
3 | pub fn extract_noattr(result: io::Result<Vec<u8>>) -> io::Result<Option<Vec<u8>>> { |
4 | result.map(Some).or_else(|e: Error| { |
5 | if e.raw_os_error() == Some(crate::sys::ENOATTR) { |
6 | Ok(None) |
7 | } else { |
8 | Err(e) |
9 | } |
10 | }) |
11 | } |
12 | |
13 | #[allow (dead_code)] |
14 | pub fn allocate_loop<E, F: FnMut(&mut [u8]) -> Result<usize, E>>(mut f: F) -> io::Result<Vec<u8>> |
15 | where |
16 | io::Error: From<E>, |
17 | { |
18 | let mut vec: Vec<u8> = Vec::new(); |
19 | loop { |
20 | let ret: usize = f(&mut [])?; |
21 | vec.resize(new_len:ret, value:0); |
22 | |
23 | match f(&mut vec) { |
24 | Ok(size: usize) => { |
25 | vec.truncate(len:size); |
26 | vec.shrink_to_fit(); |
27 | return Ok(vec); |
28 | } |
29 | |
30 | Err(e: E) => { |
31 | let err: io::Error = e.into(); |
32 | if err.raw_os_error() == Some(crate::sys::ERANGE) { |
33 | continue; |
34 | } else { |
35 | return Err(err); |
36 | } |
37 | } |
38 | } |
39 | } |
40 | } |
41 | |