Luna/kernel/src/sys/open.cpp

47 lines
1.2 KiB
C++
Raw Normal View History

#include "Log.h"
#include "fs/VFS.h"
#include "memory/MemoryManager.h"
#include "sys/Syscall.h"
#include "thread/Scheduler.h"
Result<u64> sys_open(Registers*, SyscallArgs args)
{
u64 path_address = args[0];
if (!MemoryManager::validate_userspace_string(path_address)) return err(EFAULT);
const char* path = (const char*)path_address;
int flags = (int)args[1];
Thread* current = Scheduler::current();
kinfoln("open: trying to open file %s, flags %d", path, flags);
auto inode = TRY(VFS::resolve_path(path));
int fd = TRY(current->allocate_fd(0));
current->fd_table->fds[fd] = FileDescriptor { inode, 0, flags };
kinfoln("open: allocated file descriptor %d for inode %zu", fd, inode->inode_number());
return (u64)fd;
}
Result<u64> sys_close(Registers*, SyscallArgs args)
{
int fd = (int)args[0];
if (fd < 0 || fd >= FD_MAX) return err(EBADF);
Thread* current = Scheduler::current();
2023-03-11 17:02:50 +00:00
Option<FileDescriptor>& descriptor = current->fd_table->fds[fd];
2023-03-11 17:02:50 +00:00
if (!descriptor.has_value()) return err(EBADF);
2023-03-11 17:02:50 +00:00
kinfoln("close: closing file descriptor %d (was referencing inode %zu)", fd, descriptor->inode->inode_number());
descriptor = {};
return 0;
}