use crate::block_io::BlockDevice;
use crate::error::Result;
use crate::inode::Inode;
use crate::xattr;
pub fn read_all(
dev: &dyn BlockDevice,
inode: &Inode,
inode_raw: &[u8],
inode_size: u16,
block_size: u32,
) -> Result<Vec<u8>> {
let total = inode.size as usize;
let inline_max = 60;
let from_block = total.min(inline_max);
let mut out = Vec::with_capacity(total);
out.extend_from_slice(&inode.block[..from_block]);
if total <= inline_max {
return Ok(out);
}
if let Some(extra) = xattr::get(dev, inode, inode_raw, inode_size, block_size, "system.data")? {
let need = total - inline_max;
let take = extra.len().min(need);
out.extend_from_slice(&extra[..take]);
}
Ok(out)
}
pub fn read_range(
dev: &dyn BlockDevice,
inode: &Inode,
inode_raw: &[u8],
inode_size: u16,
block_size: u32,
offset: u64,
dst: &mut [u8],
) -> Result<usize> {
let total = inode.size;
if offset >= total {
return Ok(0);
}
let full = read_all(dev, inode, inode_raw, inode_size, block_size)?;
let want = ((total - offset) as usize).min(dst.len());
let avail = full.len().saturating_sub(offset as usize);
let n = want.min(avail);
dst[..n].copy_from_slice(&full[offset as usize..offset as usize + n]);
Ok(n)
}