userspace/target/operating_system/linux/syscall/
open.rs1use crate::target::arch::{Arch, traits::Callable};
2
3pub mod flags;
4pub use flags::{AtFlag, Flag};
5
6hooking!(OPEN);
7
8pub fn open(file_pathname: *const u8, flags: i32, mode: i32) -> crate::Result {
9 let syscall_result = Arch::syscall3(
10 NUMBER,
11 file_pathname as usize,
12 flags as usize,
13 mode as usize,
14 );
15
16 handle_result(syscall_result)
17}
18
19pub mod ok {
20 r#struct!(OkSyscallMUnMap { value: usize });
21
22 result!( Ok; "MUnMap Ok"; usize; [
23 [0; OK; Default; usize; "Ok"; "All good"],
24 [98; OPENAT; OPENAT; usize; "OPENAT"; "WAITING"],
25 [99; OPENAT4; OPENAT4; usize; "OPENAT"; "WAITING"],
26 ]);
27
28 impl Ok {
29 pub fn from_no(no: usize) -> Self {
30 Ok::Default(no)
31 }
32 }
33}
34
35pub mod error {
36 result!(Error; "MUnMap error"; usize; [
37 [1; ERROR; Default; usize; "Error"; "Something wicked this way comes"],
38 [2; ENOENT; FileNotFound; usize; "ENOENT"; "File not found"],
39 [13; EACCES; PermissionDenied; usize; "EACCES"; "Permission denied"],
40 [22; EINVAL; InvalidPath; usize; "EINVAL"; "Invalid path"],
41 [20; ENOTDIR; DirectoryNotFound; usize; "ENOTDIR"; "Directory not found"],
42 [40; ELOOP; TooManySymlinks; usize; "ELOOP"; "Too many levels of symbolic links"],
43 [36; ENAMETOOLONG; PathnameTooLong; usize; "ENAMETOOLONG"; "Pathname too long"],
44 [17; EEXIST; FileExists; usize; "EEXIST"; "File exists"],
45 [24; EMFILE; TooManyOpenFiles; usize; "EMFILE"; "Too many open files"],
46 [28; ENOSPC; NoSpace; usize; "ENOSPC"; "No space left on device"],
47 [98; OPENAT; OPENAT; usize; "OPENAT"; "WAITING"],
48 [99; OPENAT4; OPENAT4; usize; "OPENAT"; "WAITING"],
49 ]);
50
51 impl Error {
52 pub fn from_no(no: usize) -> Self {
53 Error::Default(no)
54 }
55 }
56}
57
58pub use error::Error;
59pub use ok::Ok;
60
61pub type Result = core::result::Result<Ok, Error>;
62
63pub fn handle_result(result: crate::Result) -> crate::Result {
64 match result {
66 crate::Result::Ok(crate::Ok::Target(crate::target::Ok::Arch(
67 crate::target::arch::Ok::X86_64Syscall(
68 crate::target::arch::syscall::Ok::X86_64Syscall3(
69 crate::target::arch::syscall::syscall3::Ok::Default(m),
70 ),
71 ),
72 ))) => core::result::Result::Ok(crate::Ok::Target(crate::target::Ok::Os(
73 crate::target::os::Ok::Syscall(crate::target::os::syscall::Ok::Open(
74 crate::target::os::syscall::open::Ok::Default(m),
75 )),
76 ))),
77 _ => core::result::Result::Err(crate::Error::Target(crate::target::Error::Os(
78 crate::target::os::Error::Syscall(crate::target::os::syscall::Error::Open(
79 Error::Default(3),
80 )),
81 ))),
82 }
83}