diff --git a/src/scheme/root.rs b/src/scheme/root.rs index 14cdfa6b530978e6f503ecfcdc590776facb87d6..7aaf165f121d312f9d1a79964b820fa78c1d3672 100644 --- a/src/scheme/root.rs +++ b/src/scheme/root.rs @@ -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();