From b15b3193b83f904d873d6fe9be445f92ea9026ef Mon Sep 17 00:00:00 2001 From: Jeremy Soller Date: Mon, 25 Jul 2022 10:49:48 -0600 Subject: [PATCH] Use syscall::Daemon --- src/main.rs | 42 +++++++++++++++++------------------------- 1 file changed, 17 insertions(+), 25 deletions(-) diff --git a/src/main.rs b/src/main.rs index 12148c9b75..ea54fd356f 100644 --- a/src/main.rs +++ b/src/main.rs @@ -4,7 +4,8 @@ use std::{fs, io, mem, process, slice, thread}; use std::io::{Read, Write}; use std::sync::{Arc, Mutex}; use syscall::data::{Packet, SigAction}; -use syscall::flag::{CloneFlags, SigActionFlags, O_CLOEXEC, SIGUSR1}; +use syscall::daemon::Daemon; +use syscall::flag::{SigActionFlags, SIGUSR1}; use syscall::scheme::SchemeBlockMut; use self::scheme::AudioScheme; @@ -37,7 +38,7 @@ fn thread(scheme: Arc>, pid: usize, mut hda_file: fs::File) - } } -fn daemon(pipe_fd: usize) -> io::Result<()> { +fn daemon(daemon: Daemon) -> io::Result<()> { // Handle signals from the hda thread syscall::sigaction(SIGUSR1, Some(&SigAction { sa_handler: Some(sigusr_handler), @@ -51,10 +52,6 @@ fn daemon(pipe_fd: usize) -> io::Result<()> { let mut scheme_file = fs::OpenOptions::new().create(true).read(true).write(true).open(":audio")?; - // The scheme is now ready to accept requests, notify the original process - syscall::write(pipe_fd, &[1]).map_err(from_syscall_error)?; - let _ = syscall::close(pipe_fd); - let scheme = Arc::new(Mutex::new(AudioScheme::new())); // Spawn a thread to mix and send audio data @@ -65,6 +62,9 @@ fn daemon(pipe_fd: usize) -> io::Result<()> { // memory: can be accessed for stack allocation syscall::setrens(0, 0).map_err(from_syscall_error)?; + // The scheme is now ready to accept requests, notify the original process + daemon.ready().map_err(from_syscall_error)?; + let mut todo = Vec::new(); loop { let mut packet = Packet::default(); @@ -99,26 +99,18 @@ fn daemon(pipe_fd: usize) -> io::Result<()> { } } -fn audiod() -> io::Result<()> { - let mut pipe = [0; 2]; - syscall::pipe2(&mut pipe, O_CLOEXEC).map_err(from_syscall_error)?; - - // Daemonize - if unsafe { syscall::clone(CloneFlags::empty()) }.map_err(from_syscall_error)? == 0 { - let _ = syscall::close(pipe[0]); - return daemon(pipe[1]); - } else { - let _ = syscall::close(pipe[1]); - - syscall::read(pipe[0], &mut [0]).map_err(from_syscall_error)?; - let _ = syscall::close(pipe[0]); - - Ok(()) - } -} - fn main() { - if let Err(err) = audiod() { + if let Err(err) = Daemon::new(|x| { + match daemon(x) { + Ok(()) => { + process::exit(0); + }, + Err(err) => { + eprintln!("audiod: {}", err); + process::exit(1); + } + } + }) { eprintln!("audiod: {}", err); process::exit(1); }