diff --git a/mount/redox/resource.rs b/mount/redox/resource.rs index 402fbcaeda45b9e272b3eb2439d6160461d6b902..da7d230fbba3262d115549327cc5bfd6ad9c4c67 100644 --- a/mount/redox/resource.rs +++ b/mount/redox/resource.rs @@ -4,7 +4,7 @@ use std::cmp::{min, max}; use std::time::{SystemTime, UNIX_EPOCH}; use syscall::data::TimeSpec; -use syscall::error::{Error, Result, EBADF, EINVAL}; +use syscall::error::{Error, Result, EBADF, EINVAL, EISDIR}; use syscall::flag::{O_ACCMODE, O_RDONLY, O_WRONLY, O_RDWR, F_GETFL, F_SETFL}; use syscall::{Stat, SEEK_SET, SEEK_CUR, SEEK_END}; @@ -24,12 +24,12 @@ pub trait Resource { pub struct DirResource { path: String, block: u64, - data: Vec<u8>, + data: Option<Vec<u8>>, seek: usize, } impl DirResource { - pub fn new(path: String, block: u64, data: Vec<u8>) -> DirResource { + pub fn new(path: String, block: u64, data: Option<Vec<u8>>) -> DirResource { DirResource { path: path, block: block, @@ -50,9 +50,10 @@ impl Resource for DirResource { } fn read(&mut self, buf: &mut [u8], _fs: &mut FileSystem) -> Result<usize> { + let data = self.data.as_ref().ok_or(Error::new(EISDIR))?; let mut i = 0; - while i < buf.len() && self.seek < self.data.len() { - buf[i] = self.data[self.seek]; + while i < buf.len() && self.seek < data.len() { + buf[i] = data[self.seek]; i += 1; self.seek += 1; } @@ -64,10 +65,11 @@ impl Resource for DirResource { } fn seek(&mut self, offset: usize, whence: usize, _fs: &mut FileSystem) -> Result<usize> { + let data = self.data.as_ref().ok_or(Error::new(EBADF))?; self.seek = match whence { - SEEK_SET => max(0, min(self.data.len() as isize, offset as isize)) as usize, - SEEK_CUR => max(0, min(self.data.len() as isize, self.seek as isize + offset as isize)) as usize, - SEEK_END => max(0, min(self.data.len() as isize, self.data.len() as isize + offset as isize)) as usize, + SEEK_SET => max(0, min(data.len() as isize, offset as isize)) as usize, + SEEK_CUR => max(0, min(data.len() as isize, self.seek as isize + offset as isize)) as usize, + SEEK_END => max(0, min(data.len() as isize, data.len() as isize + offset as isize)) as usize, _ => return Err(Error::new(EINVAL)) }; diff --git a/mount/redox/scheme.rs b/mount/redox/scheme.rs index 489ec73d404fae67c0c5da624192f6d1324e96b9..ca0362e4ae74facf33c0e4f5fb81345b3e29cccb 100644 --- a/mount/redox/scheme.rs +++ b/mount/redox/scheme.rs @@ -208,12 +208,12 @@ impl Scheme for FileScheme { } } - Box::new(DirResource::new(path.to_string(), node.0, data)) + Box::new(DirResource::new(path.to_string(), node.0, Some(data))) } else if flags & O_WRONLY == O_WRONLY { // println!("{:X} & {:X}: EISDIR {}", flags, O_DIRECTORY, path); return Err(Error::new(EISDIR)); } else { - Box::new(DirResource::new(path.to_string(), node.0, Vec::new())) + Box::new(DirResource::new(path.to_string(), node.0, None)) } } else if node.1.is_symlink() && !(flags & O_STAT == O_STAT && flags & O_NOFOLLOW == O_NOFOLLOW) && flags & O_SYMLINK != O_SYMLINK { let mut resolve_nodes = Vec::new(); @@ -285,7 +285,7 @@ impl Scheme for FileScheme { fs.write_at(node.0, &node.1)?; if dir { - Box::new(DirResource::new(path.to_string(), node.0, Vec::new())) + Box::new(DirResource::new(path.to_string(), node.0, None)) } else { let seek = if flags & O_APPEND == O_APPEND { fs.node_len(node.0)?