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