diff --git a/Makefile b/Makefile index 4459ca8..77f8c74 100644 --- a/Makefile +++ b/Makefile @@ -10,7 +10,7 @@ bochs: build/harddrive.bin bochs -f bochs.$(ARCH) qemu: build/harddrive.bin - qemu-system-$(ARCH) -serial mon:stdio -drive file=$<,format=raw,index=0,media=disk + qemu-system-$(ARCH) -serial mon:stdio -drive file=$<,format=raw,index=0,media=disk -nographic FORCE: diff --git a/kernel/lib.rs b/kernel/lib.rs index 929f7b3..826fe95 100644 --- a/kernel/lib.rs +++ b/kernel/lib.rs @@ -90,6 +90,9 @@ pub mod context; /// Intrinsics for panic handling pub mod panic; +/// Schemes, filesystem handlers +pub mod scheme; + /// Syscall handlers pub mod syscall; @@ -101,9 +104,9 @@ pub mod tests; pub extern fn kmain() { println!("TEST"); - println!("{:?}", syscall::open(b"stdin", 0)); - println!("{:?}", syscall::open(b"stdout", 0)); - println!("{:?}", syscall::open(b"stderr", 0)); + println!("{:?}", syscall::open(b"debug:", 0)); + println!("{:?}", syscall::open(b"debug:", 0)); + println!("{:?}", syscall::open(b"debug:", 0)); loop { unsafe { diff --git a/kernel/scheme/debug.rs b/kernel/scheme/debug.rs new file mode 100644 index 0000000..8abb059 --- /dev/null +++ b/kernel/scheme/debug.rs @@ -0,0 +1,33 @@ +use core::str; +use syscall::Result; +use super::Scheme; + +pub struct DebugScheme; + +impl Scheme for DebugScheme { + fn open(&mut self, path: &[u8], flags: usize) -> Result { + println!("DebugScheme::open: {}", unsafe { str::from_utf8_unchecked(path) }); + Ok(0) + } + + /// Read the file `number` into the `buffer` + /// + /// Returns the number of bytes read + fn read(&mut self, file: usize, buffer: &mut [u8]) -> Result { + Ok(0) + } + + /// Write the `buffer` to the `file` + /// + /// Returns the number of bytes written + fn write(&mut self, file: usize, buffer: &[u8]) -> Result { + //TODO: Write bytes, do not convert to str + print!("{}", unsafe { str::from_utf8_unchecked(buffer) }); + Ok(buffer.len()) + } + + /// Close the file `number` + fn close(&mut self, file: usize) -> Result<()> { + Ok(()) + } +} diff --git a/kernel/scheme/mod.rs b/kernel/scheme/mod.rs index 5a44354..b99cc72 100644 --- a/kernel/scheme/mod.rs +++ b/kernel/scheme/mod.rs @@ -1,12 +1,38 @@ -/// A scheme is a primitive for handling filesystem syscalls in Redox. -/// Schemes accept paths from the kernel for `open`, and file descriptors that they generate -/// are then passed for operations like `close`, `read`, `write`, etc. -/// -/// The kernel validates paths and file descriptors before they are passed to schemes, -/// also stripping the scheme identifier of paths if necessary. +//! # Schemes +//! A scheme is a primitive for handling filesystem syscalls in Redox. +//! Schemes accept paths from the kernel for `open`, and file descriptors that they generate +//! are then passed for operations like `close`, `read`, `write`, etc. +//! +//! The kernel validates paths and file descriptors before they are passed to schemes, +//! also stripping the scheme identifier of paths if necessary. + +use syscall::Result; + +use self::debug::DebugScheme; + +/// Debug scheme +pub mod debug; + +/// Schemes list +pub static mut SCHEME: DebugScheme = DebugScheme; + +/// A scheme trait, implemented by a scheme handler pub trait Scheme { /// Open the file at `path` with `flags`. /// /// Returns a file descriptor or an error - fn open(path: &str, flags: usize) -> Result; + fn open(&mut self, path: &[u8], flags: usize) -> Result; + + /// Read the file `number` into the `buffer` + /// + /// Returns the number of bytes read + fn read(&mut self, file: usize, buffer: &mut [u8]) -> Result; + + /// Write the `buffer` to the `file` + /// + /// Returns the number of bytes written + fn write(&mut self, file: usize, buffer: &[u8]) -> Result; + + /// Close the file `number` + fn close(&mut self, file: usize) -> Result<()>; } diff --git a/kernel/syscall/fs.rs b/kernel/syscall/fs.rs index 25735e4..e632b75 100644 --- a/kernel/syscall/fs.rs +++ b/kernel/syscall/fs.rs @@ -1,5 +1,7 @@ //! Filesystem syscalls +use scheme::Scheme; + use super::{Error, Result}; /// Read syscall @@ -27,9 +29,10 @@ pub fn write(fd: usize, buf: &[u8]) -> Result { /// Open syscall pub fn open(path: &[u8], flags: usize) -> Result { println!("Open {:?}: {:X}", ::core::str::from_utf8(path), flags); + let file = unsafe { &mut ::scheme::SCHEME }.open(path, flags)?; if let Some(fd) = unsafe { &mut ::context::CONTEXT }.add_file(::context::file::File { scheme: 0, - number: 0 + number: file }) { Ok(fd) } else {