From 7952e3ed633af97f30b710b75d92c9ed3b6f3766 Mon Sep 17 00:00:00 2001
From: Jeremy Soller <jackpot51@gmail.com>
Date: Mon, 31 Oct 2016 21:54:56 -0600
Subject: [PATCH] Add null: and zero:

---
 scheme/mod.rs  | 10 ++++++++++
 scheme/null.rs | 37 +++++++++++++++++++++++++++++++++++++
 scheme/zero.rs | 42 ++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 89 insertions(+)
 create mode 100644 scheme/null.rs
 create mode 100644 scheme/zero.rs

diff --git a/scheme/mod.rs b/scheme/mod.rs
index 5e2c0579..96e2ef91 100644
--- a/scheme/mod.rs
+++ b/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<SchemeList> {
     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/scheme/null.rs b/scheme/null.rs
new file mode 100644
index 00000000..690c16c4
--- /dev/null
+++ b/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<usize> {
+        Ok(0)
+    }
+
+    fn dup(&self, _file: usize, _buf: &[u8]) -> Result<usize> {
+        Ok(0)
+    }
+
+    /// Read the file `number` into the `buffer`
+    ///
+    /// Returns the number of bytes read
+    fn read(&self, _file: usize, _buf: &mut [u8]) -> Result<usize> {
+        Ok(0)
+    }
+
+    /// Write the `buffer` to the `file`
+    ///
+    /// Returns the number of bytes written
+    fn write(&self, _file: usize, buffer: &[u8]) -> Result<usize> {
+        Ok(buffer.len())
+    }
+
+    fn fsync(&self, _file: usize) -> Result<usize> {
+        Ok(0)
+    }
+
+    /// Close the file `number`
+    fn close(&self, _file: usize) -> Result<usize> {
+        Ok(0)
+    }
+}
diff --git a/scheme/zero.rs b/scheme/zero.rs
new file mode 100644
index 00000000..90175cbd
--- /dev/null
+++ b/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<usize> {
+        Ok(0)
+    }
+
+    fn dup(&self, _file: usize, _buf: &[u8]) -> Result<usize> {
+        Ok(0)
+    }
+
+    /// Read the file `number` into the `buffer`
+    ///
+    /// Returns the number of bytes read
+    fn read(&self, _file: usize, buf: &mut [u8]) -> Result<usize> {
+        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<usize> {
+        Ok(buffer.len())
+    }
+
+    fn fsync(&self, _file: usize) -> Result<usize> {
+        Ok(0)
+    }
+
+    /// Close the file `number`
+    fn close(&self, _file: usize) -> Result<usize> {
+        Ok(0)
+    }
+}
-- 
GitLab