From f2d3d16455a0de76918324e0c8f78323f18b98c5 Mon Sep 17 00:00:00 2001 From: bjorn3 <17426603+bjorn3@users.noreply.github.com> Date: Thu, 13 Mar 2025 16:42:05 +0100 Subject: [PATCH] graphics/bgad: Use redox-scheme --- Cargo.lock | 1 + graphics/bgad/Cargo.toml | 3 ++- graphics/bgad/src/main.rs | 54 ++++++++++++++++++++++--------------- graphics/bgad/src/scheme.rs | 15 ++++++++--- 4 files changed, 47 insertions(+), 26 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index f9dd06081e..a324841450 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -193,6 +193,7 @@ dependencies = [ "orbclient", "pcid", "redox-daemon", + "redox-scheme 0.3.0", "redox_syscall", ] diff --git a/graphics/bgad/Cargo.toml b/graphics/bgad/Cargo.toml index eadf2c22f9..19e7d08bb7 100644 --- a/graphics/bgad/Cargo.toml +++ b/graphics/bgad/Cargo.toml @@ -1,11 +1,12 @@ [package] name = "bgad" version = "0.1.0" -edition = "2018" +edition = "2021" [dependencies] orbclient = "0.3.47" redox-daemon = "0.1" +redox-scheme = { git = "https://gitlab.redox-os.org/redox-os/redox-scheme.git" } redox_syscall = "0.5" common = { path = "../../common" } diff --git a/graphics/bgad/src/main.rs b/graphics/bgad/src/main.rs index 72824703ed..b814bc772b 100644 --- a/graphics/bgad/src/main.rs +++ b/graphics/bgad/src/main.rs @@ -1,14 +1,8 @@ -extern crate orbclient; -extern crate syscall; - -use std::fs::File; -use std::io::{Read, Write}; - use inputd::ProducerHandle; use pcid_interface::PciFunctionHandle; +use redox_scheme::{RequestKind, Response, SignalBehavior, Socket}; use syscall::call::iopl; -use syscall::data::Packet; -use syscall::scheme::SchemeMut; +use syscall::EOPNOTSUPP; use crate::bga::Bga; use crate::scheme::BgaScheme; @@ -28,7 +22,7 @@ fn main() { redox_daemon::Daemon::new(move |daemon| { unsafe { iopl(3).unwrap() }; - let mut socket = File::create(":bga").expect("bgad: failed to create bga scheme"); + let socket = Socket::create("bga").expect("bgad: failed to create bga scheme"); let mut bga = Bga::new(); println!(" - BGA {}x{}", bga.width(), bga.height()); @@ -45,20 +39,38 @@ fn main() { daemon.ready().expect("bgad: failed to notify parent"); loop { - let mut packet = Packet::default(); - if socket - .read(&mut packet) - .expect("bgad: failed to read events from bga scheme") - == 0 - { - break; + let Some(request) = socket + .next_request(SignalBehavior::Restart) + .expect("bgad: failed to read scheme") + else { + // Scheme likely got unmounted + std::process::exit(0); + }; + + match request.kind() { + RequestKind::Call(call_request) => { + let resp = call_request.handle_scheme(&mut scheme); + socket + .write_response(resp, SignalBehavior::Restart) + .expect("bgad: failed to write display scheme"); + } + RequestKind::SendFd(sendfd_request) => { + socket + .write_response( + Response::for_sendfd( + &sendfd_request, + Err(syscall::Error::new(EOPNOTSUPP)), + ), + SignalBehavior::Restart, + ) + .expect("bgad: failed to write response"); + } + RequestKind::Cancellation(_cancellation_request) => {} + RequestKind::MsyncMsg | RequestKind::MunmapMsg | RequestKind::MmapMsg => { + unreachable!() + } } - scheme.handle(&mut packet); - socket - .write(&packet) - .expect("bgad: failed to write responses to bga scheme"); } - std::process::exit(0); }) .expect("bgad: failed to daemonize"); } diff --git a/graphics/bgad/src/scheme.rs b/graphics/bgad/src/scheme.rs index 3d2c89996e..02b197d060 100644 --- a/graphics/bgad/src/scheme.rs +++ b/graphics/bgad/src/scheme.rs @@ -1,7 +1,8 @@ use inputd::ProducerHandle; +use redox_scheme::Scheme; use std::str; use syscall::data::Stat; -use syscall::{Error, Result, SchemeMut, EACCES, EINVAL, MODE_CHR}; +use syscall::{Error, Result, EACCES, EINVAL, MODE_CHR}; use crate::bga::Bga; @@ -24,7 +25,7 @@ impl BgaScheme { } } -impl SchemeMut for BgaScheme { +impl Scheme for BgaScheme { fn open(&mut self, _path: &str, _flags: usize, uid: u32, _gid: u32) -> Result { if uid == 0 { Ok(0) @@ -33,7 +34,13 @@ impl SchemeMut for BgaScheme { } } - fn read(&mut self, _file: usize, buf: &mut [u8]) -> Result { + fn read( + &mut self, + _id: usize, + buf: &mut [u8], + _offset: u64, + _fcntl_flags: u32, + ) -> Result { let mut i = 0; let data = format!("{},{}\n", self.bga.width(), self.bga.height()).into_bytes(); while i < buf.len() && i < data.len() { @@ -43,7 +50,7 @@ impl SchemeMut for BgaScheme { Ok(i) } - fn write(&mut self, _file: usize, buf: &[u8]) -> Result { + fn write(&mut self, _id: usize, buf: &[u8], _offset: u64, _fcntl_flags: u32) -> Result { let string = str::from_utf8(buf).or(Err(Error::new(EINVAL)))?; let string = string.trim();