Skip to content
Snippets Groups Projects
Unverified Commit 66a5379f authored by Alex Lyon's avatar Alex Lyon
Browse files

Move null and zero from kernel space to user space

parent a9fa08fd
No related branches found
No related tags found
1 merge request!67Move null and zero from kernel space to user space
...@@ -21,12 +21,10 @@ use self::env::EnvScheme; ...@@ -21,12 +21,10 @@ use self::env::EnvScheme;
use self::initfs::InitFsScheme; use self::initfs::InitFsScheme;
use self::irq::IrqScheme; use self::irq::IrqScheme;
use self::memory::MemoryScheme; use self::memory::MemoryScheme;
use self::null::NullScheme;
use self::pipe::PipeScheme; use self::pipe::PipeScheme;
use self::root::RootScheme; use self::root::RootScheme;
use self::sys::SysScheme; use self::sys::SysScheme;
use self::time::TimeScheme; use self::time::TimeScheme;
use self::zero::ZeroScheme;
/// `debug:` - provides access to serial console /// `debug:` - provides access to serial console
pub mod debug; pub mod debug;
...@@ -50,9 +48,6 @@ pub mod live; ...@@ -50,9 +48,6 @@ pub mod live;
/// `memory:` - a scheme for accessing physical memory /// `memory:` - a scheme for accessing physical memory
pub mod memory; pub mod memory;
/// `null:` - a scheme that will discard all writes, and read no bytes
pub mod null;
/// `pipe:` - used internally by the kernel to implement `pipe` /// `pipe:` - used internally by the kernel to implement `pipe`
pub mod pipe; pub mod pipe;
...@@ -68,9 +63,6 @@ pub mod time; ...@@ -68,9 +63,6 @@ pub mod time;
/// A wrapper around userspace schemes, tightly dependent on `root` /// A wrapper around userspace schemes, tightly dependent on `root`
pub mod user; pub mod user;
/// `zero:` - a scheme that will discard all writes, and always fill read buffers with zero
pub mod zero;
/// Limit on number of schemes /// Limit on number of schemes
pub const SCHEME_MAX_SCHEMES: usize = 65536; pub const SCHEME_MAX_SCHEMES: usize = 65536;
...@@ -117,10 +109,8 @@ impl SchemeList { ...@@ -117,10 +109,8 @@ impl SchemeList {
self.insert(ns, Box::new(*b"event"), |_| Arc::new(Box::new(EventScheme::new()))).unwrap(); self.insert(ns, Box::new(*b"event"), |_| Arc::new(Box::new(EventScheme::new()))).unwrap();
self.insert(ns, Box::new(*b"env"), |_| Arc::new(Box::new(EnvScheme::new()))).unwrap(); self.insert(ns, Box::new(*b"env"), |_| Arc::new(Box::new(EnvScheme::new()))).unwrap();
self.insert(ns, Box::new(*b"memory"), |_| Arc::new(Box::new(MemoryScheme))).unwrap(); self.insert(ns, Box::new(*b"memory"), |_| Arc::new(Box::new(MemoryScheme))).unwrap();
self.insert(ns, Box::new(*b"null"), |_| Arc::new(Box::new(NullScheme))).unwrap();
self.insert(ns, Box::new(*b"sys"), |_| Arc::new(Box::new(SysScheme::new()))).unwrap(); self.insert(ns, Box::new(*b"sys"), |_| Arc::new(Box::new(SysScheme::new()))).unwrap();
self.insert(ns, Box::new(*b"time"), |scheme_id| Arc::new(Box::new(TimeScheme::new(scheme_id)))).unwrap(); self.insert(ns, Box::new(*b"time"), |scheme_id| Arc::new(Box::new(TimeScheme::new(scheme_id)))).unwrap();
self.insert(ns, Box::new(*b"zero"), |_| Arc::new(Box::new(ZeroScheme))).unwrap();
ns ns
} }
......
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> {
if ! buf.is_empty() {
return Err(Error::new(EINVAL));
}
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 fcntl(&self, _id: usize, _cmd: usize, _arg: usize) -> Result<usize> {
Ok(0)
}
fn fpath(&self, _id: usize, buf: &mut [u8]) -> Result<usize> {
let mut i = 0;
let scheme_path = b"null:";
while i < buf.len() && i < scheme_path.len() {
buf[i] = scheme_path[i];
i += 1;
}
Ok(i)
}
fn fsync(&self, _file: usize) -> Result<usize> {
Ok(0)
}
/// Close the file `number`
fn close(&self, _file: usize) -> Result<usize> {
Ok(0)
}
}
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> {
if ! buf.is_empty() {
return Err(Error::new(EINVAL));
}
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 fcntl(&self, _id: usize, _cmd: usize, _arg: usize) -> Result<usize> {
Ok(0)
}
fn fpath(&self, _id: usize, buf: &mut [u8]) -> Result<usize> {
let mut i = 0;
let scheme_path = b"zero:";
while i < buf.len() && i < scheme_path.len() {
buf[i] = scheme_path[i];
i += 1;
}
Ok(i)
}
fn fsync(&self, _file: usize) -> Result<usize> {
Ok(0)
}
/// Close the file `number`
fn close(&self, _file: usize) -> Result<usize> {
Ok(0)
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment