From 31eaa8fe78bc8344db3a35ce0aa604ec44eb7ac1 Mon Sep 17 00:00:00 2001 From: 4lDO2 <4lDO2@protonmail.com> Date: Thu, 16 Nov 2023 14:11:13 +0100 Subject: [PATCH] Merge with nulld, and migrate to redox-scheme. --- Cargo.lock | 59 ++++++++++++++++++++++++++++++++++++++++++--------- Cargo.toml | 6 ++++-- src/main.rs | 40 +++++++++++++++++++++------------- src/scheme.rs | 28 +++++++++++------------- 4 files changed, 90 insertions(+), 43 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index da24f8ebd6..9333b2498d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -9,34 +9,73 @@ 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", ] [[package]] name = "zerod" version = "0.1.0" dependencies = [ + "libredox 0.0.3", "redox-daemon", + "redox-scheme", "redox_syscall", ] diff --git a/Cargo.toml b/Cargo.toml index 8351ef6c68..98f5d99254 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -5,5 +5,7 @@ authors = ["Alex Lyon "] edition = "2021" [dependencies] -redox_syscall = "0.3" -redox-daemon = "0.1.1" +redox_syscall = "0.4.1" +redox-scheme = { git = "https://gitlab.redox-os.org/redox-os/redox-scheme.git" } +redox-daemon = "0.1.2" +libredox = "0.0.3" diff --git a/src/main.rs b/src/main.rs index 20fbb3092d..0e043e6e52 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,31 +1,41 @@ -use std::fs::File; -use std::io::{Read, Write}; - -use syscall::data::Packet; -use syscall::scheme::Scheme; +use redox_scheme::{Socket, SignalBehavior}; use scheme::ZeroScheme; mod scheme; -fn main() { - redox_daemon::Daemon::new(move |daemon| { - let mut socket = File::create(":zero").expect("zerod: failed to create zero scheme"); - let scheme = ZeroScheme; +enum Ty { + Null, + Zero, +} - syscall::setrens(0, 0).expect("zerod: failed to enter null namespace"); +fn main() { + let ty = match &*std::env::args().next().unwrap() { + "nulld" => Ty::Null, + "zerod" => Ty::Zero, + _ => panic!("needs to be called as either nulld or zerod"), + }; + + redox_daemon::Daemon::new(move |daemon| { + let name = match ty { + Ty::Null => "null", + Ty::Zero => "zero", + }; + let socket = Socket::create(name).expect("zerod: failed to create zero scheme"); + let zero_scheme = ZeroScheme(ty); + + libredox::call::setrens(0, 0).expect("zerod: failed to enter null namespace"); daemon.ready().expect("zerod: failed to notify parent"); loop { - let mut packet = Packet::default(); - if socket.read(&mut packet).expect("zerod: failed to read events from zero scheme") == 0 { + let Some(request) = socket.next_request(SignalBehavior::Restart).expect("zerod: failed to read events from zero scheme") else { std::process::exit(0); - } + }; - scheme.handle(&mut packet); + let response = request.handle_scheme(&zero_scheme); - socket.write(&packet).expect("zerod: failed to write responses to zero scheme"); + socket.write_responses(&[response], SignalBehavior::Restart).expect("zerod: failed to write responses to zero scheme"); } }).expect("zerod: failed to daemonize"); } diff --git a/src/scheme.rs b/src/scheme.rs index 7be06a02d0..797d94cefa 100644 --- a/src/scheme.rs +++ b/src/scheme.rs @@ -1,9 +1,9 @@ use syscall::{error::*, MODE_CHR}; -use syscall::scheme::Scheme; +use redox_scheme::Scheme; -use std::cmp; +use crate::Ty; -pub struct ZeroScheme; +pub struct ZeroScheme(pub Ty); impl Scheme for ZeroScheme { fn open(&self, _path: &str, _flags: usize, _uid: u32, _gid: u32) -> Result { @@ -11,27 +11,23 @@ impl Scheme for ZeroScheme { } fn dup(&self, _file: usize, buf: &[u8]) -> Result { - if ! buf.is_empty() { + if !buf.is_empty() { return Err(Error::new(EINVAL)); } Ok(0) } - /// Read the file `number` into the `buffer` - /// - /// Returns the number of bytes read fn read(&self, _file: usize, buf: &mut [u8]) -> Result { - let size = buf.len(); - - buf[..size].iter_mut().for_each(|val| *val = 0); - - Ok(size) + match self.0 { + Ty::Null => Ok(0), + Ty::Zero => { + buf.fill(0); + Ok(buf.len()) + } + } } - /// Write the `buffer` to the `file` - /// - /// Returns the number of bytes written fn write(&self, _file: usize, buffer: &[u8]) -> Result { Ok(buffer.len()) } @@ -42,7 +38,7 @@ impl Scheme for ZeroScheme { fn fpath(&self, _id: usize, buf: &mut [u8]) -> Result { let scheme_path = b"zero:"; - let size = cmp::min(buf.len(), scheme_path.len()); + let size = std::cmp::min(buf.len(), scheme_path.len()); buf[..size].copy_from_slice(&scheme_path[..size]);