Merge pull request #32 from ids1024/directoryperm
Make it not an error to open a directory without O_DIRECTORY or O_STAT
This commit is contained in:
+10
-8
@@ -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))
|
||||
};
|
||||
|
||||
|
||||
+6
-11
@@ -189,11 +189,6 @@ impl Scheme for FileScheme {
|
||||
Some(node) => if flags & (O_CREAT | O_EXCL) == O_CREAT | O_EXCL {
|
||||
return Err(Error::new(EEXIST));
|
||||
} else if node.1.is_dir() {
|
||||
if flags & O_STAT != O_STAT && flags & O_DIRECTORY != O_DIRECTORY {
|
||||
// println!("{:X} & {:X}: EISDIR {}", flags, O_DIRECTORY, path);
|
||||
return Err(Error::new(EISDIR));
|
||||
}
|
||||
|
||||
if flags & O_ACCMODE == O_RDONLY {
|
||||
if ! node.1.permission(uid, gid, Node::MODE_READ) {
|
||||
// println!("dir not readable {:o}", node.1.mode);
|
||||
@@ -213,12 +208,12 @@ impl Scheme for FileScheme {
|
||||
}
|
||||
}
|
||||
|
||||
Box::new(DirResource::new(path.to_string(), node.0, data))
|
||||
} else if flags & O_STAT == O_STAT {
|
||||
Box::new(DirResource::new(path.to_string(), node.0, Vec::new()))
|
||||
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 {
|
||||
// println!("dir not opened with O_RDONLY");
|
||||
return Err(Error::new(EACCES));
|
||||
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();
|
||||
@@ -290,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)?
|
||||
|
||||
Reference in New Issue
Block a user