mirror of
https://github.com/hedge-dev/UnleashedRecomp.git
synced 2026-04-28 05:11:37 +00:00
Implement OS Restart on Linux.
This commit is contained in:
parent
c22027be6a
commit
bf6ecbb34d
1 changed files with 44 additions and 7 deletions
|
|
@ -1,20 +1,57 @@
|
|||
#include <os/process_detail.h>
|
||||
|
||||
#include <signal.h>
|
||||
|
||||
std::filesystem::path os::process::detail::GetExecutablePath()
|
||||
{
|
||||
assert(false && "Unimplemented.");
|
||||
return std::filesystem::path();
|
||||
char exePath[PATH_MAX] = {};
|
||||
if (readlink("/proc/self/exe", exePath, PATH_MAX) > 0)
|
||||
{
|
||||
return std::filesystem::path(std::u8string_view((const char8_t*)(exePath)));
|
||||
}
|
||||
else
|
||||
{
|
||||
return std::filesystem::path();
|
||||
}
|
||||
}
|
||||
|
||||
std::filesystem::path os::process::detail::GetWorkingDirectory()
|
||||
{
|
||||
// TODO: There's a cross platform way to retrieve this which is just getting it from argv[0].
|
||||
assert(false && "Unimplemented.");
|
||||
return std::filesystem::path();
|
||||
char cwd[PATH_MAX] = {};
|
||||
char *res = getcwd(cwd, sizeof(cwd));
|
||||
if (res != nullptr)
|
||||
{
|
||||
return std::filesystem::path(std::u8string_view((const char8_t*)(cwd)));
|
||||
}
|
||||
else
|
||||
{
|
||||
return std::filesystem::path();
|
||||
}
|
||||
}
|
||||
|
||||
bool os::process::detail::StartProcess(const std::filesystem::path path, const std::vector<std::string> args, std::filesystem::path work)
|
||||
{
|
||||
assert(false && "Unimplemented.");
|
||||
return false;
|
||||
pid_t pid = fork();
|
||||
if (pid < 0)
|
||||
return false;
|
||||
|
||||
if (pid == 0)
|
||||
{
|
||||
setsid();
|
||||
|
||||
std::u8string workU8 = work.u8string();
|
||||
chdir((const char*)(workU8.c_str()));
|
||||
|
||||
std::u8string pathU8 = path.u8string();
|
||||
std::vector<char*> argStrs;
|
||||
argStrs.push_back((char*)(pathU8.c_str()));
|
||||
for (const std::string& arg : args)
|
||||
argStrs.push_back((char *)(arg.c_str()));
|
||||
|
||||
argStrs.push_back(nullptr);
|
||||
execvp((const char*)(pathU8.c_str()), argStrs.data());
|
||||
raise(SIGKILL);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue