git.lucas.co / cce-display-manager
login greeter
git clone https://git.lucas.co/cce-display-manager.git

commitdc84ff98f2e82e6911de41955e4e29648e1be5f0
parentc7e22eb96c
authorLucas Galante <[email protected]>
date2026-05-28 21:26
fix: redirect entire daemon stdout/stderr to log file to capture compositor crashes

 src/main.rs | 29 +++++++++++++++++++----------
 1 file changed, 19 insertions(+), 10 deletions(-)

diff --git a/src/main.rs b/src/main.rs
index b00d1fc..15ed2dc 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -1438,6 +1438,21 @@ fn run_daemon() {
         std::process::exit(1);
     }
 
+    // Redirect stdout and stderr of the daemon to a log file
+    if let Ok(log_file) = std::fs::OpenOptions::new()
+        .create(true)
+        .write(true)
+        .truncate(true)
+        .open("/tmp/clear-display-manager-daemon.log")
+    {
+        use std::os::unix::io::AsRawFd;
+        let fd = log_file.as_raw_fd();
+        unsafe {
+            libc::dup2(fd, 1);
+            libc::dup2(fd, 2);
+        }
+    }
+
     println!("[clear-display-manager] Starting display manager daemon...");
 
     let runtime_dir = "/run/clear-display-manager";
@@ -1571,16 +1586,10 @@ fn run_daemon() {
                 .env("PATH", "/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin")
                 .env("XDG_RUNTIME_DIR", &user_runtime_dir)
                 .env("XDG_SESSION_TYPE", if is_wayland { "wayland" } else { "x11" })
-                .env("XDG_SESSION_CLASS", "user");
-            let log_file = std::fs::File::create("/tmp/clear-display-manager-session.log");
-            if let Ok(ref f) = log_file {
-                session_cmd.stdout(std::process::Stdio::from(f.try_clone().unwrap()));
-                session_cmd.stderr(std::process::Stdio::from(f.try_clone().unwrap()));
-            } else {
-                session_cmd.stdout(std::process::Stdio::inherit());
-                session_cmd.stderr(std::process::Stdio::inherit());
-            }
-            session_cmd.stdin(std::process::Stdio::null());
+                .env("XDG_SESSION_CLASS", "user")
+                .stdin(std::process::Stdio::inherit())
+                .stdout(std::process::Stdio::inherit())
+                .stderr(std::process::Stdio::inherit());
 
             // Filter out sudo env vars so they don't leak into the user session
             for key in &["SUDO_USER", "SUDO_UID", "SUDO_GID", "SUDO_COMMAND"] {