diff --git a/scheme/image.rs b/scheme/image.rs index 586e9638a3e39e69fcf5a4ef2c1eeb70efd630c9..c60cd5813e335539274fd7e0fa08ad6900b6fc96 100644 --- a/scheme/image.rs +++ b/scheme/image.rs @@ -30,12 +30,14 @@ impl Image { impl Disk for Image { fn read_at(&mut self, block: u64, buffer: &mut [u8]) -> Result<usize> { + //println!("Image read at {}", block); try_disk!(self.file.seek(SeekFrom::Start(block * 512))); let count = try_disk!(self.file.read(buffer)); Ok(count) } fn write_at(&mut self, block: u64, buffer: &[u8]) -> Result<usize> { + //println!("Image write at {}", block); try_disk!(self.file.seek(SeekFrom::Start(block * 512))); let count = try_disk!(self.file.write(buffer)); Ok(count) diff --git a/scheme/main.rs b/scheme/main.rs index 86b0a9a1dd9fadc881fc798fc7564339c5128c64..3755c8d85aa76fec4cad04f1568e3796175700e6 100644 --- a/scheme/main.rs +++ b/scheme/main.rs @@ -6,6 +6,8 @@ use std::env; use std::fs::File; use std::io::{Read, Write}; use std::mem::size_of; +use std::sync::{Arc, Mutex}; +use std::thread; use image::Image; use scheme::FileScheme; @@ -18,32 +20,55 @@ pub mod image; pub mod resource; pub mod scheme; -fn scheme(fs: FileSystem) { - //In order to handle example:, we create :example - let mut scheme = FileScheme::new(fs); - let mut socket = File::create(":redoxfs").unwrap(); - loop { - let mut packet = Packet::default(); - while socket.read(&mut packet).unwrap() == size_of::<Packet>() { - scheme.handle(&mut packet); - socket.write(&packet).unwrap(); - } - } +enum Status { + Starting, + Running, + Stopping } fn main() { - let mut args = env::args(); - if let Some(path) = args.nth(1) { - //Open an existing image - match Image::open(&path) { - Ok(disk) => match FileSystem::open(Box::new(disk)) { - Ok(filesystem) => { - println!("redoxfs: opened filesystem {}", path); - scheme(filesystem); + if let Some(path) = env::args().nth(1) { + let status_mutex = Arc::new(Mutex::new(Status::Starting)); + + let status_daemon = status_mutex.clone(); + thread::spawn(move || { + match Image::open(&path) { + Ok(disk) => match FileSystem::open(Box::new(disk)) { + Ok(fs) => match File::create(":file") { + Ok(mut socket) => { + println!("redoxfs: mounted filesystem {} on file:", path); + + *status_daemon.lock().unwrap() = Status::Running; + + let mut scheme = FileScheme::new(fs); + loop { + let mut packet = Packet::default(); + while socket.read(&mut packet).unwrap() == size_of::<Packet>() { + println!("Read {:?}", packet); + scheme.handle(&mut packet); + println!("Write {:?}", packet); + socket.write(&packet).unwrap(); + } + } + }, + Err(err) => println!("redoxfs: failed to create file scheme: {}", err) + }, + Err(err) => println!("redoxfs: failed to open filesystem {}: {}", path, err) }, - Err(err) => println!("redoxfs: failed to open filesystem {}: {}", path, err) - }, - Err(err) => println!("redoxfs: failed to open image {}: {}", path, err) + Err(err) => println!("redoxfs: failed to open image {}: {}", path, err) + } + + *status_daemon.lock().unwrap() = Status::Stopping; + }); + + 'waiting: loop { + match *status_mutex.lock().unwrap() { + Status::Starting => (), + Status::Running => break 'waiting, + Status::Stopping => break 'waiting, + } + + thread::sleep_ms(30); } } else { println!("redoxfs: no disk image provided"); diff --git a/scheme/scheme.rs b/scheme/scheme.rs index a90975c5b74e9b200c6186d529907cfa5b7bf40e..7c46f55e76dcc91192b070e5ec45d19918558810 100644 --- a/scheme/scheme.rs +++ b/scheme/scheme.rs @@ -28,6 +28,8 @@ impl Scheme for FileScheme { fn open(&mut self, url: &str, flags: usize, _mode: usize) -> Result<usize> { let path = url.split(':').nth(1).unwrap_or("").trim_matches('/'); + println!("Open '{}' {:X}", path, flags); + let mut nodes = Vec::new(); let node_result = self.fs.path_nodes(path, &mut nodes); @@ -97,6 +99,8 @@ impl Scheme for FileScheme { fn mkdir(&mut self, url: &str, _mode: usize) -> Result<usize> { let path = url.split(':').nth(1).unwrap_or("").trim_matches('/'); + println!("Mkdir '{}'", path); + let mut nodes = Vec::new(); match self.fs.path_nodes(path, &mut nodes) { Ok(_node) => Err(Error::new(EEXIST)), @@ -125,6 +129,8 @@ impl Scheme for FileScheme { fn rmdir(&mut self, url: &str) -> Result<usize> { let path = url.split(':').nth(1).unwrap_or("").trim_matches('/'); + println!("Rmdir '{}'", path); + let mut nodes = Vec::new(); let child = try!(self.fs.path_nodes(path, &mut nodes)); if let Some(parent) = nodes.last() { @@ -145,6 +151,8 @@ impl Scheme for FileScheme { fn unlink(&mut self, url: &str) -> Result<usize> { let path = url.split(':').nth(1).unwrap_or("").trim_matches('/'); + println!("Unlink '{}'", path); + let mut nodes = Vec::new(); let child = try!(self.fs.path_nodes(path, &mut nodes)); if let Some(parent) = nodes.last() { @@ -165,6 +173,8 @@ impl Scheme for FileScheme { /* Resource operations */ #[allow(unused_variables)] fn read(&mut self, id: usize, buf: &mut [u8]) -> Result<usize> { + println!("Read {}, {:X} {}", id, buf.as_ptr() as usize, buf.len()); + if let Some(mut file) = self.files.get_mut(&id) { file.read(buf) } else { @@ -173,6 +183,7 @@ impl Scheme for FileScheme { } fn write(&mut self, id: usize, buf: &[u8]) -> Result<usize> { + println!("Write {}, {:X} {}", id, buf.as_ptr() as usize, buf.len()); if let Some(mut file) = self.files.get_mut(&id) { file.write(buf) } else { @@ -181,6 +192,7 @@ impl Scheme for FileScheme { } fn seek(&mut self, id: usize, pos: usize, whence: usize) -> Result<usize> { + println!("Seek {}, {} {}", id, pos, whence); if let Some(mut file) = self.files.get_mut(&id) { file.seek(pos, whence) } else { @@ -189,6 +201,7 @@ impl Scheme for FileScheme { } fn fpath(&self, id: usize, buf: &mut [u8]) -> Result<usize> { + println!("Fpath {}, {:X} {}", id, buf.as_ptr() as usize, buf.len()); if let Some(file) = self.files.get(&id) { file.path(buf) } else { @@ -197,7 +210,7 @@ impl Scheme for FileScheme { } fn fstat(&self, id: usize, stat: &mut Stat) -> Result<usize> { - println!("fstat {}, {:X}", id, stat as *mut Stat as usize); + println!("Fstat {}, {:X}", id, stat as *mut Stat as usize); if let Some(file) = self.files.get(&id) { file.stat(stat) } else { @@ -206,6 +219,7 @@ impl Scheme for FileScheme { } fn fsync(&mut self, id: usize) -> Result<usize> { + println!("Fsync {}", id); if let Some(mut file) = self.files.get_mut(&id) { file.sync() } else { @@ -214,6 +228,7 @@ impl Scheme for FileScheme { } fn ftruncate(&mut self, id: usize, len: usize) -> Result<usize> { + println!("Ftruncate {}, {}", id, len); if let Some(mut file) = self.files.get_mut(&id) { file.truncate(len) } else { @@ -222,6 +237,7 @@ impl Scheme for FileScheme { } fn close(&mut self, id: usize) -> Result<usize> { + println!("Close {}", id); if self.files.remove(&id).is_some() { Ok(0) } else { diff --git a/src/ex_node.rs b/src/ex_node.rs index 740c794e3be035bffd72132ae94912a2b3efedc3..d9aa8f594baefcd577c04ae0f3caa2e6acb9fb26 100644 --- a/src/ex_node.rs +++ b/src/ex_node.rs @@ -1,6 +1,4 @@ -use collections::Vec; - -use core::{fmt, mem, ops, slice}; +use std::{fmt, mem, ops, slice}; use super::Extent; diff --git a/src/extent.rs b/src/extent.rs index 64baf587396d807cb0790f43ce2635f0eb90207f..ac4718eebeb2c9758a16331f4c26655adfd41892 100644 --- a/src/extent.rs +++ b/src/extent.rs @@ -1,4 +1,4 @@ -use core::cmp::min; +use std::cmp::min; pub struct BlockIter { block: u64, diff --git a/src/filesystem.rs b/src/filesystem.rs index 19c8750e5bc1455cd52097defb6845e555c5075d..a8f42319b43fb0ac6328784a2f8db94944f8c3c3 100644 --- a/src/filesystem.rs +++ b/src/filesystem.rs @@ -1,7 +1,3 @@ -use alloc::boxed::Box; - -use collections::Vec; - use system::error::{Result, Error, EEXIST, EISDIR, ENOENT, ENOSPC, ENOTDIR, ENOTEMPTY}; use super::{Disk, ExNode, Extent, Header, Node}; @@ -145,7 +141,7 @@ impl FileSystem { let mut block = self.header.1.root; nodes.push(try!(self.node(block))); - for part in path.split('/') { + for part in path.split(':') { if ! part.is_empty() { let node = try!(self.find_node(part, block)); block = node.0; diff --git a/src/header.rs b/src/header.rs index a9ff63a64c7b40cfd8bc8ce789c0a46de731f21d..13f6bbad7191f5bad7adbb184d14c78b66d296a0 100644 --- a/src/header.rs +++ b/src/header.rs @@ -1,11 +1,10 @@ -use core::{mem, slice}; -use core::ops::{Deref, DerefMut}; +use std::{fmt, mem, slice}; +use std::ops::{Deref, DerefMut}; /// The header of the filesystem -#[derive(Debug)] #[repr(packed)] pub struct Header { - /// Signature, should be b"REDOXFS\0" + /// Signature, should be b"RedoxFS\0" pub signature: [u8; 8], /// Version, should be 1 pub version: u64, @@ -17,6 +16,8 @@ pub struct Header { pub root: u64, /// Block of free space node pub free: u64, + /// Padding + pub padding: [u8; 456] } impl Header { @@ -31,6 +32,7 @@ impl Header { size: 0, root: 0, free: 0, + padding: [0; 456] } } @@ -42,6 +44,7 @@ impl Header { size: size, root: root, free: free, + padding: [0; 456] } } @@ -50,6 +53,19 @@ impl Header { } } +impl fmt::Debug for Header { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + f.debug_struct("Header") + .field("signature", &self.signature) + .field("version", &self.version) + .field("uuid", &self.uuid) + .field("size", &self.size) + .field("root", &self.root) + .field("free", &self.free) + .finish() + } +} + impl Deref for Header { type Target = [u8]; fn deref(&self) -> &[u8] { @@ -69,5 +85,5 @@ impl DerefMut for Header { #[test] fn header_size_test(){ - assert!(mem::size_of::<Header>() <= 512); + assert_eq!(mem::size_of::<Header>(), 512); } diff --git a/src/lib.rs b/src/lib.rs index 03b5667f0400de9a6775c6150ca4dc3cad1970d1..fcf352966f4137b3547951ec516c085fab620f4e 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,18 +1,9 @@ #![crate_name="redoxfs"] #![crate_type="lib"] -#![feature(alloc)] #![feature(associated_consts)] -#![feature(collections)] -#![no_std] #![deny(warnings)] -#[macro_use] -extern crate alloc; - -#[macro_use] -extern crate collections; - extern crate system; pub use self::disk::Disk; diff --git a/src/node.rs b/src/node.rs index 5856945320c627fde8b11f903cdaa61ae8a539dc..57e4c1192dfdab2451d7081bb4a6adea1df48dfc 100644 --- a/src/node.rs +++ b/src/node.rs @@ -1,6 +1,4 @@ -use collections::Vec; - -use core::{fmt, mem, ops, slice, str}; +use std::{fmt, mem, ops, slice, str}; use super::Extent;