Luna/kernel/src/fs/InitRD.cpp
apio dc766e1da7
Some checks failed
Build and test / build (push) Has been cancelled
kernel: Rework VFS access checking + add processes
VFS functions now accept a single Process* pointer instead of credentials and groups.
There is now a distinction between processes and threads
Now to fix all the bugs... waitpid crashes the process with an NX error...
2024-12-06 21:35:59 +01:00

54 lines
1.5 KiB
C++

#include "InitRD.h"
#include "Log.h"
#include "arch/MMU.h"
#include "boot/bootboot.h"
#include "fs/VFS.h"
#include "memory/MemoryManager.h"
#include "thread/Thread.h"
#include <bits/modes.h>
#include <luna/Common.h>
TarStream g_initrd;
extern const BOOTBOOT bootboot;
void InitRD::initialize()
{
u64 virtual_initrd_address = MMU::translate_physical_address(bootboot.initrd_ptr);
g_initrd.initialize((void*)virtual_initrd_address, bootboot.initrd_size);
}
static Result<void> vfs_create_dir_if_not_exists(const char* path, mode_t mode)
{
auto rc = VFS::create_directory(path, mode & (mode_t)~S_IFMT, nullptr);
if (rc.has_error())
{
if (rc.error() == EEXIST) return {};
return rc.release_error();
}
auto dir = rc.value();
return {};
}
Result<void> InitRD::populate_vfs()
{
TarStream::Entry entry;
while (TRY(g_initrd.read_next_entry(entry)))
{
if (entry.type == TarStream::EntryType::RegularFile)
{
auto file = TRY(VFS::create_file(entry.name.chars(), entry.mode & (mode_t)~S_IFMT, nullptr));
file->write(entry.data(), 0, entry.size);
}
else if (entry.type == TarStream::EntryType::Directory)
{
TRY(vfs_create_dir_if_not_exists(entry.name.chars(), entry.mode));
}
}
// Now we don't need the original initrd anymore
MemoryManager::free_frames(bootboot.initrd_ptr, ceil_div(bootboot.initrd_size, ARCH_PAGE_SIZE));
return {};
}