//! Shared file inode aliases and directory hardlink refusal. use super::*; use os_turkfs_namespace::{Error, Kind, LinkCount, Namespace}; pub fn run(allocator: &mut memory::FrameAllocator) -> Result<(), &'static str> { let frames_before = allocator.remaining_pages(); let mut ns = Namespace::<6>::new(6).map_err(|_| "k1660-namespace")?; let file = ns.create(1, b"file", Kind::File).map_err(|_| "k1660-file")?; let left = ns.create(1, b"left", Kind::Directory).map_err(|_| "k1660-left")?; let right = ns.create(1, b"right", Kind::Directory).map_err(|_| "k1660-right")?; let bits = ns.allocated_bits(); if file != 2 || ns.hardlink(1, b"file", left, b"alias") != Ok(2) || ns.lookup(1, b"file").map(|entry| entry.inode) != Some(file) || ns.lookup(left, b"alias").map(|entry| entry.inode) != Some(file) || ns.link_count(file) != 2 || ns.allocated_bits() != bits { return Err("k1660-alias"); } write_line("TURKOS/OS/K1660-LINKS: TWO-NAMES=INODE2 COUNT=2"); let before = ns; if ns.hardlink(1, b"left", right, b"bad-parent") != Err(Error::DirectoryLink) || ns != before || ns.lookup(right, b"bad-parent").is_some() || ns.link_count(left) != 1 { return Err("k1660-directory-link"); } write_line("TURKOS/OS/K1660-LINKS: DIRECTORY=REJECTED"); let mut terminal = LinkCount::new(u16::MAX).map_err(|_| "k1660-count")?; let before_count = terminal; if terminal.add() != Err(Error::LinkOverflow) || terminal != before_count { return Err("k1660-overflow"); } write_line("TURKOS/OS/K1660-LINKS: OVERFLOW=UNCHANGED"); if ns.allocated_bits() != bits || allocator.remaining_pages() != frames_before { return Err("k1660-ownership"); } write_line("TURKOS/OS/K1660-LINKS: OWNER=UNCHANGED FRAMES=UNCHANGED"); Ok(()) }