Allow seek in root scheme directory listings

This commit is contained in:
Jeremy Soller
2019-04-27 08:13:20 -06:00
parent afab96fa06
commit afa3f38310

View File

@@ -2,14 +2,14 @@ use alloc::sync::Arc;
use alloc::boxed::Box;
use alloc::collections::BTreeMap;
use alloc::vec::Vec;
use core::str;
use core::{cmp, str};
use core::sync::atomic::{AtomicUsize, Ordering};
use spin::{Mutex, RwLock};
use context;
use syscall::data::Stat;
use syscall::error::*;
use syscall::flag::{O_CREAT, MODE_FILE, MODE_DIR};
use syscall::flag::{O_CREAT, MODE_FILE, MODE_DIR, SEEK_SET, SEEK_CUR, SEEK_END};
use syscall::scheme::Scheme;
use scheme::{self, SchemeNamespace, SchemeId};
use scheme::user::{UserInner, UserScheme};
@@ -32,6 +32,18 @@ impl FolderInner {
Ok(i)
}
fn seek(&self, pos: usize, whence: usize) -> Result<usize> {
let mut seek = self.pos.lock();
*seek = match whence {
SEEK_SET => cmp::min(self.data.len(), pos),
SEEK_CUR => cmp::max(0, cmp::min(self.data.len() as isize, *seek as isize + pos as isize)) as usize,
SEEK_END => cmp::max(0, cmp::min(self.data.len() as isize, self.data.len() as isize + pos as isize)) as usize,
_ => return Err(Error::new(EINVAL))
};
Ok(*seek)
}
}
#[derive(Clone)]
@@ -168,6 +180,26 @@ impl Scheme for RootScheme {
}
}
fn seek(&self, file: usize, pos: usize, whence: usize) -> Result<usize> {
let handle = {
let handles = self.handles.read();
let handle = handles.get(&file).ok_or(Error::new(EBADF))?;
handle.clone()
};
match handle {
Handle::Scheme(_) => {
Err(Error::new(EBADF))
},
Handle::File(_) => {
Err(Error::new(EBADF))
},
Handle::Folder(inner) => {
inner.seek(pos, whence)
}
}
}
fn fevent(&self, file: usize, flags: usize) -> Result<usize> {
let handle = {
let handles = self.handles.read();