Decompress a full QCOW2 cluster from compressed data. Returns a `cluster_size` byte buffer with the decompressed cluster content. Fails if the decoder does not produce exactly `cluster_size` bytes.
(
compressed: &[u8],
cluster_size: usize,
decoder: &dyn Decoder,
)
| 59 | /// content. Fails if the decoder does not produce exactly `cluster_size` |
| 60 | /// bytes. |
| 61 | pub fn decompress_cluster( |
| 62 | compressed: &[u8], |
| 63 | cluster_size: usize, |
| 64 | decoder: &dyn Decoder, |
| 65 | ) -> io::Result<Vec<u8>> { |
| 66 | let mut decompressed = vec![0u8; cluster_size]; |
| 67 | let n = decoder |
| 68 | .decode(compressed, &mut decompressed) |
| 69 | .map_err(|_| io::Error::from_raw_os_error(libc::EIO))?; |
| 70 | if n != cluster_size { |
| 71 | return Err(io::Error::from_raw_os_error(libc::EIO)); |
| 72 | } |
| 73 | Ok(decompressed) |
| 74 | } |
| 75 | |
| 76 | /// Write all bytes to fd at offset, looping on short writes. |
| 77 | pub fn pwrite_all(fd: RawFd, buf: &[u8], offset: u64) -> io::Result<()> { |