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

1use 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    // Err(crate::Error::Default(1))
70    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}