Luna/libos/src/Process.cpp
apio 0fad179485
All checks were successful
continuous-integration/drone/push Build is passing
apps+libc+libos: Remove _LUNA_SYSTEM_ERROR_EXTENSIONS and reorder headers
libluna/libos headers can now go after errno.h, so there's no reason to keep them separate.
2023-05-02 10:51:53 +02:00

44 lines
1.3 KiB
C++

#include <errno.h>
#include <os/Process.h>
#include <sys/syscall.h>
#include <unistd.h>
namespace os
{
Result<pid_t> Process::fork()
{
long rc = syscall(SYS_fork);
return Result<pid_t>::from_syscall(rc);
}
Result<void> Process::exec(StringView path, Slice<String> args, bool search_in_path)
{
Vector<const char*> argv;
for (const auto& arg : args) { TRY(argv.try_append(arg.chars())); }
TRY(argv.try_append(nullptr));
if (search_in_path) execvp(path.chars(), const_cast<char**>(argv.data()));
else
execv(path.chars(), const_cast<char**>(argv.data()));
return err(errno);
}
Result<void> Process::exec(StringView path, Slice<String> args, Slice<String> env, bool search_in_path)
{
Vector<const char*> argv;
for (const auto& arg : args) { TRY(argv.try_append(arg.chars())); }
TRY(argv.try_append(nullptr));
Vector<const char*> envp;
for (const auto& arg : env) { TRY(envp.try_append(arg.chars())); }
TRY(envp.try_append(nullptr));
if (search_in_path) execvpe(path.chars(), const_cast<char**>(argv.data()), const_cast<char**>(envp.data()));
else
execve(path.chars(), const_cast<char**>(argv.data()), const_cast<char**>(envp.data()));
return err(errno);
}
}