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 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 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}