From f76ecc35c442ef722280c3574168d89f282ee19b Mon Sep 17 00:00:00 2001 From: 4lDO2 <4lDO2@protonmail.com> Date: Mon, 25 Dec 2023 19:18:25 +0100 Subject: [PATCH] Migrate to libredox and redox-scheme. --- Cargo.lock | 88 +++++++++++++++++++++++++---------- Cargo.toml | 9 ++-- src/main.rs | 126 +++++++++++++++++++------------------------------- src/scheme.rs | 2 +- 4 files changed, 118 insertions(+), 107 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index bfb20da2ad..d0216310ec 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -9,53 +9,93 @@ 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 = "libc" +version = "0.2.151" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "302d7ab3130588088d277783b1e2d2e10c9e9e4a16dd9050e6ec93fb3e7048f4" + +[[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 = "libredox" +version = "0.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "962b650e6b934f95cec493e1464e0f5cba98dd9ba9ef2b1c42cdfdb7864cab5a" +dependencies = [ + "bitflags 2.4.1", + "libc", + "redox_syscall", +] [[package]] name = "ptyd" version = "0.1.0" dependencies = [ + "libredox 0.0.3", "redox-daemon", - "redox_syscall 0.3.5", + "redox-scheme", + "redox_event", + "redox_syscall", "redox_termios", ] [[package]] name = "redox-daemon" -version = "0.1.1" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "811fd0d382a70c9e9192166ee794567b65ef34cc7309c86a49b071779ca9b5f3" +checksum = "353178b5771a301b9d2b318914ab5dfeb21dd6e65930faedde19248cfceca5a7" dependencies = [ "libc", - "redox_syscall 0.3.5", + "libredox 0.0.1", +] + +[[package]] +name = "redox-scheme" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "425289b64797f9b7d98971e61d4838c67041c2ca13511e5a62539936873ae1a8" +dependencies = [ + "libredox 0.0.3", + "redox_syscall", +] + +[[package]] +name = "redox_event" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b78fedc17aea72caee38ac1208e0f709fa1641af1bbe0205e7d434413a60621d" +dependencies = [ + "bitflags 2.4.1", + "libredox 0.0.1", + "redox_syscall", ] [[package]] name = "redox_syscall" -version = "0.2.16" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a" +checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa" dependencies = [ - "bitflags", -] - -[[package]] -name = "redox_syscall" -version = "0.3.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29" -dependencies = [ - "bitflags", + "bitflags 1.3.2", ] [[package]] name = "redox_termios" -version = "0.1.2" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8440d8acb4fd3d277125b4bd01a6f38aee8d814b3b5fc09b3f2b825d37d3fe8f" -dependencies = [ - "redox_syscall 0.2.16", -] +checksum = "20145670ba436b55d91fc92d25e71160fbfbdd57831631c8d7d36377a476f1cb" diff --git a/Cargo.toml b/Cargo.toml index fbe3134f16..2f0a2d3004 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -4,6 +4,9 @@ version = "0.1.0" edition = "2021" [dependencies] -redox-daemon = "0.1.1" -redox_syscall = "0.3" -redox_termios = "0.1.2" +libredox = "0.0.3" +redox-daemon = "0.1.2" +redox-scheme = "0.1.0" +redox_event = "0.2.0" +redox_syscall = "0.4.1" +redox_termios = "0.1.3" diff --git a/src/main.rs b/src/main.rs index 70310c7daf..88d3b23865 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,11 +1,10 @@ -use std::fs::{File, OpenOptions}; -use std::io::{self, Read, Write}; -use std::os::unix::fs::OpenOptionsExt; -use std::os::unix::io::AsRawFd; +use event::{user_data, EventQueue, EventFlags}; +use libredox::errno::{EAGAIN, EWOULDBLOCK}; +use libredox::error::Error; +use libredox::{Fd, flag}; -use syscall::data::{Event, Packet, TimeSpec}; -use syscall::flag::EventFlags; -use syscall::scheme::SchemeBlockMut; +use redox_scheme::SignalBehavior; +use syscall::data::TimeSpec; mod controlterm; mod pgrp; @@ -20,46 +19,30 @@ use scheme::PtyScheme; fn main() { redox_daemon::Daemon::new(move |daemon| { - let mut event_file = OpenOptions::new() - .read(true) - .write(true) - .open("event:") + user_data! { + enum EventSource { + Socket, + Time, + } + } + + let event_queue = EventQueue::::new() .expect("pty: failed to open event:"); - let time_path = format!("time:{}", syscall::CLOCK_MONOTONIC); - let mut time_file = OpenOptions::new() - .read(true) - .write(true) - .custom_flags(syscall::O_NONBLOCK as i32) - .open(time_path) + let time_path = format!("time:{}", flag::CLOCK_MONOTONIC); + let mut time_file = Fd::open(&time_path, flag::O_NONBLOCK, 0) .expect("pty: failed to open time:"); - let mut socket = OpenOptions::new() - .create(true) - .read(true) - .write(true) - .custom_flags(syscall::O_NONBLOCK as i32) - .open(":pty") + let socket = redox_scheme::Socket::nonblock("pty") .expect("pty: failed to create pty scheme"); - syscall::setrens(0, 0).expect("ptyd: failed to enter null namespace"); + libredox::call::setrens(0, 0).expect("ptyd: failed to enter null namespace"); daemon.ready().expect("pty: failed to notify parent"); - event_file - .write(&Event { - id: socket.as_raw_fd() as usize, - flags: syscall::EVENT_READ, - data: 1, - }) + event_queue.subscribe(socket.inner().raw(), EventSource::Socket, EventFlags::READ) .expect("pty: failed to watch events on pty:"); - - event_file - .write(&Event { - id: time_file.as_raw_fd() as usize, - flags: syscall::EVENT_READ, - data: 2, - }) + event_queue.subscribe(time_file.raw(), EventSource::Time, EventFlags::READ) .expect("pty: failed to watch events on time:"); //TODO: do not set timeout if not necessary @@ -68,28 +51,26 @@ fn main() { let mut scheme = PtyScheme::new(); let mut todo = Vec::new(); let mut timeout_count = 0u64; - loop { - let mut event = Event::default(); - event_file - .read(&mut event) - .expect("pty: failed to read event:"); + for event_res in event_queue { + let event = event_res.expect("pty: failed to read from event queue"); - match event.data { - 1 => { - let mut packet = Packet::default(); - socket - .read(&mut packet) - .expect("pty: failed to read events from pty scheme"); - if let Some(a) = scheme.handle(&mut packet) { - packet.a = a; - socket - .write(&packet) + match event.user_data { + EventSource::Socket => { + let request = match socket.next_request(SignalBehavior::Restart) { + Ok(Some(req)) => req, + Ok(None) => break, + Err(Error { errno: EAGAIN | EWOULDBLOCK }) => continue, + Err(other) => panic!("pty: failed to read from socket: {other}"), + }; + if let Ok(response) = request.handle_scheme_block_mut(&mut scheme) { + let _ = socket + .write_response(response, SignalBehavior::Restart) .expect("pty: failed to write responses to pty scheme"); } else { - todo.push(packet); + todo.push(request); } } - 2 => { + EventSource::Time => { timeout(&mut time_file).expect("pty: failed to set timeout"); timeout_count = timeout_count.wrapping_add(1); @@ -98,16 +79,14 @@ fn main() { handle.timeout(timeout_count); } } - _ => (), } let mut i = 0; while i < todo.len() { - if let Some(a) = scheme.handle(&mut todo[i]) { - let mut packet = todo.remove(i); - packet.a = a; + if let Ok(response) = todo[i].handle_scheme_block_mut(&mut scheme) { + todo.remove(i); socket - .write(&packet) + .write_response(response, SignalBehavior::Restart) .expect("pty: failed to write responses to pty scheme"); } else { i += 1; @@ -116,18 +95,21 @@ fn main() { for (id, handle) in scheme.handles.iter_mut() { let events = handle.events(); - if events != EventFlags::empty() { - post_fevent(&mut socket, *id, events, 1); + if events != syscall::EventFlags::empty() { + socket.post_fevent(*id, events.bits()) + .expect("pty: failed to send scheme event"); } } } + + std::process::exit(0); }) .expect("pty: failed to daemonize"); } -fn timeout(time_file: &mut File) -> io::Result<()> { +fn timeout(time_file: &mut Fd) -> libredox::error::Result<()> { let mut time = TimeSpec::default(); - time_file.read_exact(&mut time)?; + time_file.read(&mut time)?; time.tv_nsec += 100_000_000; while time.tv_nsec >= 1_000_000_000 { @@ -135,20 +117,6 @@ fn timeout(time_file: &mut File) -> io::Result<()> { time.tv_nsec -= 1_000_000_000; } - time_file.write_all(&time) -} - -fn post_fevent(socket: &mut File, id: usize, flags: EventFlags, count: usize) { - socket - .write(&Packet { - id: 0, - pid: 0, - uid: 0, - gid: 0, - a: syscall::number::SYS_FEVENT, - b: id, - c: flags.bits(), - d: count, - }) - .expect("pty: failed to write event"); + time_file.write(&time)?; + Ok(()) } diff --git a/src/scheme.rs b/src/scheme.rs index 7bedd7882b..1ad609d599 100644 --- a/src/scheme.rs +++ b/src/scheme.rs @@ -3,10 +3,10 @@ use std::collections::BTreeMap; use std::rc::Rc; use std::str; +use redox_scheme::SchemeBlockMut; use syscall::data::Stat; use syscall::error::{Error, Result, EBADF, EINVAL, ENOENT}; use syscall::flag::{EventFlags, MODE_CHR}; -use syscall::scheme::SchemeBlockMut; use crate::controlterm::PtyControlTerm; use crate::pgrp::PtyPgrp;