From d20dd30ccf87380dd085c576ee70cfa42651dbcd Mon Sep 17 00:00:00 2001 From: bjorn3 <17426603+bjorn3@users.noreply.github.com> Date: Sun, 6 Apr 2025 19:10:49 +0200 Subject: [PATCH] Move logd to redox-scheme 0.5 --- Cargo.lock | 2 +- logd/Cargo.toml | 2 +- logd/src/main.rs | 17 +++++++------ logd/src/scheme.rs | 60 +++++++++++++++++++++++++++------------------- 4 files changed, 48 insertions(+), 33 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index f007c41b2c..e16f7f2693 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -486,7 +486,7 @@ version = "0.1.0" dependencies = [ "libredox 0.1.3", "redox-daemon", - "redox-scheme 0.2.4", + "redox-scheme 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", "redox_syscall 0.5.11", ] diff --git a/logd/Cargo.toml b/logd/Cargo.toml index ab9f15e31a..7b60a42f96 100644 --- a/logd/Cargo.toml +++ b/logd/Cargo.toml @@ -8,4 +8,4 @@ edition = "2021" redox_syscall = "0.5" redox-daemon = "0.1.2" libredox = "0.1.3" -redox-scheme = "0.2.1" +redox-scheme = "0.5" diff --git a/logd/src/main.rs b/logd/src/main.rs index 11b04c8d41..42604cda11 100644 --- a/logd/src/main.rs +++ b/logd/src/main.rs @@ -1,4 +1,4 @@ -use redox_scheme::{RequestKind, SignalBehavior, Socket, V2}; +use redox_scheme::{RequestKind, SignalBehavior, Socket}; use std::env; use std::fs::OpenOptions; use std::process; @@ -17,7 +17,7 @@ fn daemon(daemon: redox_daemon::Daemon) -> ! { } } - let socket = Socket::::create("log").expect("logd: failed to create log scheme"); + let socket = Socket::create("log").expect("logd: failed to create log scheme"); libredox::call::setrens(0, 0).expect("logd: failed to enter null namespace"); @@ -31,13 +31,16 @@ fn daemon(daemon: redox_daemon::Daemon) -> ! { .next_request(SignalBehavior::Restart) .expect("logd: failed to read events from log scheme") { - scheme.current_pid = request.context_id(); - - let RequestKind::Call(request) = request.kind() else { - continue; + let request = match request.kind() { + RequestKind::Call(call) => call, + RequestKind::OnClose { id } => { + scheme.on_close(id); + continue; + } + _ => continue, }; - let response = request.handle_scheme_mut(&mut scheme); + let response = request.handle_sync(&mut scheme); socket .write_responses(&[response], SignalBehavior::Restart) .expect("logd: failed to write responses to log scheme"); diff --git a/logd/src/scheme.rs b/logd/src/scheme.rs index 921fe08c5f..802f02ec94 100644 --- a/logd/src/scheme.rs +++ b/logd/src/scheme.rs @@ -4,8 +4,10 @@ use std::io::Write; use std::mem; use std::sync::mpsc::{self, Sender}; -use redox_scheme::SchemeMut; +use redox_scheme::scheme::SchemeSync; +use redox_scheme::{CallerCtx, OpenResult}; use syscall::error::*; +use syscall::schemev2::NewFdFlags; pub struct LogHandle { context: Box, @@ -16,7 +18,6 @@ pub struct LogScheme { next_id: usize, output_tx: Sender>, handles: BTreeMap, - pub current_pid: usize, } impl LogScheme { @@ -36,13 +37,12 @@ impl LogScheme { next_id: 0, output_tx, handles: BTreeMap::new(), - current_pid: 0, } } } -impl SchemeMut for LogScheme { - fn open(&mut self, path: &str, _flags: usize, _uid: u32, _gid: u32) -> Result { +impl SchemeSync for LogScheme { + fn open(&mut self, path: &str, _flags: usize, _ctx: &CallerCtx) -> Result { let id = self.next_id; self.next_id += 1; @@ -54,10 +54,20 @@ impl SchemeMut for LogScheme { }, ); - Ok(id) + Ok(OpenResult::ThisScheme { + number: id, + flags: NewFdFlags::empty(), + }) } - fn read(&mut self, id: usize, _buf: &mut [u8], _offset: u64, _flags: u32) -> Result { + fn read( + &mut self, + id: usize, + _buf: &mut [u8], + _offset: u64, + _flags: u32, + _ctx: &CallerCtx, + ) -> Result { let _handle = self.handles.get(&id).ok_or(Error::new(EBADF))?; // TODO @@ -65,13 +75,17 @@ impl SchemeMut for LogScheme { Ok(0) } - fn write(&mut self, id: usize, buf: &[u8], _offset: u64, _flags: u32) -> Result { + fn write( + &mut self, + id: usize, + buf: &[u8], + _offset: u64, + _flags: u32, + ctx: &CallerCtx, + ) -> Result { let handle = self.handles.get_mut(&id).ok_or(Error::new(EBADF))?; - let handle_buf = handle - .bufs - .entry(self.current_pid) - .or_insert_with(|| Vec::new()); + let handle_buf = handle.bufs.entry(ctx.pid).or_insert_with(|| Vec::new()); let mut i = 0; while i < buf.len() { @@ -94,13 +108,13 @@ impl SchemeMut for LogScheme { Ok(i) } - fn fcntl(&mut self, id: usize, _cmd: usize, _arg: usize) -> Result { + fn fcntl(&mut self, id: usize, _cmd: usize, _arg: usize, _ctx: &CallerCtx) -> Result { let _handle = self.handles.get(&id).ok_or(Error::new(EBADF))?; Ok(0) } - fn fpath(&mut self, id: usize, buf: &mut [u8]) -> Result { + fn fpath(&mut self, id: usize, buf: &mut [u8], _ctx: &CallerCtx) -> Result { let handle = self.handles.get(&id).ok_or(Error::new(EBADF))?; let scheme_path = b"log:"; @@ -122,19 +136,17 @@ impl SchemeMut for LogScheme { Ok(i) } - fn fsync(&mut self, id: usize) -> Result { + fn fsync(&mut self, id: usize, _ctx: &CallerCtx) -> Result<()> { let _handle = self.handles.get(&id).ok_or(Error::new(EBADF))?; //TODO: flush remaining data? - Ok(0) - } - - fn close(&mut self, id: usize) -> Result { - self.handles.remove(&id).ok_or(Error::new(EBADF))?; - - //TODO: flush remaining data? - - Ok(0) + Ok(()) + } +} + +impl LogScheme { + pub fn on_close(&mut self, id: usize) { + self.handles.remove(&id); } }