use crate::error::{Error, Result};
use crate::file_io;
use crate::fs::Filesystem;
use crate::inode::{Inode, InodeFlags};
pub fn read_value_inode(fs: &Filesystem, value_inum: u32) -> Result<Vec<u8>> {
if value_inum == 0 {
return Err(Error::InvalidInode(value_inum));
}
let raw = fs.read_inode_raw(value_inum)?;
let inode = Inode::parse(&raw)?;
if inode.flags & InodeFlags::EA_INODE.bits() == 0 {
return Err(Error::Corrupt(
"e_value_inum target missing EA_INODE flag (0x200000)",
));
}
if inode.flags & InodeFlags::INLINE_DATA.bits() != 0 {
return file_io::read_inline(fs, &inode, &raw);
}
file_io::read_all(fs, &inode)
}
#[cfg(test)]
mod tests {
use super::*;
use crate::inode::InodeFlags;
#[test]
fn ea_inode_flag_bit_value() {
assert_eq!(InodeFlags::EA_INODE.bits(), 0x0020_0000);
}
#[test]
fn zero_inode_is_rejected() {
let err = Error::InvalidInode(0);
match err {
Error::InvalidInode(n) => assert_eq!(n, 0),
_ => panic!(),
}
}
}