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

1use crate::target::arch::{Arch, traits::Callable};
2
3hooking!(WRITE);
4
5pub fn write(file_descriptor: isize, byte_buffer: *const u8, byte_count: usize) -> crate::Result {
6    let syscall_result = Arch::syscall3(
7        NUMBER,
8        file_descriptor as usize,
9        byte_buffer as usize,
10        byte_count as usize,
11    );
12
13    handle_result(syscall_result)
14}
15
16pub mod ok {
17
18    ample::result!( Ok; "MUnMap Ok"; usize; [
19        [0; OK; Default; usize; "Ok"; "All good"],
20    ]);
21
22    impl Ok {
23        pub fn from_no(no: usize) -> Self {
24            Ok::Default(no)
25        }
26    }
27}
28
29pub mod error {
30    ample::result!(Error; "MUnMap error"; usize; [
31        [0;  ERROR2;   Default;           usize; "Error"; "Something wicked this way comes"],
32        [1;  ERROR;   Error;             usize; "Error"; "Something wicked this way comes"],
33        [9;  EBADF;   BadFileDescriptor; usize;   "EBADF";     "Bad file descriptor"],
34        [14; EFAULT;  InvalidBuffer;     usize;  "EFAULT";    "Invalid buffer pointer"],
35        [27; EFBIG;   BufferTooLarge;    usize;   "EFBIG";     "Buffer too large"],
36        [4;  EINTR;   Interrupted;       usize;   "EINTR";     "System call was interrupted"],
37        [5;  EIO;     IOError;           usize;     "EIO";       "Input/output error"],
38        [28; ENOSPC;  NoSpaceLeft;       usize;  "ENOSPC";    "No space left on device"],
39        [32; EPIPE;   BrokenPipe;        usize;   "EPIPE";     "Broken pipe"],
40    ]);
41
42    impl Error {
43        pub fn from_no(no: usize) -> Self {
44            Error::Default(no)
45        }
46    }
47}
48
49pub use error::Error;
50pub use ok::Ok;
51
52pub type Result = core::result::Result<Ok, Error>;
53
54pub fn handle_result(result: crate::Result) -> crate::Result {
55    // Err(crate::Error::Default(1))
56    match result {
57        crate::Result::Ok(crate::Ok::Target(crate::target::Ok::Arch(
58            crate::target::arch::Ok::X86_64Syscall(
59                crate::target::arch::syscall::Ok::X86_64Syscall3(
60                    crate::target::arch::syscall::syscall3::Ok::Default(m),
61                ),
62            ),
63        ))) => core::result::Result::Ok(crate::Ok::Target(crate::target::Ok::Os(
64            crate::target::os::Ok::Syscall(crate::target::os::syscall::Ok::Write(
65                crate::target::os::syscall::write::Ok::Default(m),
66            )),
67        ))),
68        _ => core::result::Result::Err(crate::Error::Target(crate::target::Error::Os(
69            crate::target::os::Error::Syscall(crate::target::os::syscall::Error::Write(
70                Error::Default(3),
71            )),
72        ))),
73    }
74}