move calc_seek_offset* to syscall
This commit is contained in:
@@ -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 {
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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();
|
||||
|
||||
|
||||
@@ -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<isize> {
|
||||
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<isize> {
|
||||
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))
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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,
|
||||
},
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user