Lazy static init of schemes

This commit is contained in:
Jeremy Soller 2016-08-16 11:04:14 -06:00
parent 7a1c263bc1
commit d383cfb595
4 changed files with 40 additions and 8 deletions

View file

@ -1,7 +1,5 @@
//! Filesystem syscalls
use scheme::Scheme;
use super::{Error, Result};
/// Read syscall
@ -28,8 +26,24 @@ pub fn write(fd: usize, buf: &[u8]) -> Result<usize> {
/// Open syscall
pub fn open(path: &[u8], flags: usize) -> Result<usize> {
println!("Open {:?}: {:X}", ::core::str::from_utf8(path), flags);
let file = unsafe { &mut ::scheme::SCHEME }.open(path, flags)?;
let mut parts = path.splitn(2, |&b| b == b':');
let namespace_opt = parts.next();
let reference_opt = parts.next();
println!("Open namespace {:?} reference {:?}: {:X}", namespace_opt.map(::core::str::from_utf8), reference_opt.map(::core::str::from_utf8), flags);
let file = {
if let Some(namespace) = namespace_opt {
let schemes = ::scheme::SCHEMES.read();
if let Some(scheme_mutex) = schemes.get(namespace) {
scheme_mutex.lock().open(reference_opt.unwrap_or(b""), flags)
} else {
Err(Error::NoEntry)
}
} else {
Err(Error::NoEntry)
}
}?;
if let Some(fd) = unsafe { &mut ::context::CONTEXT }.add_file(::context::file::File {
scheme: 0,
number: file