userspace/file/
load.rs

1use crate::target::os::syscall;
2
3pub fn load(filepath: &str) -> Option<(isize, syscall::fstat::Stat, *const u8)> {
4    let filepath = crate::types::string::terminate(filepath);
5    let license_mapping;
6    'opening: loop {
7        #[allow(unused_assignments)]
8        let mut fd: isize = isize::MIN;
9        let stat;
10        'closing: loop {
11            fd = match syscall::openat(
12                syscall::open::flags::AtFlag::FDCWD as isize,
13                filepath,
14                syscall::open::flags::Flag::RDONLY as i32,
15            ) {
16                // Ok(syscall::Ok::Open(syscall::open::Ok::OPENAT(no))) => no as isize,
17                core::result::Result::Ok(crate::Ok::Target(crate::target::Ok::Os(
18                    crate::target::os::Ok::Syscall(crate::target::os::syscall::Ok::Open(
19                        crate::target::os::syscall::open::Ok::OPENAT(fd),
20                    )),
21                ))) => fd as isize,
22                _ => break 'opening None,
23            };
24
25            stat = crate::file::information::from_fd(fd);
26
27            // crate::info!("{:?}\n", stat);
28
29            license_mapping = match syscall::mmap(
30                core::ptr::null_mut(),
31                stat.st_size as usize,
32                (syscall::mmap::Prot::Read | syscall::mmap::Prot::Write) as i32,
33                (syscall::mmap::Flag::Anonymous | syscall::mmap::Flag::Private) as i32,
34                -1,
35                0,
36            ) {
37                core::result::Result::Ok(crate::Ok::Target(crate::target::Ok::Os(
38                    crate::target::os::Ok::Syscall(crate::target::os::syscall::Ok::MMap(
39                        crate::target::os::syscall::mmap::Ok::Default(fd),
40                    )),
41                ))) => fd as *const u8,
42                _ => {
43                    crate::info!("Failed to mmap file");
44                    panic!("k")
45                }
46            };
47
48            let _ = syscall::read(fd, license_mapping, stat.st_size as usize);
49            break 'closing;
50        }
51        if fd >= 0 {
52            // let _ = syscall::close(fd as i32);
53            break 'opening Some((fd, stat, license_mapping));
54        }
55        break 'opening None;
56    }
57}