userspace/target/operating_system/linux/syscall/
read.rs1use 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 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}