diff --git a/Cargo.lock b/Cargo.lock index 3471e1a..a042c61 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -45,6 +45,8 @@ checksum = "4443176a9f2c162692bd3d352d745ef9413eec5782a80d8fd6f8a1ac692a07f7" name = "fat32" version = "0.1.0" dependencies = [ + "fs-macros", + "libsys", "vfs", ] @@ -113,6 +115,7 @@ dependencies = [ name = "memfs" version = "0.1.0" dependencies = [ + "fs-macros", "libsys", "vfs", ] diff --git a/fs/fat32/Cargo.toml b/fs/fat32/Cargo.toml index 595cb0a..7938472 100644 --- a/fs/fat32/Cargo.toml +++ b/fs/fat32/Cargo.toml @@ -7,3 +7,5 @@ edition = "2021" [dependencies] vfs = { path = "../vfs" } +fs-macros = { path = "../macros" } +libsys = { path = "../../libsys" } diff --git a/fs/fat32/src/data.rs b/fs/fat32/src/data.rs index 469ac83..19df264 100644 --- a/fs/fat32/src/data.rs +++ b/fs/fat32/src/data.rs @@ -1,4 +1,4 @@ -use libcommon::{read_le16, read_le32}; +use libsys::mem::{read_le16, read_le32}; #[derive(Debug)] pub struct Bpb { diff --git a/fs/fat32/src/dir.rs b/fs/fat32/src/dir.rs index 4966d06..86c7547 100644 --- a/fs/fat32/src/dir.rs +++ b/fs/fat32/src/dir.rs @@ -1,7 +1,11 @@ use crate::{Bpb, FileInode}; use alloc::{borrow::ToOwned, boxed::Box, string::String}; -use error::Errno; -use libcommon::{read_le16, read_le32}; +use libsys::{ + error::Errno, + ioctl::IoctlCmd, + mem::{read_le16, read_le32}, + stat::{OpenFlags, Stat}, +}; use vfs::{BlockDevice, Vnode, VnodeImpl, VnodeKind, VnodeRef}; pub struct DirectoryInode { @@ -26,20 +30,8 @@ pub struct Dirent { pub cluster: u32, } +#[auto_inode] impl VnodeImpl for DirectoryInode { - fn create( - &mut self, - _parent: VnodeRef, - _name: &str, - _kind: VnodeKind, - ) -> Result { - todo!() - } - - fn remove(&mut self, _parent: VnodeRef, _name: &str) -> Result<(), Errno> { - todo!() - } - fn lookup(&mut self, parent: VnodeRef, name: &str) -> Result { let fs = parent.fs().unwrap(); let dirent = { @@ -72,30 +64,6 @@ impl VnodeImpl for DirectoryInode { } Ok(vnode) } - - fn open(&mut self, _node: VnodeRef) -> Result { - todo!() - } - - fn close(&mut self, _node: VnodeRef) -> Result<(), Errno> { - todo!() - } - - fn read(&mut self, _node: VnodeRef, _pos: usize, _data: &mut [u8]) -> Result { - todo!() - } - - fn write(&mut self, _node: VnodeRef, _pos: usize, _data: &[u8]) -> Result { - todo!() - } - - fn truncate(&mut self, _node: VnodeRef, _size: usize) -> Result<(), Errno> { - todo!() - } - - fn size(&mut self, _node: VnodeRef) -> Result { - todo!() - } } impl Iterator for FatIterator<'_> { diff --git a/fs/fat32/src/file.rs b/fs/fat32/src/file.rs index 9d8a1f5..a0819e0 100644 --- a/fs/fat32/src/file.rs +++ b/fs/fat32/src/file.rs @@ -1,5 +1,9 @@ use crate::Bpb; -use error::Errno; +use libsys::{ + stat::{Stat, OpenFlags}, + ioctl::IoctlCmd, + error::Errno +}; use vfs::{VnodeImpl, VnodeKind, VnodeRef}; pub struct FileInode { @@ -7,27 +11,15 @@ pub struct FileInode { pub size: u32, } +#[auto_inode] impl VnodeImpl for FileInode { - fn create(&mut self, _at: VnodeRef, _name: &str, _kind: VnodeKind) -> Result { - panic!() - } - - fn remove(&mut self, _parent: VnodeRef, _name: &str) -> Result<(), Errno> { - panic!() - } - - fn lookup(&mut self, _parent: VnodeRef, _name: &str) -> Result { - panic!() - } - - fn open(&mut self, _node: VnodeRef) -> Result { + fn open(&mut self, _node: VnodeRef, flags: OpenFlags) -> Result { + if flags & OpenFlags::O_ACCESS != OpenFlags::O_RDONLY { + return Err(Errno::ReadOnly); + } Ok(0) } - fn close(&mut self, _node: VnodeRef) -> Result<(), Errno> { - todo!() - } - fn read(&mut self, node: VnodeRef, pos: usize, data: &mut [u8]) -> Result { let size = self.size as usize; if pos >= size { @@ -60,16 +52,4 @@ impl VnodeImpl for FileInode { Ok(off) } - - fn write(&mut self, _node: VnodeRef, _pos: usize, _data: &[u8]) -> Result { - todo!() - } - - fn truncate(&mut self, _node: VnodeRef, _size: usize) -> Result<(), Errno> { - todo!() - } - - fn size(&mut self, _node: VnodeRef) -> Result { - todo!() - } } diff --git a/fs/fat32/src/lib.rs b/fs/fat32/src/lib.rs index 27e31ce..7561394 100644 --- a/fs/fat32/src/lib.rs +++ b/fs/fat32/src/lib.rs @@ -4,13 +4,18 @@ #[macro_use] extern crate std; +#[macro_use] +extern crate fs_macros; + extern crate alloc; use alloc::{boxed::Box, rc::Rc}; use core::any::Any; use core::cell::{Ref, RefCell}; -use error::Errno; -use libcommon::read_le32; +use libsys::{ + mem::read_le32, + error::Errno, +}; use vfs::{BlockDevice, Filesystem, Vnode, VnodeKind, VnodeRef}; pub mod dir; diff --git a/fs/memfs/Cargo.toml b/fs/memfs/Cargo.toml index 0ee1a70..cbb1357 100644 --- a/fs/memfs/Cargo.toml +++ b/fs/memfs/Cargo.toml @@ -7,6 +7,7 @@ edition = "2021" [dependencies] vfs = { path = "../vfs" } +fs-macros = { path = "../macros" } libsys = { path = "../../libsys" } [features] diff --git a/fs/memfs/src/dir.rs b/fs/memfs/src/dir.rs index 4ee24e5..88b8764 100644 --- a/fs/memfs/src/dir.rs +++ b/fs/memfs/src/dir.rs @@ -1,12 +1,17 @@ use crate::{BlockAllocator, Bvec, FileInode}; use alloc::boxed::Box; -use libsys::error::Errno; -use vfs::{IoctlCmd, OpenFlags, Stat, Vnode, VnodeImpl, VnodeKind, VnodeRef}; +use libsys::{ + error::Errno, + stat::{OpenFlags, Stat}, + ioctl::IoctlCmd +}; +use vfs::{Vnode, VnodeImpl, VnodeKind, VnodeRef}; pub struct DirInode { alloc: A, } +#[auto_inode] impl VnodeImpl for DirInode { fn create( &mut self, @@ -30,44 +35,6 @@ impl VnodeImpl for DirInode { fn remove(&mut self, _parent: VnodeRef, _name: &str) -> Result<(), Errno> { Ok(()) } - - fn open(&mut self, _node: VnodeRef, _flags: OpenFlags) -> Result { - todo!() - } - - fn close(&mut self, _node: VnodeRef) -> Result<(), Errno> { - todo!() - } - - fn read(&mut self, _node: VnodeRef, _pos: usize, _data: &mut [u8]) -> Result { - todo!() - } - - fn write(&mut self, _node: VnodeRef, _pos: usize, _data: &[u8]) -> Result { - todo!() - } - - fn truncate(&mut self, _node: VnodeRef, _size: usize) -> Result<(), Errno> { - todo!() - } - - fn size(&mut self, _node: VnodeRef) -> Result { - todo!() - } - - fn stat(&mut self, _node: VnodeRef, _stat: &mut Stat) -> Result<(), Errno> { - todo!(); - } - - fn ioctl( - &mut self, - node: VnodeRef, - cmd: IoctlCmd, - ptr: usize, - len: usize, - ) -> Result { - todo!() - } } impl DirInode { diff --git a/fs/memfs/src/file.rs b/fs/memfs/src/file.rs index 639155b..7aab458 100644 --- a/fs/memfs/src/file.rs +++ b/fs/memfs/src/file.rs @@ -1,29 +1,17 @@ use crate::{BlockAllocator, Bvec}; -use libsys::error::Errno; -use vfs::{OpenFlags, Stat, VnodeImpl, VnodeKind, VnodeRef, IoctlCmd}; +use libsys::{ + error::Errno, + stat::{OpenFlags, Stat}, + ioctl::IoctlCmd +}; +use vfs::{VnodeImpl, VnodeKind, VnodeRef}; pub struct FileInode<'a, A: BlockAllocator + Copy + 'static> { data: Bvec<'a, A>, } +#[auto_inode] impl<'a, A: BlockAllocator + Copy + 'static> VnodeImpl for FileInode<'a, A> { - fn create( - &mut self, - _parent: VnodeRef, - _name: &str, - _kind: VnodeKind, - ) -> Result { - panic!() - } - - fn lookup(&mut self, _parent: VnodeRef, _name: &str) -> Result { - panic!() - } - - fn remove(&mut self, _parent: VnodeRef, _name: &str) -> Result<(), Errno> { - panic!() - } - fn open(&mut self, _node: VnodeRef, _mode: OpenFlags) -> Result { Ok(0) } @@ -54,16 +42,6 @@ impl<'a, A: BlockAllocator + Copy + 'static> VnodeImpl for FileInode<'a, A> { stat.mode = 0o755; Ok(()) } - - fn ioctl( - &mut self, - node: VnodeRef, - cmd: IoctlCmd, - ptr: usize, - len: usize, - ) -> Result { - todo!() - } } impl<'a, A: BlockAllocator + Copy + 'static> FileInode<'a, A> { diff --git a/fs/memfs/src/lib.rs b/fs/memfs/src/lib.rs index 5529c34..2e4a1b5 100644 --- a/fs/memfs/src/lib.rs +++ b/fs/memfs/src/lib.rs @@ -11,14 +11,18 @@ extern crate alloc; #[macro_use] extern crate std; +#[macro_use] +extern crate fs_macros; + use alloc::{boxed::Box, rc::Rc}; use core::any::Any; use core::cell::{Ref, RefCell}; use libsys::{ error::Errno, - path::{path_component_right, path_component_left} + path::{path_component_left, path_component_right}, + stat::FileMode, }; -use vfs::{BlockDevice, FileMode, Filesystem, Vnode, VnodeKind, VnodeRef}; +use vfs::{BlockDevice, Filesystem, Vnode, VnodeKind, VnodeRef}; mod block; pub use block::{BlockAllocator, BlockRef}; diff --git a/fs/vfs/src/char.rs b/fs/vfs/src/char.rs index fa143b0..a0af834 100644 --- a/fs/vfs/src/char.rs +++ b/fs/vfs/src/char.rs @@ -1,5 +1,9 @@ -use crate::{OpenFlags, Stat, VnodeImpl, VnodeKind, VnodeRef, IoctlCmd}; -use libsys::error::Errno; +use crate::{VnodeImpl, VnodeKind, VnodeRef}; +use libsys::{ + error::Errno, + stat::{OpenFlags, Stat}, + ioctl::IoctlCmd +}; /// Generic character device trait pub trait CharDevice { diff --git a/fs/vfs/src/ioctx.rs b/fs/vfs/src/ioctx.rs index a7650d9..3dc3e25 100644 --- a/fs/vfs/src/ioctx.rs +++ b/fs/vfs/src/ioctx.rs @@ -1,6 +1,7 @@ -use crate::{FileMode, FileRef, OpenFlags, VnodeKind, VnodeRef}; +use crate::{FileRef, VnodeKind, VnodeRef}; use libsys::{ error::Errno, + stat::{OpenFlags, FileMode}, path::{path_component_left, path_component_right}, }; diff --git a/fs/vfs/src/lib.rs b/fs/vfs/src/lib.rs index 374731a..81bbf7f 100644 --- a/fs/vfs/src/lib.rs +++ b/fs/vfs/src/lib.rs @@ -12,8 +12,8 @@ extern crate fs_macros; extern crate alloc; -pub use libsys::stat::{FileMode, OpenFlags, Stat}; -pub use libsys::ioctl::IoctlCmd; +// pub use libsys::stat::{FileMode, OpenFlags, Stat}; +// pub use libsys::ioctl::IoctlCmd; mod block; pub use block::BlockDevice; diff --git a/fs/vfs/src/node.rs b/fs/vfs/src/node.rs index 2893299..de5ea6a 100644 --- a/fs/vfs/src/node.rs +++ b/fs/vfs/src/node.rs @@ -1,8 +1,12 @@ -use crate::{File, FileMode, FileRef, Filesystem, IoctlCmd, OpenFlags, Stat}; +use crate::{File, FileRef, Filesystem}; use alloc::{borrow::ToOwned, boxed::Box, rc::Rc, string::String, vec::Vec}; use core::cell::{RefCell, RefMut}; use core::fmt; -use libsys::error::Errno; +use libsys::{ + error::Errno, + ioctl::IoctlCmd, + stat::{FileMode, OpenFlags, Stat}, +}; /// Convenience type alias for [Rc] pub type VnodeRef = Rc; @@ -405,7 +409,7 @@ impl fmt::Debug for Vnode { mod tests { use super::*; - use libsys::{stat::OpenFlags, ioctl::IoctlCmd, stat::Stat}; + use libsys::{ioctl::IoctlCmd, stat::OpenFlags, stat::Stat}; pub struct DummyInode; #[auto_inode] @@ -447,10 +451,13 @@ mod tests { root.set_data(Box::new(DummyInode {})); - let node = root.create("test", FileMode::default_dir(), VnodeKind::Directory).unwrap(); + let node = root + .create("test", FileMode::default_dir(), VnodeKind::Directory) + .unwrap(); assert_eq!( - root.create("test", FileMode::default_dir(), VnodeKind::Directory).unwrap_err(), + root.create("test", FileMode::default_dir(), VnodeKind::Directory) + .unwrap_err(), Errno::AlreadyExists ); diff --git a/kernel/src/dev/serial/pl011.rs b/kernel/src/dev/serial/pl011.rs index 154183f..7ea171d 100644 --- a/kernel/src/dev/serial/pl011.rs +++ b/kernel/src/dev/serial/pl011.rs @@ -17,7 +17,7 @@ use tock_registers::{ register_bitfields, register_structs, registers::{ReadOnly, ReadWrite, WriteOnly}, }; -use vfs::{CharDevice, IoctlCmd}; +use vfs::CharDevice; register_bitfields! { u32, diff --git a/kernel/src/init.rs b/kernel/src/init.rs index 0b5f408..19be0bc 100644 --- a/kernel/src/init.rs +++ b/kernel/src/init.rs @@ -5,7 +5,8 @@ use crate::fs::{devfs, MemfsBlockAlloc}; use crate::mem; use crate::proc::{elf, Process}; use memfs::Ramfs; -use vfs::{Filesystem, Ioctx, OpenFlags}; +use libsys::stat::OpenFlags; +use vfs::{Filesystem, Ioctx}; /// Kernel init process function #[inline(never)] diff --git a/kernel/src/syscall/mod.rs b/kernel/src/syscall/mod.rs index cb7f880..9061361 100644 --- a/kernel/src/syscall/mod.rs +++ b/kernel/src/syscall/mod.rs @@ -9,10 +9,11 @@ use core::time::Duration; use libsys::{ abi, error::Errno, - stat::{AT_EMPTY_PATH, AT_FDCWD}, + ioctl::IoctlCmd, + stat::{FileMode, OpenFlags, Stat, AT_EMPTY_PATH, AT_FDCWD}, traits::{Read, Write}, }; -use vfs::{FileMode, IoctlCmd, OpenFlags, Stat, VnodeRef}; +use vfs::VnodeRef; pub mod arg; pub use arg::*;