Skip to content
Snippets Groups Projects
Unverified Commit f4a3e1dd authored by Ian Douglas Scott's avatar Ian Douglas Scott
Browse files

Make read() on directory not opened as O_DIRECTORY return EISDIR

parent f474a9fd
No related branches found
No related tags found
No related merge requests found
...@@ -4,7 +4,7 @@ use std::cmp::{min, max}; ...@@ -4,7 +4,7 @@ use std::cmp::{min, max};
use std::time::{SystemTime, UNIX_EPOCH}; use std::time::{SystemTime, UNIX_EPOCH};
use syscall::data::TimeSpec; 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::flag::{O_ACCMODE, O_RDONLY, O_WRONLY, O_RDWR, F_GETFL, F_SETFL};
use syscall::{Stat, SEEK_SET, SEEK_CUR, SEEK_END}; use syscall::{Stat, SEEK_SET, SEEK_CUR, SEEK_END};
...@@ -24,12 +24,12 @@ pub trait Resource { ...@@ -24,12 +24,12 @@ pub trait Resource {
pub struct DirResource { pub struct DirResource {
path: String, path: String,
block: u64, block: u64,
data: Vec<u8>, data: Option<Vec<u8>>,
seek: usize, seek: usize,
} }
impl DirResource { 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 { DirResource {
path: path, path: path,
block: block, block: block,
...@@ -50,9 +50,10 @@ impl Resource for DirResource { ...@@ -50,9 +50,10 @@ impl Resource for DirResource {
} }
fn read(&mut self, buf: &mut [u8], _fs: &mut FileSystem) -> Result<usize> { 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; let mut i = 0;
while i < buf.len() && self.seek < self.data.len() { while i < buf.len() && self.seek < data.len() {
buf[i] = self.data[self.seek]; buf[i] = data[self.seek];
i += 1; i += 1;
self.seek += 1; self.seek += 1;
} }
...@@ -64,10 +65,11 @@ impl Resource for DirResource { ...@@ -64,10 +65,11 @@ impl Resource for DirResource {
} }
fn seek(&mut self, offset: usize, whence: usize, _fs: &mut FileSystem) -> Result<usize> { 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 { self.seek = match whence {
SEEK_SET => max(0, min(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(self.data.len() as isize, self.seek 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(self.data.len() as isize, self.data.len() 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)) _ => return Err(Error::new(EINVAL))
}; };
......
...@@ -208,12 +208,12 @@ impl Scheme for FileScheme { ...@@ -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 { } else if flags & O_WRONLY == O_WRONLY {
// println!("{:X} & {:X}: EISDIR {}", flags, O_DIRECTORY, path); // println!("{:X} & {:X}: EISDIR {}", flags, O_DIRECTORY, path);
return Err(Error::new(EISDIR)); return Err(Error::new(EISDIR));
} else { } 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 { } 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(); let mut resolve_nodes = Vec::new();
...@@ -285,7 +285,7 @@ impl Scheme for FileScheme { ...@@ -285,7 +285,7 @@ impl Scheme for FileScheme {
fs.write_at(node.0, &node.1)?; fs.write_at(node.0, &node.1)?;
if dir { if dir {
Box::new(DirResource::new(path.to_string(), node.0, Vec::new())) Box::new(DirResource::new(path.to_string(), node.0, None))
} else { } else {
let seek = if flags & O_APPEND == O_APPEND { let seek = if flags & O_APPEND == O_APPEND {
fs.node_len(node.0)? fs.node_len(node.0)?
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment