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

1use crate::target::arch::{Arch, traits::Callable};
2
3pub mod flags;
4pub use flags::Flag;
5
6hooking!(LSEEK);
7
8#[inline(always)]
9pub fn lseek(fd: i32, offset: i64, whence: i32) -> crate::Result {
10    let arch_result = Arch::syscall3(NUMBER, fd as usize, offset as usize, whence as usize);
11
12    handle_result(arch_result)
13}
14
15pub mod ok {
16    r#struct!(OkSyscallMUnMap { value: usize });
17
18    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    result!(Error; "MUnMap error"; usize; [
31        [1; ERROR; Default; usize; "Error"; "Something wicked this way comes"],
32    ]);
33
34    impl Error {
35        pub fn from_no(no: usize) -> Self {
36            Error::Default(no)
37        }
38    }
39}
40
41pub use error::Error;
42pub use ok::Ok;
43
44pub type Result = core::result::Result<Ok, Error>;
45
46pub fn handle_result(result: crate::Result) -> crate::Result {
47    // Err(crate::Error::Default(1))
48    match result {
49        crate::Result::Ok(crate::Ok::Target(crate::target::Ok::Arch(
50            crate::target::arch::Ok::X86_64Syscall(
51                crate::target::arch::syscall::Ok::X86_64Syscall3(
52                    crate::target::arch::syscall::syscall3::Ok::Default(m),
53                ),
54            ),
55        ))) => core::result::Result::Ok(crate::Ok::Target(crate::target::Ok::Os(
56            crate::target::os::Ok::Syscall(crate::target::os::syscall::Ok::LSeek(
57                crate::target::os::syscall::lseek::Ok::Default(m),
58            )),
59        ))),
60        _ => core::result::Result::Err(crate::Error::Target(crate::target::Error::Os(
61            crate::target::os::Error::Syscall(crate::target::os::syscall::Error::LSeek(
62                Error::Default(3),
63            )),
64        ))),
65    }
66}