userspace/file/
load.rs

1use crate::memory::heap::Allocating;
2use crate::target::os::syscall;
3
4pub fn load(filepath: &str) -> Option<(isize, syscall::fstat::Stat, *const u8)> {
5    use ample::traits::AllocatableResult;
6    let filepath =
7        ample::string::terminate::<crate::Origin, crate::Origin, crate::memory::heap::Allocator>(
8            filepath,
9        );
10
11    let filepath = match filepath {
12        core::result::Result::Ok(a) => a.as_ptr(),
13        _ => return None,
14    };
15
16    let license_mapping;
17    'opening: loop {
18        #[allow(unused_assignments)]
19        let mut fd: isize = isize::MIN;
20        let stat;
21        'closing: loop {
22            fd = match syscall::openat(
23                syscall::open::AtFlag::FDCWD.to(),
24                filepath,
25                syscall::open::Flag::RDONLY.to(),
26            ) {
27                core::result::Result::Ok(crate::Ok::Target(crate::target::Ok::Os(
28                    crate::target::os::Ok::Syscall(crate::target::os::syscall::Ok::Open(
29                        crate::target::os::syscall::open::Ok::OPENAT(fd),
30                    )),
31                ))) => fd as isize,
32                _ => break 'opening None,
33            };
34
35            stat = crate::file::information::from_fd(fd);
36
37            license_mapping = u8::allocate(stat.st_size as usize);
38
39            let _ = syscall::read(fd, license_mapping, stat.st_size as usize);
40            break 'closing;
41        }
42        if fd >= 0 {
43            // let _ = syscall::close(fd as i32);
44            break 'opening Some((fd, stat, license_mapping));
45        }
46        break 'opening None;
47    }
48}