use crate::{BlockAllocator, Bvec, FileInode}; use alloc::boxed::Box; use libsys::{ error::Errno, stat::{DirectoryEntry, OpenFlags, Stat}, }; use vfs::{Vnode, VnodeImpl, VnodeKind, VnodeRef}; pub struct DirInode { alloc: A, } #[auto_inode] impl VnodeImpl for DirInode { fn create( &mut self, _parent: VnodeRef, name: &str, kind: VnodeKind, ) -> Result { let vnode = Vnode::new(name, kind, Vnode::SEEKABLE | Vnode::CACHE_READDIR); match kind { VnodeKind::Directory => vnode.set_data(Box::new(DirInode { alloc: self.alloc })), VnodeKind::Regular => vnode.set_data(Box::new(FileInode::new(Bvec::new(self.alloc)))), _ => todo!(), } Ok(vnode) } fn lookup(&mut self, _parent: VnodeRef, _name: &str) -> Result { Err(Errno::DoesNotExist) } fn remove(&mut self, _parent: VnodeRef, _name: &str) -> Result<(), Errno> { Ok(()) } fn stat(&mut self, node: VnodeRef) -> Result { let props = node.props(); Ok(Stat { size: 0, blksize: 4096, mode: props.mode }) } } impl DirInode { pub const fn new(alloc: A) -> Self { Self { alloc } } }