userspace/target/operating_system/linux/syscall/
read.rs

1use crate::target::arch::{Arch, traits::Callable};
2
3hooking!(READ);
4
5pub fn read(file_descriptor: isize, byte_buffer: *const u8, byte_length: usize) -> crate::Result {
6    let arch_result = Arch::syscall3(
7        NUMBER,
8        file_descriptor as usize,
9        byte_buffer as usize,
10        byte_length as usize,
11    );
12
13    handle_result(arch_result)
14}
15
16pub mod ok {
17    ample::result!( Ok; "MUnMap Ok"; usize; [
18        [0; OK; Default; usize; "Ok"; "All good"],
19    ]);
20
21    impl Ok {
22        pub fn from_no(no: usize) -> Self {
23            Ok::Default(no)
24        }
25    }
26}
27
28pub mod error {
29    ample::result!(Error; "MUnMap error"; usize; [
30        [1; ERROR;          Default;            usize; "Error"; "Something wicked this way comes"],
31        [4;   EINTR;        Interrupted;      usize;            "EINTR";     "System call was interrupted"],
32        [5;   EIO;          IOError;          usize;              "EIO";       "Input/output error"],
33        [9;   EBADF;        BadFileDescriptor;usize;            "EBADF";     "Bad file descriptor"],
34        [14;  EFAULT;       InvalidBuffer;    usize;           "EFAULT";    "Invalid buffer pointer"],
35        [22;  EINVAL;       InvalidCount;     usize;           "EINVAL";    "Invalid count"],
36        [21;  EISDIR;       IsDirectory;      usize;           "EISDIR";    "Is a directory"],
37        [13;  EACCES;       NotReadable;      usize;           "EACCES";    "File not open for reading"],
38    ]);
39
40    impl Error {
41        pub fn from_no(no: usize) -> Self {
42            Error::Default(no)
43        }
44    }
45}
46
47pub use error::Error;
48pub use ok::Ok;
49
50pub type Result = core::result::Result<Ok, Error>;
51
52pub fn handle_result(result: crate::Result) -> crate::Result {
53    // Err(crate::Error::Default(1))
54    match result {
55        crate::Result::Ok(crate::Ok::Target(crate::target::Ok::Arch(
56            crate::target::arch::Ok::X86_64Syscall(
57                crate::target::arch::syscall::Ok::X86_64Syscall3(
58                    crate::target::arch::syscall::syscall3::Ok::Default(m),
59                ),
60            ),
61        ))) => core::result::Result::Ok(crate::Ok::Target(crate::target::Ok::Os(
62            crate::target::os::Ok::Syscall(crate::target::os::syscall::Ok::Read(
63                crate::target::os::syscall::read::Ok::Default(m),
64            )),
65        ))),
66        _ => core::result::Result::Err(crate::Error::Target(crate::target::Error::Os(
67            crate::target::os::Error::Syscall(crate::target::os::syscall::Error::Read(
68                Error::Default(3),
69            )),
70        ))),
71    }
72}