From 01f95b644d565c15ae3c6bb8f1ac81fd9a5701d6 Mon Sep 17 00:00:00 2001 From: Graham MacDonald Date: Wed, 10 Jun 2020 23:22:02 +0100 Subject: [PATCH 1/3] change seek sig to match posix - signed pos and result --- src/scheme/acpi.rs | 16 ++++++---------- src/scheme/initfs.rs | 19 +++++++------------ src/scheme/irq.rs | 15 +++++---------- src/scheme/mod.rs | 32 ++++++++++++++++++++++++++++++++ src/scheme/pipe.rs | 2 +- src/scheme/proc.rs | 13 ++++--------- src/scheme/root.rs | 19 +++++++------------ src/scheme/sys/mod.rs | 20 ++++++++------------ src/scheme/user.rs | 6 ++++-- 9 files changed, 74 insertions(+), 68 deletions(-) diff --git a/src/scheme/acpi.rs b/src/scheme/acpi.rs index 9ab6de1..1ee3739 100644 --- a/src/scheme/acpi.rs +++ b/src/scheme/acpi.rs @@ -11,13 +11,14 @@ 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::{Error, Result}; -use syscall::{MODE_DIR, MODE_FILE, SEEK_CUR, SEEK_END, SEEK_SET}; +use syscall::{MODE_DIR, MODE_FILE}; 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 { @@ -336,13 +337,13 @@ impl Scheme for AcpiScheme { } Ok(0) } - fn seek(&self, id: usize, pos: usize, whence: usize) -> Result { + fn seek(&self, id: usize, pos: isize, whence: usize) -> Result { let handles_guard = self.handles.read(); let mut handle = handles_guard.get(&id).ok_or(Error::new(EBADF))?.lock(); let (cur_offset, length) = match &*handle { &Handle::TopLevel(offset) => (offset, TOPLEVEL_DIR_CONTENTS.len()), - &Handle::Tables(offset) => (offset, self.tables.len() * 35), + &Handle::Tables(offset) => (offset, (self.tables.len() * 35)), &Handle::Table { name, oem_id, @@ -355,16 +356,11 @@ impl Scheme for AcpiScheme { .len, ), }; - let new_offset = match whence { - SEEK_CUR => core::cmp::min(cur_offset + pos, length), - SEEK_END => core::cmp::min(length + pos, length), - SEEK_SET => core::cmp::min(length, pos), - _ => return Err(Error::new(EINVAL)), - }; + let new_offset = calc_seek_offset_usize(cur_offset, pos, whence, length)?; match &mut *handle { &mut Handle::Table { ref mut offset, .. } | &mut Handle::Tables(ref mut offset) - | &mut Handle::TopLevel(ref mut offset) => *offset = new_offset, + | &mut Handle::TopLevel(ref mut offset) => *offset = new_offset as usize, } Ok(new_offset) } diff --git a/src/scheme/initfs.rs b/src/scheme/initfs.rs index 5af8b3b..17f3172 100644 --- a/src/scheme/initfs.rs +++ b/src/scheme/initfs.rs @@ -1,11 +1,12 @@ use alloc::collections::BTreeMap; -use core::{cmp, str}; +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, SEEK_SET, SEEK_CUR, SEEK_END}; +use crate::syscall::flag::{MODE_DIR, MODE_FILE}; use crate::syscall::scheme::Scheme; #[cfg(test)] @@ -77,18 +78,12 @@ impl Scheme for InitFsScheme { Ok(i) } - fn seek(&self, id: usize, pos: usize, whence: usize) -> Result { + fn seek(&self, id: usize, pos: isize, whence: usize) -> Result { let mut handles = self.handles.write(); let handle = handles.get_mut(&id).ok_or(Error::new(EBADF))?; - - handle.seek = match whence { - SEEK_SET => cmp::min(handle.data.len(), pos), - SEEK_CUR => cmp::max(0, cmp::min(handle.data.len() as isize, handle.seek as isize + pos as isize)) as usize, - SEEK_END => cmp::max(0, cmp::min(handle.data.len() as isize, handle.data.len() as isize + pos as isize)) as usize, - _ => return Err(Error::new(EINVAL)) - }; - - Ok(handle.seek) + let new_offset = calc_seek_offset_usize(handle.seek, pos, whence, handle.data.len())?; + handle.seek = new_offset as usize; + Ok(new_offset) } fn fcntl(&self, id: usize, _cmd: usize, _arg: usize) -> Result { diff --git a/src/scheme/irq.rs b/src/scheme/irq.rs index 66e0ee0..3400eda 100644 --- a/src/scheme/irq.rs +++ b/src/scheme/irq.rs @@ -12,9 +12,9 @@ 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}; +use crate::scheme::{AtomicSchemeId, SchemeId, calc_seek_offset_usize}; use crate::syscall::error::*; -use crate::syscall::flag::{EventFlags, EVENT_READ, O_DIRECTORY, O_CREAT, O_STAT, MODE_CHR, MODE_DIR, SEEK_CUR, SEEK_END, SEEK_SET}; +use crate::syscall::flag::{EventFlags, EVENT_READ, O_DIRECTORY, O_CREAT, O_STAT, MODE_CHR, MODE_DIR}; use crate::syscall::scheme::Scheme; pub static IRQ_SCHEME_ID: AtomicSchemeId = AtomicSchemeId::default(); @@ -252,20 +252,15 @@ impl Scheme for IrqScheme { } } - fn seek(&self, id: usize, pos: usize, whence: usize) -> Result { + fn seek(&self, id: usize, pos: isize, whence: usize) -> Result { let handles_guard = HANDLES.read(); let handle = handles_guard.as_ref().unwrap().get(&id).ok_or(Error::new(EBADF))?; match handle { &Handle::Avail(_, ref buf, ref offset) | &Handle::TopLevel(ref buf, ref offset) => { let cur_offset = offset.load(Ordering::SeqCst); - let new_offset = match whence { - SEEK_CUR => core::cmp::min(cur_offset + pos, buf.len()), - SEEK_END => core::cmp::min(buf.len() + pos, buf.len()), - SEEK_SET => core::cmp::min(buf.len(), pos), - _ => return Err(Error::new(EINVAL)), - }; - offset.store(new_offset, Ordering::SeqCst); + let new_offset = calc_seek_offset_usize(cur_offset, pos, whence, buf.len())?; + offset.store(new_offset as usize, Ordering::SeqCst); Ok(new_offset) } _ => return Err(Error::new(ESPIPE)), diff --git a/src/scheme/mod.rs b/src/scheme/mod.rs index d337a08..cf0a028 100644 --- a/src/scheme/mod.rs +++ b/src/scheme/mod.rs @@ -10,11 +10,14 @@ 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; @@ -283,3 +286,32 @@ 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/pipe.rs b/src/scheme/pipe.rs index 46dd2ac..f2c1b46 100644 --- a/src/scheme/pipe.rs +++ b/src/scheme/pipe.rs @@ -142,7 +142,7 @@ impl Scheme for PipeScheme { Ok(0) } - fn seek(&self, _id: usize, _pos: usize, _whence: usize) -> Result { + fn seek(&self, _id: usize, _pos: isize, _whence: usize) -> Result { Err(Error::new(ESPIPE)) } } diff --git a/src/scheme/proc.rs b/src/scheme/proc.rs index 07f9d91..c792ec4 100644 --- a/src/scheme/proc.rs +++ b/src/scheme/proc.rs @@ -2,7 +2,7 @@ use crate::{ arch::paging::VirtualAddress, context::{self, Context, ContextId, Status}, ptrace, - scheme::{AtomicSchemeId, SchemeId}, + scheme::{AtomicSchemeId, SchemeId, calc_seek_offset_usize}, syscall::{ data::{FloatRegisters, IntRegisters, PtraceEvent}, error::*, @@ -285,18 +285,13 @@ impl Scheme for ProcScheme { self.open(&path, info.flags, uid, gid) } - fn seek(&self, id: usize, pos: usize, whence: usize) -> Result { + fn seek(&self, id: usize, pos: isize, whence: usize) -> Result { let mut handles = self.handles.write(); let handle = handles.get_mut(&id).ok_or(Error::new(EBADF))?; let mut memory = handle.data.mem_data().ok_or(Error::new(EBADF))?; - let value = match whence { - SEEK_SET => pos, - SEEK_CUR => cmp::max(0, memory.offset.get() as isize + pos as isize) as usize, - SEEK_END => cmp::max(0, isize::max_value() + pos as isize) as usize, - _ => return Err(Error::new(EBADF)) - }; - memory.offset = VirtualAddress::new(value); + let value = calc_seek_offset_usize(memory.offset.get(), pos, whence, isize::max_value() as usize)?; + memory.offset = VirtualAddress::new(value as usize); Ok(value) } diff --git a/src/scheme/root.rs b/src/scheme/root.rs index dfaf486..078da96 100644 --- a/src/scheme/root.rs +++ b/src/scheme/root.rs @@ -2,7 +2,7 @@ use alloc::sync::Arc; use alloc::boxed::Box; use alloc::collections::BTreeMap; use alloc::vec::Vec; -use core::{cmp, str}; +use core::str; use core::sync::atomic::{AtomicUsize, Ordering}; use spin::{Mutex, RwLock}; @@ -11,7 +11,7 @@ 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}; +use crate::scheme::{self, SchemeNamespace, SchemeId, calc_seek_offset_usize}; use crate::scheme::user::{UserInner, UserScheme}; struct FolderInner { @@ -33,16 +33,11 @@ impl FolderInner { Ok(i) } - fn seek(&self, pos: usize, whence: usize) -> Result { + fn seek(&self, pos: isize, whence: usize) -> Result { 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) + let new_offset = calc_seek_offset_usize(*seek, pos, whence, self.data.len())?; + *seek = new_offset as usize; + Ok(new_offset) } } @@ -206,7 +201,7 @@ impl Scheme for RootScheme { } } - fn seek(&self, file: usize, pos: usize, whence: usize) -> Result { + fn seek(&self, file: usize, pos: isize, whence: usize) -> Result { let handle = { let handles = self.handles.read(); let handle = handles.get(&file).ok_or(Error::new(EBADF))?; diff --git a/src/scheme/sys/mod.rs b/src/scheme/sys/mod.rs index 8b65632..e90b136 100644 --- a/src/scheme/sys/mod.rs +++ b/src/scheme/sys/mod.rs @@ -1,13 +1,14 @@ use alloc::boxed::Box; use alloc::collections::BTreeMap; use alloc::vec::Vec; -use core::{cmp, str}; +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, EINVAL, ENOENT, Result}; -use crate::syscall::flag::{MODE_DIR, MODE_FILE, SEEK_CUR, SEEK_END, SEEK_SET}; +use crate::syscall::error::{Error, EBADF, ENOENT, Result}; +use crate::syscall::flag::{MODE_DIR, MODE_FILE}; use crate::syscall::scheme::Scheme; use crate::arch::interrupt::irq; @@ -118,18 +119,13 @@ impl Scheme for SysScheme { Ok(i) } - fn seek(&self, id: usize, pos: usize, whence: usize) -> Result { + fn seek(&self, id: usize, pos: isize, whence: usize) -> Result { let mut handles = self.handles.write(); let handle = handles.get_mut(&id).ok_or(Error::new(EBADF))?; - handle.seek = match whence { - SEEK_SET => cmp::min(handle.data.len(), pos), - SEEK_CUR => cmp::max(0, cmp::min(handle.data.len() as isize, handle.seek as isize + pos as isize)) as usize, - SEEK_END => cmp::max(0, cmp::min(handle.data.len() as isize, handle.data.len() as isize + pos as isize)) as usize, - _ => return Err(Error::new(EINVAL)) - }; - - Ok(handle.seek) + let new_offset = calc_seek_offset_usize(handle.seek, pos, whence, handle.data.len())?; + handle.seek = new_offset as usize; + Ok(new_offset) } fn fpath(&self, id: usize, buf: &mut [u8]) -> Result { diff --git a/src/scheme/user.rs b/src/scheme/user.rs index 24278f5..1c083bc 100644 --- a/src/scheme/user.rs +++ b/src/scheme/user.rs @@ -3,6 +3,7 @@ use alloc::boxed::Box; use alloc::collections::BTreeMap; use core::sync::atomic::{AtomicBool, AtomicU64, Ordering}; use core::{mem, slice, usize}; +use core::convert::TryFrom; use spin::{Mutex, RwLock}; use crate::context::{self, Context}; @@ -334,9 +335,10 @@ impl Scheme for UserScheme { result } - fn seek(&self, file: usize, position: usize, whence: usize) -> Result { + fn seek(&self, file: usize, position: isize, whence: usize) -> Result { let inner = self.inner.upgrade().ok_or(Error::new(ENODEV))?; - inner.call(SYS_LSEEK, file, position, whence) + let new_offset = inner.call(SYS_LSEEK, file, position as usize, whence)?; + isize::try_from(new_offset).or_else(|_| Err(Error::new(EOVERFLOW))) } fn fchmod(&self, file: usize, mode: u16) -> Result { From aa1b11cc8aeab25160b42e97c9b1f52ccc5cc5a2 Mon Sep 17 00:00:00 2001 From: Graham MacDonald Date: Fri, 19 Jun 2020 23:53:30 +0100 Subject: [PATCH 2/3] move calc_seek_offset* to syscall --- src/scheme/acpi.rs | 3 +-- src/scheme/initfs.rs | 3 +-- src/scheme/irq.rs | 4 ++-- src/scheme/mod.rs | 32 -------------------------------- src/scheme/proc.rs | 4 ++-- src/scheme/root.rs | 6 +++--- src/scheme/sys/mod.rs | 3 +-- 7 files changed, 10 insertions(+), 45 deletions(-) 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; From 2d8b2d94b9a34c873e479e7fa8b959bf88d5e473 Mon Sep 17 00:00:00 2001 From: Graham MacDonald Date: Sat, 27 Jun 2020 14:10:15 +0100 Subject: [PATCH 3/3] hopefully update syscall submodule --- syscall | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/syscall b/syscall index 9ecdc11..fcebe8f 160000 --- a/syscall +++ b/syscall @@ -1 +1 @@ -Subproject commit 9ecdc11d73677477b37567a47af1633478093cbb +Subproject commit fcebe8f225142830fa5880a27d9faa6ed6b2aeb8