diff --git a/src/scheme/acpi.rs b/src/scheme/acpi.rs index 1ee3739..9fe6020 100644 --- a/src/scheme/acpi.rs +++ b/src/scheme/acpi.rs @@ -9,7 +9,7 @@ use alloc::vec::Vec; use syscall::data::Stat; use syscall::error::{EACCES, EBADF, EBADFD, EINVAL, EIO, EISDIR, ENOENT, ENOTDIR}; use syscall::flag::{O_ACCMODE, O_DIRECTORY, O_RDWR, O_STAT, O_WRONLY}; -use syscall::scheme::Scheme; +use syscall::scheme::{calc_seek_offset_usize, Scheme}; use syscall::{Error, Result}; use syscall::{MODE_DIR, MODE_FILE}; @@ -18,7 +18,6 @@ use spin::{Mutex, RwLock}; use crate::acpi::sdt::Sdt; use crate::acpi::SdtSignature; use crate::paging::ActivePageTable; -use crate::scheme::calc_seek_offset_usize; #[derive(Clone, Copy)] struct PhysSlice { diff --git a/src/scheme/initfs.rs b/src/scheme/initfs.rs index 17f3172..d5d6447 100644 --- a/src/scheme/initfs.rs +++ b/src/scheme/initfs.rs @@ -3,11 +3,10 @@ use core::str; use core::sync::atomic::{AtomicUsize, Ordering}; use spin::RwLock; -use crate::scheme::calc_seek_offset_usize; use crate::syscall::data::Stat; use crate::syscall::error::*; use crate::syscall::flag::{MODE_DIR, MODE_FILE}; -use crate::syscall::scheme::Scheme; +use crate::syscall::scheme::{calc_seek_offset_usize, Scheme}; #[cfg(test)] mod gen { diff --git a/src/scheme/irq.rs b/src/scheme/irq.rs index 3400eda..d5938d0 100644 --- a/src/scheme/irq.rs +++ b/src/scheme/irq.rs @@ -12,10 +12,10 @@ use crate::arch::interrupt::{available_irqs_iter, bsp_apic_id, is_reserved, set_ use crate::event; use crate::interrupt::irq::acknowledge; -use crate::scheme::{AtomicSchemeId, SchemeId, calc_seek_offset_usize}; +use crate::scheme::{AtomicSchemeId, SchemeId}; use crate::syscall::error::*; use crate::syscall::flag::{EventFlags, EVENT_READ, O_DIRECTORY, O_CREAT, O_STAT, MODE_CHR, MODE_DIR}; -use crate::syscall::scheme::Scheme; +use crate::syscall::scheme::{calc_seek_offset_usize, Scheme}; pub static IRQ_SCHEME_ID: AtomicSchemeId = AtomicSchemeId::default(); diff --git a/src/scheme/mod.rs b/src/scheme/mod.rs index cf0a028..d337a08 100644 --- a/src/scheme/mod.rs +++ b/src/scheme/mod.rs @@ -10,14 +10,11 @@ use alloc::sync::Arc; use alloc::boxed::Box; use alloc::collections::BTreeMap; use alloc::vec::Vec; -use core::cmp; use core::sync::atomic::AtomicUsize; -use core::convert::TryFrom; use spin::{Once, RwLock, RwLockReadGuard, RwLockWriteGuard}; use crate::syscall::error::*; use crate::syscall::scheme::Scheme; -use crate::syscall::flag::{SEEK_CUR, SEEK_END, SEEK_SET}; #[cfg(feature = "acpi")] use self::acpi::AcpiScheme; @@ -286,32 +283,3 @@ pub fn schemes() -> RwLockReadGuard<'static, SchemeList> { pub fn schemes_mut() -> RwLockWriteGuard<'static, SchemeList> { SCHEMES.call_once(init_schemes).write() } - -/// Helper for seek calls -/// In most cases it's easier to use a usize to track the offset and buffer size internally, -/// but the seek interface uses isize. This wrapper ensures EOVERFLOW errors are returned -/// as appropriate if the value in the usize can't fit in the isize. -pub fn calc_seek_offset_usize(cur_offset: usize, pos: isize, whence: usize, buf_len: usize) -> Result { - let cur_offset = isize::try_from(cur_offset).or_else(|_| Err(Error::new(EOVERFLOW)))?; - let buf_len = isize::try_from(buf_len).or_else(|_| Err(Error::new(EOVERFLOW)))?; - calc_seek_offset_isize(cur_offset, pos, whence, buf_len) -} - -/// Helper for seek calls -/// Result is guaranteed to be positive. -/// EOVERFLOW returned if the arguments would cause an overflow. -/// EINVAL returned if the new offset is out of bounds. -pub fn calc_seek_offset_isize(cur_offset: isize, pos: isize, whence: usize, buf_len: isize) -> Result { - let new_offset = match whence { - SEEK_CUR => pos.checked_add(cur_offset), - SEEK_END => pos.checked_add(buf_len), - SEEK_SET => Some(pos), - _ => None, - }; - - match new_offset { - Some(new_offset) if new_offset < 0 => Err(Error::new(EINVAL)), - Some(new_offset) => Ok(cmp::min(new_offset, buf_len)), - None => Err(Error::new(EOVERFLOW)) - } -} diff --git a/src/scheme/proc.rs b/src/scheme/proc.rs index c792ec4..da27553 100644 --- a/src/scheme/proc.rs +++ b/src/scheme/proc.rs @@ -2,12 +2,12 @@ use crate::{ arch::paging::VirtualAddress, context::{self, Context, ContextId, Status}, ptrace, - scheme::{AtomicSchemeId, SchemeId, calc_seek_offset_usize}, + scheme::{AtomicSchemeId, SchemeId}, syscall::{ data::{FloatRegisters, IntRegisters, PtraceEvent}, error::*, flag::*, - scheme::Scheme, + scheme::{calc_seek_offset_usize, Scheme}, self, validate, }, diff --git a/src/scheme/root.rs b/src/scheme/root.rs index 078da96..ca5e789 100644 --- a/src/scheme/root.rs +++ b/src/scheme/root.rs @@ -9,9 +9,9 @@ use spin::{Mutex, RwLock}; use crate::context; use crate::syscall::data::Stat; use crate::syscall::error::*; -use crate::syscall::flag::{EventFlags, O_CREAT, MODE_FILE, MODE_DIR, SEEK_SET, SEEK_CUR, SEEK_END}; -use crate::syscall::scheme::Scheme; -use crate::scheme::{self, SchemeNamespace, SchemeId, calc_seek_offset_usize}; +use crate::syscall::flag::{EventFlags, O_CREAT, MODE_FILE, MODE_DIR}; +use crate::syscall::scheme::{calc_seek_offset_usize, Scheme}; +use crate::scheme::{self, SchemeNamespace, SchemeId}; use crate::scheme::user::{UserInner, UserScheme}; struct FolderInner { diff --git a/src/scheme/sys/mod.rs b/src/scheme/sys/mod.rs index e90b136..f0a03d0 100644 --- a/src/scheme/sys/mod.rs +++ b/src/scheme/sys/mod.rs @@ -5,11 +5,10 @@ use core::str; use core::sync::atomic::{AtomicUsize, Ordering}; use spin::RwLock; -use crate::scheme::calc_seek_offset_usize; use crate::syscall::data::Stat; use crate::syscall::error::{Error, EBADF, ENOENT, Result}; use crate::syscall::flag::{MODE_DIR, MODE_FILE}; -use crate::syscall::scheme::Scheme; +use crate::syscall::scheme::{calc_seek_offset_usize, Scheme}; use crate::arch::interrupt::irq; mod block;