From 25174cc4ce74778a062500c8753f67149d6a7333 Mon Sep 17 00:00:00 2001 From: Jeremy Soller Date: Mon, 29 Feb 2016 21:32:37 -0700 Subject: [PATCH] WIP: Functions for accessing file data --- create.sh | 4 ++++ scheme/main.rs | 8 ++++++-- src/filesystem.rs | 45 +++++++++++++++++++++++++++++++++++++++------ utility/main.rs | 21 ++++++++++++++++++++- 4 files changed, 69 insertions(+), 9 deletions(-) diff --git a/create.sh b/create.sh index 0a236e4120..7aee4f3ebd 100755 --- a/create.sh +++ b/create.sh @@ -11,10 +11,14 @@ ed b_file B FILE . +cat b_file + ed c_file C FILE . +cat c_file + exit EOF diff --git a/scheme/main.rs b/scheme/main.rs index 330aeaa255..ac73f35d55 100644 --- a/scheme/main.rs +++ b/scheme/main.rs @@ -123,7 +123,7 @@ impl FileScheme { } impl Scheme for FileScheme { - fn open(&mut self, url: &str, flags: usize, mode: usize) -> Result { + fn open(&mut self, url: &str, flags: usize, _mode: usize) -> Result { let path = url.split(':').nth(1).unwrap_or("").trim_matches('/'); let mut nodes = Vec::new(); @@ -143,7 +143,11 @@ impl Scheme for FileScheme { } } } else { - data.extend_from_slice(&format!("{:#?}", node).as_bytes()); + for i in 0..try!(self.fs.node_len(node.0)) { + let mut sector = [0; 512]; + try!(self.fs.read_node(node.0, i as usize * 512, &mut sector)); + data.extend_from_slice(§or); + } }, Err(err) => if err.errno == ENOENT && flags & O_CREAT == O_CREAT { let mut last_part = String::new(); diff --git a/src/filesystem.rs b/src/filesystem.rs index 1d0a9675ba..5c5c7c0141 100644 --- a/src/filesystem.rs +++ b/src/filesystem.rs @@ -322,7 +322,7 @@ impl FileSystem { pub fn read_node(&mut self, block: u64, offset: usize, buf: &mut [u8]) -> Result { let block_offset = offset / 512; - let byte_offset = offset % 512; + let mut byte_offset = offset % 512; let block_len = (buf.len() + byte_offset + 511)/512; let mut blocks = Vec::new(); @@ -330,9 +330,15 @@ impl FileSystem { let mut i = 0; for &block in blocks.iter() { - let mut sector = ['r' as u8; 512]; + let mut sector = [0; 512]; try!(self.disk.read_at(block, &mut sector)); - i += 512; + + for (s_b, mut b) in sector.iter().skip(byte_offset).zip((&mut buf[i..]).iter_mut()) { + *b = *s_b; + i += 1; + } + + byte_offset = 0; } Ok(i) @@ -340,7 +346,7 @@ impl FileSystem { pub fn write_node(&mut self, block: u64, offset: usize, buf: &[u8]) -> Result { let block_offset = offset / 512; - let byte_offset = offset % 512; + let mut byte_offset = offset % 512; let block_len = (buf.len() + byte_offset + 511)/512; try!(self.node_ensure_len(block, (block_offset + block_len) as u64)); @@ -350,11 +356,38 @@ impl FileSystem { let mut i = 0; for &block in blocks.iter() { - let sector = ['w' as u8; 512]; + let mut sector = [0; 512]; + + for (mut s_b, b) in sector.iter_mut().skip(byte_offset).zip(buf[i..].iter()) { + *s_b = *b; + i += 1; + } + try!(self.disk.write_at(block, §or)); - i += 512; + + byte_offset = 0; } Ok(i) } + + pub fn node_len(&mut self, block: u64) -> Result { + if block == 0 { + return Err(Error::new(ENOENT)); + } + + let mut size = 0; + + let node = try!(self.node(block)); + for extent in node.1.extents.iter() { + size += extent.length; + } + + if node.1.next > 0 { + size += try!(self.node_len(node.1.next)); + Ok(size) + } else { + Ok(size) + } + } } diff --git a/utility/main.rs b/utility/main.rs index 1f2f908c37..ca4cb35794 100644 --- a/utility/main.rs +++ b/utility/main.rs @@ -7,6 +7,7 @@ extern crate system; use std::env; use std::io::{self, Write}; use std::path::Path; +use std::str; use redoxfs::{FileSystem, Node}; @@ -60,6 +61,24 @@ fn shell(mut fs: FileSystem){ Err(err) => println!("node: failed to read {}: {}", block, err) } }, + "cat" => { + if let Some(arg) = args.next() { + match fs.find_node(arg, block) { + Ok(node) => { + println!("{}: {:#?}", node.0, node.1); + + let mut data = [0; 512]; + match fs.read_node(node.0, 0, &mut data) { + Ok(count) => println!("cat: read {} bytes\n{}", count, unsafe { str::from_utf8_unchecked(&data) }), + Err(err) => println!("cat: failed to read {}: {}", node.0, err) + } + } + Err(err) => println!("cat: failed to create {}: {}", arg, err) + } + } else { + println!("cat "); + } + }, "cd" => { if let Some(arg) = args.next() { if arg == "." { @@ -178,7 +197,7 @@ fn shell(mut fs: FileSystem){ println!("rmdir "); } }, - _ => println!("commands: exit header node root free find ls mk mkdir rm rmdir") + _ => println!("commands: exit header node root free cat ed find ls mk mkdir rm rmdir") } } }