//! Three-record inode integrity guest probe. use super::*; use os_vfs_inode_table::{Error, Inode, Kind, Table}; fn rows() -> [Inode; 3] { [ Inode {number: 1, kind: Kind::Directory, links: 1, size: 0, first_block: 0, block_count: 0, reserved: 0}, Inode {number: 2, kind: Kind::Regular, links: 1, size: 513, first_block: 100, block_count: 2, reserved: 0}, Inode {number: 3, kind: Kind::Regular, links: 1, size: 1, first_block: 200, block_count: 1, reserved: 0}, ] } pub fn run(allocator: &mut memory::FrameAllocator) -> Result<(), &'static str> { let frames_before = allocator.remaining_pages(); let verified = Table::validate(rows(), 2048) .map_err(|_| "k1610-valid-table")?; if verified.disk_blocks() != 2048 || verified.get(1).map(|row| row.kind) != Ok(Kind::Directory) || verified.get(2).map(|row| row.size) != Ok(513) || verified.get(3).map(|row| row.first_block) != Ok(200) { return Err("k1610-lookup"); } write_line("TURKOS/OS/K1610-INODE: ROOT=1 FILES=2"); let mut duplicate = rows(); duplicate[2].number = 2; if Table::validate(duplicate, 2048) != Err(Error::DuplicateInode) { return Err("k1610-duplicate"); } write_line("TURKOS/OS/K1610-INODE: DUPLICATE=REJECTED"); let mut overlap = rows(); overlap[2].first_block = 101; if Table::validate(overlap, 2048) != Err(Error::OverlappingExtent) { return Err("k1610-overlap"); } write_line("TURKOS/OS/K1610-INODE: OVERLAP=REJECTED"); let mut corrupt_size = rows(); corrupt_size[1].size = 1025; if Table::validate(corrupt_size, 2048) != Err(Error::CorruptSize) { return Err("k1610-size"); } write_line("TURKOS/OS/K1610-INODE: SIZE=REJECTED"); let mut outside = rows(); outside[2].first_block = 2048; if Table::validate(outside, 2048) != Err(Error::BadExtent) || allocator.remaining_pages() != frames_before { return Err("k1610-geometry"); } write_line("TURKOS/OS/K1610-INODE: GEOMETRY=REJECTED FRAMES=UNCHANGED"); Ok(()) }