From f10ad93c4e13d9136a3c0f331e8b7b39c6a8b4de Mon Sep 17 00:00:00 2001 From: topjohnwu Date: Sat, 13 Sep 2025 01:21:33 -0700 Subject: [PATCH] Move more code of daemon_entry into Rust --- native/src/core/daemon.cpp | 19 +------------------ native/src/core/daemon.rs | 28 +++++++++++++++++++++++----- 2 files changed, 24 insertions(+), 23 deletions(-) diff --git a/native/src/core/daemon.cpp b/native/src/core/daemon.cpp index 179b5a868..cbba200bd 100644 --- a/native/src/core/daemon.cpp +++ b/native/src/core/daemon.cpp @@ -243,33 +243,16 @@ static void handle_request(pollfd *pfd) { } static void daemon_entry() { - android_logging(); - - // Block all signals - sigset_t block_set; - sigfillset(&block_set); - pthread_sigmask(SIG_SETMASK, &block_set, nullptr); - // Change process name set_nice_name("magiskd"); - int fd = xopen("/dev/null", O_WRONLY); - xdup2(fd, STDOUT_FILENO); - xdup2(fd, STDERR_FILENO); - if (fd > STDERR_FILENO) - close(fd); - fd = xopen("/dev/zero", O_RDONLY); - xdup2(fd, STDIN_FILENO); - if (fd > STDERR_FILENO) - close(fd); - rust::daemon_entry(); SDK_INT = MagiskD::Get().sdk_int(); // Get self stat xstat("/proc/self/exe", &self_st); - fd = xsocket(AF_LOCAL, SOCK_STREAM | SOCK_CLOEXEC, 0); + int fd = xsocket(AF_LOCAL, SOCK_STREAM | SOCK_CLOEXEC, 0); sockaddr_un addr = {.sun_family = AF_LOCAL}; ssprintf(addr.sun_path, sizeof(addr.sun_path), "%s/" MAIN_SOCKET, get_magisk_tmp()); unlink(addr.sun_path); diff --git a/native/src/core/daemon.rs b/native/src/core/daemon.rs index 3f6d83db3..931449c26 100644 --- a/native/src/core/daemon.rs +++ b/native/src/core/daemon.rs @@ -8,7 +8,7 @@ use crate::ffi::{ DbEntryKey, ModuleInfo, RequestCode, check_key_combo, denylist_handler, exec_common_scripts, exec_module_scripts, get_magisk_tmp, initialize_denylist, scan_deny_apps, setup_magisk_env, }; -use crate::logging::{magisk_logging, setup_logfile, start_log_daemon}; +use crate::logging::{android_logging, magisk_logging, setup_logfile, start_log_daemon}; use crate::module::{disable_modules, remove_modules}; use crate::mount::{clean_mounts, setup_preinit_dir}; use crate::package::ManagerInfo; @@ -22,12 +22,16 @@ use base::{ AtomicArc, BufReadExt, FsPathBuilder, ReadExt, ResultExt, Utf8CStr, Utf8CStrBuf, WriteExt, cstr, error, info, libc, }; -use nix::fcntl::OFlag; -use nix::mount::MsFlags; +use nix::{ + fcntl::OFlag, + mount::MsFlags, + sys::signal::SigSet, + unistd::{dup2_stderr, dup2_stdin, dup2_stdout, setsid}, +}; use std::fmt::Write as FmtWrite; use std::fs::File; use std::io::{BufReader, Write}; -use std::os::fd::{FromRawFd, IntoRawFd, OwnedFd}; +use std::os::fd::{AsFd, FromRawFd, IntoRawFd, OwnedFd}; use std::process::{Command, exit}; use std::sync::atomic::{AtomicBool, Ordering}; use std::sync::{Mutex, OnceLock}; @@ -302,7 +306,21 @@ impl MagiskD { } pub fn daemon_entry() { - unsafe { libc::setsid() }; + android_logging(); + + // Block all signals + SigSet::all().thread_set_mask().log_ok(); + + // Swap out the original stdio + if let Ok(null) = cstr!("/dev/null").open(OFlag::O_WRONLY).log() { + dup2_stdout(null.as_fd()).log_ok(); + dup2_stderr(null.as_fd()).log_ok(); + } + if let Ok(zero) = cstr!("/dev/zero").open(OFlag::O_RDONLY).log() { + dup2_stdin(zero).log_ok(); + } + + setsid().log_ok(); // Make sure the current context is magisk if let Ok(mut current) =