syscall/scheme/
mod.rs

1use core::{slice, str};
2
3use crate::{Error, Packet, Result, EOPNOTSUPP, ESKMSG, SKMSG_FRETURNFD};
4
5pub use self::{
6    scheme::Scheme, scheme_block::SchemeBlock, scheme_block_mut::SchemeBlockMut,
7    scheme_mut::SchemeMut, seek::*,
8};
9
10unsafe fn str_from_raw_parts(ptr: *const u8, len: usize) -> Option<&'static str> {
11    let slice = slice::from_raw_parts(ptr, len);
12    str::from_utf8(slice).ok()
13}
14
15mod scheme;
16mod scheme_block;
17mod scheme_block_mut;
18mod scheme_mut;
19mod seek;
20
21pub struct CallerCtx {
22    pub pid: usize,
23    pub uid: u32,
24    pub gid: u32,
25}
26
27pub enum OpenResult {
28    ThisScheme { number: usize },
29    OtherScheme { fd: usize },
30}
31
32// TODO: Find a better solution than generate.sh
33pub(crate) fn convert_to_this_scheme(r: Result<usize>) -> Result<OpenResult> {
34    r.map(|number| OpenResult::ThisScheme { number })
35}
36pub(crate) fn convert_to_this_scheme_block(r: Result<Option<usize>>) -> Result<Option<OpenResult>> {
37    r.map(|o| o.map(|number| OpenResult::ThisScheme { number }))
38}
39pub(crate) fn convert_in_scheme_handle_block(
40    _: &Packet,
41    result: Result<Option<OpenResult>>,
42) -> Result<Option<usize>> {
43    match result {
44        Ok(Some(OpenResult::ThisScheme { number })) => Ok(Some(number)),
45        Ok(Some(OpenResult::OtherScheme { .. })) => Err(Error::new(EOPNOTSUPP)),
46        Ok(None) => Ok(None),
47        Err(err) => Err(err),
48    }
49}
50pub(crate) fn convert_in_scheme_handle(
51    packet: &mut Packet,
52    result: Result<OpenResult>,
53) -> Result<usize> {
54    match result {
55        Ok(OpenResult::ThisScheme { number }) => Ok(number),
56        Ok(OpenResult::OtherScheme { fd }) => {
57            packet.b = SKMSG_FRETURNFD;
58            packet.c = fd;
59            Err(Error::new(ESKMSG))
60        }
61        Err(err) => Err(err),
62    }
63}
64
65impl CallerCtx {
66    pub fn from_packet(packet: &Packet) -> Self {
67        Self {
68            pid: packet.pid,
69            uid: packet.uid,
70            gid: packet.gid,
71        }
72    }
73}