From 7f7ab6bc8aac6148ef0aa25a7435ee11a78dba5f Mon Sep 17 00:00:00 2001 From: outfoxxed Date: Thu, 9 Apr 2026 00:10:49 -0700 Subject: [PATCH] launch: use dup2 to reset daemon stdio over close+open --- changelog/next.md | 1 + src/launch/main.cpp | 28 ++++++++++++++++++---------- 2 files changed, 19 insertions(+), 10 deletions(-) diff --git a/changelog/next.md b/changelog/next.md index d6dc60e..761161d 100644 --- a/changelog/next.md +++ b/changelog/next.md @@ -73,6 +73,7 @@ set shell id. - Fixed JsonAdapter sending unnecessary property changes for primitive values. - Fixed JsonAdapter serialization for lists. - Fixed pipewire crashes after hotplugging devices and changing default outputs. +- Fixed launches failing for `--daemonize` on some systems. ## Packaging Changes diff --git a/src/launch/main.cpp b/src/launch/main.cpp index a324e09..efd6628 100644 --- a/src/launch/main.cpp +++ b/src/launch/main.cpp @@ -84,21 +84,29 @@ void exitDaemon(int code) { close(DAEMON_PIPE); - close(STDIN_FILENO); - close(STDOUT_FILENO); - close(STDERR_FILENO); - - if (open("/dev/null", O_RDONLY) != STDIN_FILENO) { // NOLINT - qFatal() << "Failed to open /dev/null on stdin"; + auto fd = open("/dev/null", O_RDWR); + if (fd == -1) { + qCritical().nospace() << "Failed to open /dev/null for daemon stdio" << errno << ": " + << qt_error_string(); + return; } - if (open("/dev/null", O_WRONLY) != STDOUT_FILENO) { // NOLINT - qFatal() << "Failed to open /dev/null on stdout"; + if (dup2(fd, STDIN_FILENO) != STDIN_FILENO) { // NOLINT + qCritical().nospace() << "Failed to set daemon stdin to /dev/null" << errno << ": " + << qt_error_string(); } - if (open("/dev/null", O_WRONLY) != STDERR_FILENO) { // NOLINT - qFatal() << "Failed to open /dev/null on stderr"; + if (dup2(fd, STDOUT_FILENO) != STDOUT_FILENO) { // NOLINT + qCritical().nospace() << "Failed to set daemon stdout to /dev/null" << errno << ": " + << qt_error_string(); } + + if (dup2(fd, STDERR_FILENO) != STDERR_FILENO) { // NOLINT + qCritical().nospace() << "Failed to set daemon stderr to /dev/null" << errno << ": " + << qt_error_string(); + } + + close(fd); } int main(int argc, char** argv) {