From 9d3bd91bf1990b24b842dacf9fcef0639c81b52c Mon Sep 17 00:00:00 2001 From: 4lDO2 <4lDO2@protonmail.com> Date: Sat, 27 May 2023 16:58:41 +0200 Subject: [PATCH] Add xopen and xdup. --- src/scheme/generate.sh | 1 + src/scheme/mod.rs | 20 ++++++++++++++++++++ src/scheme/scheme.rs | 13 ++++++++++++- src/scheme/scheme_block.rs | 13 ++++++++++++- src/scheme/scheme_block_mut.rs | 13 ++++++++++++- src/scheme/scheme_mut.rs | 13 ++++++++++++- 6 files changed, 69 insertions(+), 4 deletions(-) diff --git a/src/scheme/generate.sh b/src/scheme/generate.sh index a877cda921..3c2415bf97 100755 --- a/src/scheme/generate.sh +++ b/src/scheme/generate.sh @@ -15,6 +15,7 @@ sed 's/trait Scheme/trait SchemeBlock/' scheme.rs \ | sed 's/\.map(|o| o as usize)/.map(|o| o.map(|o| o as usize))/' \ | sed 's/Ok(0)/Ok(Some(0))/g' \ | sed 's/Result<\([^>]\+\)>/Result>/g' \ +| sed 's/convert_to_this_scheme/convert_to_this_scheme_block/g' \ > scheme_block.rs echo "Generating SchemeBlockMut from SchemeBlock" diff --git a/src/scheme/mod.rs b/src/scheme/mod.rs index f65d1e2c06..386229188b 100644 --- a/src/scheme/mod.rs +++ b/src/scheme/mod.rs @@ -1,5 +1,7 @@ use core::{slice, str}; +use crate::Result; + pub use self::scheme::Scheme; pub use self::scheme_mut::SchemeMut; pub use self::scheme_block::SchemeBlock; @@ -16,3 +18,21 @@ mod scheme_mut; mod scheme_block; mod scheme_block_mut; mod seek; + +pub struct CallerCtx { + pub pid: usize, + pub uid: u32, + pub gid: u32, +} + +pub enum OpenResult { + ThisScheme { number: usize }, + OtherScheme { fd: usize }, +} + +pub(crate) fn convert_to_this_scheme(r: Result) -> Result { + r.map(|number| OpenResult::ThisScheme { number }) +} +pub(crate) fn convert_to_this_scheme_block(r: Result>) -> Result> { + r.map(|o| o.map(|number| OpenResult::ThisScheme { number })) +} diff --git a/src/scheme/scheme.rs b/src/scheme/scheme.rs index 6bf36172cd..a48126a0b7 100644 --- a/src/scheme/scheme.rs +++ b/src/scheme/scheme.rs @@ -1,10 +1,12 @@ use core::{mem, slice}; +use crate::CallerCtx; +use crate::OpenResult; use crate::data::*; use crate::error::*; use crate::flag::*; use crate::number::*; -use crate::scheme::str_from_raw_parts; +use crate::scheme::*; pub trait Scheme { fn handle(&self, packet: &mut Packet) { @@ -81,6 +83,10 @@ pub trait Scheme { fn open(&self, path: &str, flags: usize, uid: u32, gid: u32) -> Result { Err(Error::new(ENOENT)) } + #[allow(unused_variables)] + fn xopen(&self, path: &str, flags: usize, ctx: &CallerCtx) -> Result { + convert_to_this_scheme(self.open(path, flags, ctx.uid, ctx.gid)) + } #[allow(unused_variables)] fn chmod(&self, path: &str, mode: u16, uid: u32, gid: u32) -> Result { @@ -103,6 +109,11 @@ pub trait Scheme { Err(Error::new(EBADF)) } + #[allow(unused_variables)] + fn xdup(&self, old_id: usize, buf: &[u8], ctx: &CallerCtx) -> Result { + convert_to_this_scheme(self.dup(old_id, buf)) + } + #[allow(unused_variables)] fn read(&self, id: usize, buf: &mut [u8]) -> Result { Err(Error::new(EBADF)) diff --git a/src/scheme/scheme_block.rs b/src/scheme/scheme_block.rs index 3b3de4bc92..bf40c102aa 100644 --- a/src/scheme/scheme_block.rs +++ b/src/scheme/scheme_block.rs @@ -1,10 +1,12 @@ use core::{mem, slice}; +use crate::CallerCtx; +use crate::OpenResult; use crate::data::*; use crate::error::*; use crate::flag::*; use crate::number::*; -use crate::scheme::str_from_raw_parts; +use crate::scheme::*; pub trait SchemeBlock { fn handle(&self, packet: &Packet) -> Option { @@ -81,6 +83,10 @@ pub trait SchemeBlock { fn open(&self, path: &str, flags: usize, uid: u32, gid: u32) -> Result> { Err(Error::new(ENOENT)) } + #[allow(unused_variables)] + fn xopen(&self, path: &str, flags: usize, ctx: &CallerCtx) -> Result> { + convert_to_this_scheme_block(self.open(path, flags, ctx.uid, ctx.gid)) + } #[allow(unused_variables)] fn chmod(&self, path: &str, mode: u16, uid: u32, gid: u32) -> Result> { @@ -103,6 +109,11 @@ pub trait SchemeBlock { Err(Error::new(EBADF)) } + #[allow(unused_variables)] + fn xdup(&self, old_id: usize, buf: &[u8], ctx: &CallerCtx) -> Result> { + convert_to_this_scheme_block(self.dup(old_id, buf)) + } + #[allow(unused_variables)] fn read(&self, id: usize, buf: &mut [u8]) -> Result> { Err(Error::new(EBADF)) diff --git a/src/scheme/scheme_block_mut.rs b/src/scheme/scheme_block_mut.rs index 1fae3a0e5e..da9be6e590 100644 --- a/src/scheme/scheme_block_mut.rs +++ b/src/scheme/scheme_block_mut.rs @@ -1,10 +1,12 @@ use core::{mem, slice}; +use crate::CallerCtx; +use crate::OpenResult; use crate::data::*; use crate::error::*; use crate::flag::*; use crate::number::*; -use crate::scheme::str_from_raw_parts; +use crate::scheme::*; pub trait SchemeBlockMut { fn handle(&mut self, packet: &Packet) -> Option { @@ -81,6 +83,10 @@ pub trait SchemeBlockMut { fn open(&mut self, path: &str, flags: usize, uid: u32, gid: u32) -> Result> { Err(Error::new(ENOENT)) } + #[allow(unused_variables)] + fn xopen(&mut self, path: &str, flags: usize, ctx: &CallerCtx) -> Result> { + convert_to_this_scheme_block(self.open(path, flags, ctx.uid, ctx.gid)) + } #[allow(unused_variables)] fn chmod(&mut self, path: &str, mode: u16, uid: u32, gid: u32) -> Result> { @@ -103,6 +109,11 @@ pub trait SchemeBlockMut { Err(Error::new(EBADF)) } + #[allow(unused_variables)] + fn xdup(&mut self, old_id: usize, buf: &[u8], ctx: &CallerCtx) -> Result> { + convert_to_this_scheme_block(self.dup(old_id, buf)) + } + #[allow(unused_variables)] fn read(&mut self, id: usize, buf: &mut [u8]) -> Result> { Err(Error::new(EBADF)) diff --git a/src/scheme/scheme_mut.rs b/src/scheme/scheme_mut.rs index b364b62aaa..294bdac276 100644 --- a/src/scheme/scheme_mut.rs +++ b/src/scheme/scheme_mut.rs @@ -1,10 +1,12 @@ use core::{mem, slice}; +use crate::CallerCtx; +use crate::OpenResult; use crate::data::*; use crate::error::*; use crate::flag::*; use crate::number::*; -use crate::scheme::str_from_raw_parts; +use crate::scheme::*; pub trait SchemeMut { fn handle(&mut self, packet: &mut Packet) { @@ -81,6 +83,10 @@ pub trait SchemeMut { fn open(&mut self, path: &str, flags: usize, uid: u32, gid: u32) -> Result { Err(Error::new(ENOENT)) } + #[allow(unused_variables)] + fn xopen(&mut self, path: &str, flags: usize, ctx: &CallerCtx) -> Result { + convert_to_this_scheme(self.open(path, flags, ctx.uid, ctx.gid)) + } #[allow(unused_variables)] fn chmod(&mut self, path: &str, mode: u16, uid: u32, gid: u32) -> Result { @@ -103,6 +109,11 @@ pub trait SchemeMut { Err(Error::new(EBADF)) } + #[allow(unused_variables)] + fn xdup(&mut self, old_id: usize, buf: &[u8], ctx: &CallerCtx) -> Result { + convert_to_this_scheme(self.dup(old_id, buf)) + } + #[allow(unused_variables)] fn read(&mut self, id: usize, buf: &mut [u8]) -> Result { Err(Error::new(EBADF))