62 lines
1.4 KiB
C++
62 lines
1.4 KiB
C++
// relaunch.cpp - Implementacio del reinici en calent
|
|
// © 2026 JailDesigner
|
|
|
|
#include "core/system/relaunch.hpp"
|
|
|
|
#include <cerrno>
|
|
#include <cstdlib>
|
|
#include <cstring>
|
|
#include <iostream>
|
|
|
|
#ifdef _WIN32
|
|
#include <process.h> // _execv
|
|
#else
|
|
#include <unistd.h> // execv
|
|
#endif
|
|
|
|
namespace {
|
|
|
|
// Estat global (process-scope). Aquesta TU es la unica que gestiona el
|
|
// reinici, aixi que els static interns no s'escapen.
|
|
char** g_argv = nullptr;
|
|
bool g_requested = false;
|
|
|
|
} // namespace
|
|
|
|
namespace System::Relaunch {
|
|
|
|
void setArgv(int /*argc*/, char** argv) {
|
|
g_argv = argv;
|
|
}
|
|
|
|
void request() {
|
|
g_requested = true;
|
|
}
|
|
|
|
auto isRequested() -> bool {
|
|
return g_requested;
|
|
}
|
|
|
|
void execIfRequested() {
|
|
#ifdef __EMSCRIPTEN__
|
|
// Al navegador el reinici real seria location.reload(); aqui no fem res.
|
|
return;
|
|
#else
|
|
if (!g_requested || g_argv == nullptr || g_argv[0] == nullptr) {
|
|
return;
|
|
}
|
|
std::cout << "[Relaunch] Reiniciant " << g_argv[0] << "...\n";
|
|
#ifdef _WIN32
|
|
_execv(g_argv[0], g_argv);
|
|
#else
|
|
execv(g_argv[0], g_argv);
|
|
#endif
|
|
// Si arribem aqui, execv ha fallat. Tots els subsistemes ja estan
|
|
// destruits; sortim amb error i el shell rebra el codi.
|
|
std::cerr << "[Relaunch] Ha fallat: " << std::strerror(errno) << '\n';
|
|
std::exit(EXIT_FAILURE);
|
|
#endif
|
|
}
|
|
|
|
} // namespace System::Relaunch
|