Allow seek in root scheme directory listings
This commit is contained in:
@@ -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();
|
||||
|
||||
Reference in New Issue
Block a user