diff --git a/Cargo.lock b/Cargo.lock index d05814a55c..d045dbd493 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -7,7 +7,9 @@ name = "audiod" version = "0.1.0" dependencies = [ "libc", + "libredox 0.0.3", "redox-daemon", + "redox-scheme", "redox_syscall", ] @@ -18,26 +20,63 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] -name = "libc" -version = "0.2.147" +name = "bitflags" +version = "2.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4668fb0ea861c1df094127ac5f1da3409a82116a4ba74fca2e58ef927159bb3" +checksum = "327762f6e5a765692301e5bb513e0d9fef63be86bbc14528052b1cd3e6f03e07" [[package]] -name = "redox-daemon" -version = "0.1.1" +name = "libc" +version = "0.2.150" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "811fd0d382a70c9e9192166ee794567b65ef34cc7309c86a49b071779ca9b5f3" +checksum = "89d92a4743f9a61002fae18374ed11e7973f530cb3a3255fb354818118b2203c" + +[[package]] +name = "libredox" +version = "0.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85c833ca1e66078851dba29046874e38f08b2c883700aa29a03ddd3b23814ee8" dependencies = [ + "bitflags 2.4.1", "libc", "redox_syscall", ] [[package]] -name = "redox_syscall" -version = "0.3.5" +name = "libredox" +version = "0.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29" +checksum = "962b650e6b934f95cec493e1464e0f5cba98dd9ba9ef2b1c42cdfdb7864cab5a" dependencies = [ - "bitflags", + "bitflags 2.4.1", + "libc", + "redox_syscall", +] + +[[package]] +name = "redox-daemon" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "353178b5771a301b9d2b318914ab5dfeb21dd6e65930faedde19248cfceca5a7" +dependencies = [ + "libc", + "libredox 0.0.1", +] + +[[package]] +name = "redox-scheme" +version = "0.1.0" +source = "git+https://gitlab.redox-os.org/redox-os/redox-scheme.git#afd3fa573f0a7c03b762ac23daaf06966afecc75" +dependencies = [ + "libredox 0.0.3", + "redox_syscall", +] + +[[package]] +name = "redox_syscall" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa" +dependencies = [ + "bitflags 1.3.2", ] diff --git a/Cargo.toml b/Cargo.toml index f9241cf96d..800f9af732 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -5,6 +5,8 @@ authors = ["Jeremy Soller "] edition = "2018" [dependencies] -redox-daemon = "0.1.1" -redox_syscall = "0.3" +redox-daemon = "0.1.2" +redox_syscall = "0.4.1" libc = "0.2" +libredox = "0.0.3" +redox-scheme = { git = "https://gitlab.redox-os.org/redox-os/redox-scheme.git" } diff --git a/src/main.rs b/src/main.rs index 8ec6ede302..9b450c9cac 100644 --- a/src/main.rs +++ b/src/main.rs @@ -2,12 +2,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::{mem, process, slice, thread}; use std::sync::{Arc, Mutex}; -use syscall::data::Packet; -use syscall::scheme::SchemeBlockMut; +use libredox::flag; +use libredox::{Fd, error::Result}; +use redox_scheme::{Socket, SignalBehavior}; use redox_daemon::Daemon; @@ -15,53 +15,45 @@ use self::scheme::AudioScheme; mod scheme; -fn from_syscall_error(error: syscall::Error) -> io::Error { - io::Error::from_raw_os_error(error.errno as i32) -} - extern "C" fn sigusr_handler(_sig: usize) {} -fn thread(scheme: Arc>, pid: usize, mut hw_file: fs::File) -> io::Result<()> { +fn thread(scheme: Arc>, pid: usize, mut hw_file: Fd) -> Result<()> { // Enter null namespace - syscall::setrens(0, 0).map_err(from_syscall_error)?; + libredox::call::setrens(0, 0)?; loop { let buffer = scheme.lock().unwrap().buffer(); let buffer_u8 = unsafe { slice::from_raw_parts( buffer.as_ptr() as *const u8, - mem::size_of_val(&buffer) + mem::size_of_val(&buffer), ) }; // Wake up the scheme thread - syscall::kill(pid, syscall::SIGUSR1).map_err(from_syscall_error)?; + libredox::call::kill(pid, libredox::flag::SIGUSR1 as u32)?; hw_file.write(&buffer_u8)?; } } -fn daemon(daemon: Daemon) -> io::Result<()> { +fn daemon(daemon: Daemon) -> Result<()> { // Handle signals from the hw thread - unsafe { + let new_sigaction = 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); + sigaction.assume_init() + }; + libredox::call::sigaction(flag::SIGUSR1, Some(&new_sigaction), None)?; - match libc::sigaction(libc::SIGUSR1, sigaction.as_ptr(), core::ptr::null_mut()) { - 0 => (), - -1 => return Err(io::Error::last_os_error()), - _ => unreachable!(), - } - } + let pid = libredox::call::getpid()?; - let pid = syscall::getpid().map_err(from_syscall_error)?; + let hw_file = Fd::open("audiohw:", flag::O_WRONLY | flag::O_CLOEXEC, 0)?; - let hw_file = fs::OpenOptions::new().write(true).open("audiohw:")?; - - let mut scheme_file = fs::OpenOptions::new().create(true).read(true).write(true).open(":audio")?; + let socket = Socket::create("audio")?; let scheme = Arc::new(Mutex::new(AudioScheme::new())); @@ -71,40 +63,34 @@ fn daemon(daemon: Daemon) -> io::Result<()> { // Enter the null namespace - done after thread is created so // memory: can be accessed for stack allocation - syscall::setrens(0, 0).map_err(from_syscall_error)?; + libredox::call::setrens(0, 0)?; // The scheme is now ready to accept requests, notify the original process - daemon.ready().map_err(from_syscall_error)?; + daemon.ready()?; - let mut todo = Vec::new(); - loop { - let mut packet = Packet::default(); - let count = match scheme_file.read(&mut packet) { - Ok(ok) => ok, - Err(err) => if err.kind() == io::ErrorKind::Interrupted { - 0 - } else { - return Err(err); - } - }; + let mut pending = Vec::new(); - if count > 0 { - if let Some(a) = scheme.lock().unwrap().handle(&mut packet) { - packet.a = a; - scheme_file.write(&packet)?; - } else { - todo.push(packet); + loop { + if let Some(request) = socket.next_request(SignalBehavior::Restart)? { + match request.handle_scheme_block_mut(&mut *scheme.lock().unwrap()) { + Ok(response) => { + socket.write_responses(&[response], SignalBehavior::Restart)?; + } + Err(request) => pending.push(request), } } let mut i = 0; - while i < todo.len() { - if let Some(a) = scheme.lock().unwrap().handle(&mut todo[i]) { - let mut packet = todo.remove(i); - packet.a = a; - scheme_file.write(&packet)?; - } else { - i += 1; + while i < pending.len() { + let request = pending[i]; + match request.handle_scheme_block_mut(&mut *scheme.lock().unwrap()) { + Ok(response) => { + pending.remove(i); + socket.write_responses(&[response], SignalBehavior::Restart)?; + } + Err(_) => { + i += 1 + } } } } diff --git a/src/scheme.rs b/src/scheme.rs index 2e71aae102..68e3dde4ac 100644 --- a/src/scheme.rs +++ b/src/scheme.rs @@ -2,7 +2,8 @@ use std::collections::{BTreeMap, VecDeque}; use std::str; use syscall::error::{EBADF, EINVAL, ENOENT, EWOULDBLOCK, Error, Result}; use syscall::flag::O_NONBLOCK; -use syscall::scheme::SchemeBlockMut; + +use redox_scheme::SchemeBlockMut; // The strict buffer size of the audiohw: driver const HW_BUFFER_SIZE: usize = 512;