From bef665af8d238b16c9cb3b76c73cc1a3b61c3241 Mon Sep 17 00:00:00 2001 From: Jeremy Soller Date: Tue, 12 Apr 2016 14:07:49 -0600 Subject: [PATCH] Add debugging to scheme, add padding to header --- scheme/image.rs | 2 ++ scheme/main.rs | 69 ++++++++++++++++++++++++++++++++--------------- scheme/scheme.rs | 18 ++++++++++++- src/ex_node.rs | 4 +-- src/extent.rs | 2 +- src/filesystem.rs | 6 +---- src/header.rs | 26 ++++++++++++++---- src/lib.rs | 9 ------- src/node.rs | 4 +-- 9 files changed, 91 insertions(+), 49 deletions(-) diff --git a/scheme/image.rs b/scheme/image.rs index 586e9638a3..c60cd5813e 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 { + //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 { + //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 86b0a9a1dd..3755c8d85a 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::() { - 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::() { + 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 a90975c5b7..7c46f55e76 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 { 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 { 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 { 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 { 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 { + 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 { + 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 { + 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 { + 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 { - 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 { + 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 { + 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 { + 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 740c794e3b..d9aa8f594b 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 64baf58739..ac4718eebe 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 19c8750e5b..a8f42319b4 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 a9ff63a64c..13f6bbad71 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::
() <= 512); + assert_eq!(mem::size_of::
(), 512); } diff --git a/src/lib.rs b/src/lib.rs index 03b5667f04..fcf352966f 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 5856945320..57e4c1192d 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;