diff --git a/Cargo.lock b/Cargo.lock index d96bb382d7..f49ff0b579 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -6,6 +6,7 @@ version = 3 name = "audiod" version = "0.1.0" dependencies = [ + "libc", "redox-daemon", "redox_syscall", ] diff --git a/Cargo.toml b/Cargo.toml index 11b15edd24..30a3c780cd 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -7,3 +7,4 @@ edition = "2018" [dependencies] redox-daemon = "0.1" redox_syscall = "0.2.12" +libc = "0.2" diff --git a/src/main.rs b/src/main.rs index b2d49fb596..8ec6ede302 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,11 +1,12 @@ extern crate syscall; +use std::mem::MaybeUninit; +use std::ptr::addr_of_mut; 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::{SigActionFlags, SIGUSR1}; +use syscall::data::Packet; use syscall::scheme::SchemeBlockMut; use redox_daemon::Daemon; @@ -34,7 +35,7 @@ fn thread(scheme: Arc>, pid: usize, mut hw_file: fs::File) -> }; // Wake up the scheme thread - syscall::kill(pid, SIGUSR1).map_err(from_syscall_error)?; + syscall::kill(pid, syscall::SIGUSR1).map_err(from_syscall_error)?; hw_file.write(&buffer_u8)?; } @@ -42,11 +43,19 @@ fn thread(scheme: Arc>, pid: usize, mut hw_file: fs::File) -> fn daemon(daemon: Daemon) -> io::Result<()> { // Handle signals from the hw thread - syscall::sigaction(SIGUSR1, Some(&SigAction { - sa_handler: Some(sigusr_handler), - sa_mask: [0; 2], - sa_flags: SigActionFlags::empty(), - }), None).map_err(from_syscall_error)?; + + unsafe { + let mut sigaction = MaybeUninit::::uninit(); + addr_of_mut!((*sigaction.as_mut_ptr()).sa_flags).write(0); + libc::sigemptyset(addr_of_mut!((*sigaction.as_mut_ptr()).sa_mask)); + addr_of_mut!((*sigaction.as_mut_ptr()).sa_sigaction).write(sigusr_handler as usize); + + match libc::sigaction(libc::SIGUSR1, sigaction.as_ptr(), core::ptr::null_mut()) { + 0 => (), + -1 => return Err(io::Error::last_os_error()), + _ => unreachable!(), + } + } let pid = syscall::getpid().map_err(from_syscall_error)?;