From 56ac46e933eb2eb66e77eafba252fd5ad3e81110 Mon Sep 17 00:00:00 2001 From: Jeremy Soller Date: Mon, 31 Oct 2016 21:54:56 -0600 Subject: [PATCH] Add null: and zero: --- kernel/scheme/mod.rs | 10 ++++++++++ kernel/scheme/null.rs | 37 +++++++++++++++++++++++++++++++++++++ kernel/scheme/zero.rs | 42 ++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 89 insertions(+) create mode 100644 kernel/scheme/null.rs create mode 100644 kernel/scheme/zero.rs diff --git a/kernel/scheme/mod.rs b/kernel/scheme/mod.rs index 5e2c057..96e2ef9 100644 --- a/kernel/scheme/mod.rs +++ b/kernel/scheme/mod.rs @@ -20,9 +20,11 @@ use self::event::EventScheme; use self::env::EnvScheme; use self::initfs::InitFsScheme; use self::irq::{IRQ_SCHEME_ID, IrqScheme}; +use self::null::NullScheme; use self::pipe::{PIPE_SCHEME_ID, PipeScheme}; use self::root::{ROOT_SCHEME_ID, RootScheme}; use self::sys::SysScheme; +use self::zero::ZeroScheme; /// Debug scheme pub mod debug; @@ -39,6 +41,9 @@ pub mod initfs; /// IRQ handling pub mod irq; +/// Null scheme +pub mod null; + /// Anonymouse pipe pub mod pipe; @@ -51,6 +56,9 @@ pub mod sys; /// Userspace schemes pub mod user; +/// Zero scheme +pub mod zero; + /// Limit on number of schemes pub const SCHEME_MAX_SCHEMES: usize = 65536; @@ -132,8 +140,10 @@ fn init_schemes() -> RwLock { list.insert(Box::new(*b"env"), Arc::new(Box::new(EnvScheme::new()))).expect("failed to insert env scheme"); list.insert(Box::new(*b"initfs"), Arc::new(Box::new(InitFsScheme::new()))).expect("failed to insert initfs scheme"); IRQ_SCHEME_ID.store(list.insert(Box::new(*b"irq"), Arc::new(Box::new(IrqScheme))).expect("failed to insert irq scheme"), Ordering::SeqCst); + list.insert(Box::new(*b"null"), Arc::new(Box::new(NullScheme))).expect("failed to insert null scheme"); PIPE_SCHEME_ID.store(list.insert(Box::new(*b"pipe"), Arc::new(Box::new(PipeScheme))).expect("failed to insert pipe scheme"), Ordering::SeqCst); list.insert(Box::new(*b"sys"), Arc::new(Box::new(SysScheme::new()))).expect("failed to insert sys scheme"); + list.insert(Box::new(*b"zero"), Arc::new(Box::new(ZeroScheme))).expect("failed to insert zero scheme"); RwLock::new(list) } diff --git a/kernel/scheme/null.rs b/kernel/scheme/null.rs new file mode 100644 index 0000000..690c16c --- /dev/null +++ b/kernel/scheme/null.rs @@ -0,0 +1,37 @@ +use syscall::error::*; +use syscall::scheme::Scheme; + +pub struct NullScheme; + +impl Scheme for NullScheme { + fn open(&self, _path: &[u8], _flags: usize, _uid: u32, _gid: u32) -> Result { + Ok(0) + } + + fn dup(&self, _file: usize, _buf: &[u8]) -> Result { + Ok(0) + } + + /// Read the file `number` into the `buffer` + /// + /// Returns the number of bytes read + fn read(&self, _file: usize, _buf: &mut [u8]) -> Result { + Ok(0) + } + + /// Write the `buffer` to the `file` + /// + /// Returns the number of bytes written + fn write(&self, _file: usize, buffer: &[u8]) -> Result { + Ok(buffer.len()) + } + + fn fsync(&self, _file: usize) -> Result { + Ok(0) + } + + /// Close the file `number` + fn close(&self, _file: usize) -> Result { + Ok(0) + } +} diff --git a/kernel/scheme/zero.rs b/kernel/scheme/zero.rs new file mode 100644 index 0000000..90175cb --- /dev/null +++ b/kernel/scheme/zero.rs @@ -0,0 +1,42 @@ +use syscall::error::*; +use syscall::scheme::Scheme; + +pub struct ZeroScheme; + +impl Scheme for ZeroScheme { + fn open(&self, _path: &[u8], _flags: usize, _uid: u32, _gid: u32) -> Result { + Ok(0) + } + + fn dup(&self, _file: usize, _buf: &[u8]) -> Result { + Ok(0) + } + + /// Read the file `number` into the `buffer` + /// + /// Returns the number of bytes read + fn read(&self, _file: usize, buf: &mut [u8]) -> Result { + let mut i = 0; + while i < buf.len() { + buf[i] = 0; + i += 1; + } + Ok(i) + } + + /// Write the `buffer` to the `file` + /// + /// Returns the number of bytes written + fn write(&self, _file: usize, buffer: &[u8]) -> Result { + Ok(buffer.len()) + } + + fn fsync(&self, _file: usize) -> Result { + Ok(0) + } + + /// Close the file `number` + fn close(&self, _file: usize) -> Result { + Ok(0) + } +}