move calc_seek_offset* to syscall

This commit is contained in:
Graham MacDonald
2020-06-19 23:53:30 +01:00
parent 01f95b644d
commit aa1b11cc8a
7 changed files with 10 additions and 45 deletions

View File

@@ -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 {

View File

@@ -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 {

View File

@@ -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();

View File

@@ -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))
}
}

View File

@@ -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,
},

View File

@@ -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 {

View File

@@ -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;