feat(servei): reinici real via execv

This commit is contained in:
JailDesigner committed 2026-05-25 17:29:42 +02:00
1 parent 774874deb0
commit a8ccb3fae1
5 files changed
+97 -11

No files matched your search

+51
View File
@@ -0,0 +1,51 @@
// relaunch.cpp - Implementació del reinici en calent
#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 és l'única que gestiona el
// reinici, així que els statics 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;
}
void execIfRequested() {
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 aquí, execv ha fallat. Tots els subsistemes ja estan
// destruïts; sortim amb error i el shell rebrà el codi.
std::cerr << "[Relaunch] Ha fallat: " << std::strerror(errno) << '\n';
std::exit(EXIT_FAILURE);
}
} // namespace System::Relaunch