summaryrefslogtreecommitdiff
path: root/start/src/main.cpp
diff options
context:
space:
mode:
authorNikolai Nechaev <nikolay_nechaev@mail.ru>2025-12-08 02:53:24 +0900
committerGitHub <noreply@github.com>2025-12-07 17:53:24 +0000
commitca99e8228cd3b2fa062d74f16c0531f217d722b2 (patch)
tree2c525f549ce260fbe51e3e23367ce49a53717f69 /start/src/main.cpp
parent8ca40479a72cdc722bf2144e51428224731aa04d (diff)
internal/start: More careful signal handling (#12573)
- Take out signal set up into a subroutine; - Use `sigaction` instead of `signal` for consistent behavior across UNIX platforms; - Enable a warning when a signal handler set up fails; - Don't do anything to SIGKILL, since it cannot be handled.
Diffstat (limited to 'start/src/main.cpp')
-rw-r--r--start/src/main.cpp18
1 files changed, 14 insertions, 4 deletions
diff --git a/start/src/main.cpp b/start/src/main.cpp
index 78fbf0f4..74de393c 100644
--- a/start/src/main.cpp
+++ b/start/src/main.cpp
@@ -1,4 +1,5 @@
#include <csignal>
+#include <cstring>
#include <print>
#include "helpers/Logger.hpp"
@@ -28,14 +29,23 @@ static void onSignal(int sig) {
exit(0);
}
+static void terminateChildOnSignal(int signal) {
+ struct sigaction sa;
+ sa.sa_handler = onSignal;
+ sigemptyset(&sa.sa_mask);
+ sa.sa_flags = SA_RESTART;
+ int ret = sigaction(signal, &sa, nullptr);
+ if (ret != 0)
+ g_logger->log(Hyprutils::CLI::LOG_WARN, "Failed to set up handler for signal {}: {}", signal, strerror(errno));
+}
+
int main(int argc, const char** argv, const char** envp) {
g_logger = makeUnique<Hyprutils::CLI::CLoggerConnection>(*g_loggerMain);
g_logger->setName("start-hyprland");
g_logger->setLogLevel(Hyprutils::CLI::LOG_DEBUG);
- signal(SIGTERM, ::onSignal);
- signal(SIGINT, ::onSignal);
- signal(SIGKILL, ::onSignal);
+ terminateChildOnSignal(SIGTERM);
+ terminateChildOnSignal(SIGINT);
int startArgv = -1;
@@ -84,4 +94,4 @@ int main(int argc, const char** argv, const char** envp) {
}
return 0;
-} \ No newline at end of file
+}