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

1use crate::target::arch::{Arch, traits::Callable};
2
3hooking!(CLOSE);
4
5#[inline(always)]
6pub fn close(fd: i32) -> crate::Result {
7    let arch_result = Arch::syscall1(NUMBER, fd as usize);
8    handle_result(arch_result)
9}
10
11pub mod ok {
12    r#struct!(OkSyscallMUnMap { value: usize });
13
14    result!( Ok; "MUnMap Ok"; usize; [
15        [0; OK; Default; usize; "Ok"; "All good"],
16    ]);
17
18    impl Ok {
19        pub fn from_no(no: usize) -> Self {
20            Ok::Default(no)
21        }
22    }
23}
24
25pub mod error {
26    result!(Error; "MUnMap error"; usize; [
27        [1; ERROR; Default; usize; "Error"; "Something wicked this way comes"],
28    ]);
29
30    impl Error {
31        pub fn from_no(no: usize) -> Self {
32            Error::Default(no)
33        }
34    }
35}
36
37pub use error::Error;
38pub use ok::Ok;
39
40pub type Result = core::result::Result<Ok, Error>;
41
42pub fn handle_result(result: crate::Result) -> crate::Result {
43    // Err(crate::Error::Default(1))
44    match result {
45        crate::Result::Ok(crate::Ok::Target(crate::target::Ok::Arch(
46            crate::target::arch::Ok::X86_64Syscall(
47                crate::target::arch::syscall::Ok::X86_64Syscall1(
48                    crate::target::arch::syscall::syscall1::Ok::Default(m),
49                ),
50            ),
51        ))) => core::result::Result::Ok(crate::Ok::Target(crate::target::Ok::Os(
52            crate::target::os::Ok::Syscall(crate::target::os::syscall::Ok::Close(
53                crate::target::os::syscall::close::Ok::Default(m),
54            )),
55        ))),
56        _ => core::result::Result::Err(crate::Error::Target(crate::target::Error::Os(
57            crate::target::os::Error::Syscall(crate::target::os::syscall::Error::Close(
58                Error::Default(3),
59            )),
60        ))),
61    }
62}