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