Luna/kernel/src/sys/pledge.cpp
apio e2a77bb3da
Some checks failed
continuous-integration/drone/push Build is failing
kernel+libc: Add pledge support
2023-08-12 21:38:25 +02:00

41 lines
1.1 KiB
C++

#include "Pledge.h"
#include "sys/Syscall.h"
#include "thread/Scheduler.h"
Result<u64> sys_pledge(Registers*, SyscallArgs args)
{
int promises = TRY(parse_promises(args[0]));
int execpromises = TRY(parse_promises(args[1]));
auto* current = Scheduler::current();
if (promises >= 0)
{
int actual_promises = promises & ~(1 << (int)Promise::p_error);
int old_promises = current->promises & ~(1 << (int)Promise::p_error);
if (actual_promises & ~old_promises)
{
if (current->promises & ~(1 << (int)Promise::p_error)) return 0;
return err(EPERM);
}
}
if (execpromises >= 0)
{
int actual_execpromises = execpromises & ~(1 << (int)Promise::p_error);
int old_execpromises = current->execpromises & ~(1 << (int)Promise::p_error);
if (actual_execpromises & ~old_execpromises)
{
if (current->execpromises & ~(1 << (int)Promise::p_error)) return 0;
return err(EPERM);
}
}
if (promises >= 0) current->promises = promises;
if (execpromises >= 0) current->execpromises = execpromises;
return 0;
}