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

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