diff --git a/acpid/src/main.rs b/acpid/src/main.rs index d58343413b..6ae7d32035 100644 --- a/acpid/src/main.rs +++ b/acpid/src/main.rs @@ -85,44 +85,7 @@ fn setup_logging() -> Option<&'static RedoxLogger> { } } -fn main() { - let mut pipes = [0; 2]; - syscall::pipe2(&mut pipes, 0).expect("acpid: failed to create synchronization pipe"); - let [read_part, write_part] = pipes; - - let mut read_part = unsafe { File::from_raw_fd(read_part as RawFd) }; - let mut write_part = unsafe { File::from_raw_fd(write_part as RawFd) }; - - let pid = unsafe { syscall::clone(syscall::CloneFlags::empty()).expect("failed to daemonize acpid") }; - - if pid != 0 { - drop(write_part); - - let mut res = [0]; - let bytes_read = read_part.read(&mut res).expect("acpid: failed to read from sync pipe"); - - let exit_code = if bytes_read == res.len() { - res[0] - } else { - eprintln!("acpid: daemon pipe EOF"); - 1 - }; - drop(read_part); - std::process::exit(exit_code.into()); - } - drop(read_part); - - let mut scheme_socket = OpenOptions::new() - .write(true) - .read(true) - .create(true) - .custom_flags(O_NONBLOCK as i32) - .open(":acpi") - .expect("acpid: failed to open scheme socket"); - - let _ = write_part.write(&[0]).expect("acpid: failed to write to sync pipe"); - drop(write_part); - +fn daemon(mut write_part: File) { setup_logging(); let rxsdt_raw_data: Arc<[u8]> = std::fs::read("kernel/acpi:rxsdt") @@ -170,6 +133,17 @@ fn main() { .open("event:") .expect("acpid: failed to open event queue"); + let mut scheme_socket = OpenOptions::new() + .write(true) + .read(true) + .create(true) + .custom_flags(O_NONBLOCK as i32) + .open(":acpi") + .expect("acpid: failed to open scheme socket"); + + write_part.write_all(&[0]).expect("acpid: failed to write to sync pipe"); + drop(write_part); + syscall::setrens(0, 0).expect("acpid: failed to enter null namespace"); let _ = event_queue.write(&Event { @@ -252,3 +226,23 @@ fn main() { unreachable!("System should have shut down before this is entered"); } + +fn main() { + let mut pipes = [0; 2]; + syscall::pipe2(&mut pipes, 0).expect("acpid: failed to create synchronization pipe"); + + let mut read_part = unsafe { File::from_raw_fd(pipes[0] as RawFd) }; + let mut write_part = unsafe { File::from_raw_fd(pipes[1] as RawFd) }; + + if unsafe { syscall::clone(syscall::CloneFlags::empty()).expect("failed to daemonize acpid") } == 0 { + drop(read_part); + daemon(write_part); + } else { + drop(write_part); + + let mut res = [0]; + let bytes_read = read_part.read_exact(&mut res).expect("acpid: failed to read from sync pipe"); + + std::process::exit(res[0].into()); + } +}