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