From daf726c30dae29592a7a397153fac967dfdb3e28 Mon Sep 17 00:00:00 2001 From: bjorn3 <17426603+bjorn3@users.noreply.github.com> Date: Sun, 19 Apr 2026 14:49:11 +0200 Subject: [PATCH] scheme-utils: Have FpathWriter handle writing the scheme name --- drivers/audio/ac97d/src/device.rs | 8 ++------ drivers/audio/ihdad/src/hda/device.rs | 8 ++------ drivers/audio/sb16d/src/device.rs | 8 ++------ drivers/graphics/driver-graphics/src/lib.rs | 4 ++-- drivers/graphics/fbbootlogd/src/scheme.rs | 5 +---- drivers/graphics/fbcond/src/scheme.rs | 4 ++-- drivers/inputd/src/main.rs | 6 +++--- drivers/net/driver-network/src/lib.rs | 3 +-- drivers/storage/driver-block/src/lib.rs | 3 +-- drivers/usb/xhcid/src/xhci/scheme.rs | 6 +++--- ipcd/src/chan.rs | 4 +--- ipcd/src/shm.rs | 3 +-- ipcd/src/uds/dgram.rs | 3 +-- ipcd/src/uds/stream.rs | 3 +-- logd/src/scheme.rs | 3 +-- netstack/src/scheme/icmp.rs | 6 +++--- netstack/src/scheme/ip.rs | 4 ++-- netstack/src/scheme/tcp.rs | 3 +-- netstack/src/scheme/udp.rs | 3 +-- ptyd/src/pty.rs | 4 ++-- ramfs/src/scheme.rs | 12 ++++++------ randd/src/main.rs | 5 +---- scheme-utils/src/lib.rs | 18 +++++++++++++++++- zerod/src/scheme.rs | 5 +---- 24 files changed, 58 insertions(+), 73 deletions(-) diff --git a/drivers/audio/ac97d/src/device.rs b/drivers/audio/ac97d/src/device.rs index f0699dae87..a9217dbab6 100644 --- a/drivers/audio/ac97d/src/device.rs +++ b/drivers/audio/ac97d/src/device.rs @@ -323,12 +323,8 @@ impl SchemeSync for Ac97 { } } - fn fpath(&mut self, id: usize, buf: &mut [u8], _ctx: &CallerCtx) -> Result { - FpathWriter::with(buf, |w| { - let _handle = self.handles.lock().get_mut(id)?; - w.push_str("/scheme/audiohw"); - Ok(()) - }) + fn fpath(&mut self, _id: usize, buf: &mut [u8], _ctx: &CallerCtx) -> Result { + FpathWriter::with(buf, "audiohw", |_| Ok(())) } fn on_close(&mut self, id: usize) { diff --git a/drivers/audio/ihdad/src/hda/device.rs b/drivers/audio/ihdad/src/hda/device.rs index d025d8b4f1..78e8f0a281 100755 --- a/drivers/audio/ihdad/src/hda/device.rs +++ b/drivers/audio/ihdad/src/hda/device.rs @@ -1076,12 +1076,8 @@ impl SchemeSync for IntelHDA { } } - fn fpath(&mut self, id: usize, buf: &mut [u8], _ctx: &CallerCtx) -> Result { - FpathWriter::with(buf, |w| { - let _handle = self.handles.lock().get_mut(id)?; - w.push_str("/scheme/audiohw"); - Ok(()) - }) + fn fpath(&mut self, _id: usize, buf: &mut [u8], _ctx: &CallerCtx) -> Result { + FpathWriter::with(buf, "audiohw", |_| Ok(())) } fn on_close(&mut self, id: usize) { diff --git a/drivers/audio/sb16d/src/device.rs b/drivers/audio/sb16d/src/device.rs index 2d33650cf6..5667ce764a 100644 --- a/drivers/audio/sb16d/src/device.rs +++ b/drivers/audio/sb16d/src/device.rs @@ -222,12 +222,8 @@ impl SchemeSync for Sb16 { Err(Error::new(EBADF)) } - fn fpath(&mut self, id: usize, buf: &mut [u8], _ctx: &CallerCtx) -> Result { - FpathWriter::with(buf, |w| { - let _handle = self.handles.lock().get_mut(id)?; - w.push_str("/scheme/audiohw"); - Ok(()) - }) + fn fpath(&mut self, _id: usize, buf: &mut [u8], _ctx: &CallerCtx) -> Result { + FpathWriter::with(buf, "audiohw", |_| Ok(())) } fn on_close(&mut self, id: usize) { diff --git a/drivers/graphics/driver-graphics/src/lib.rs b/drivers/graphics/driver-graphics/src/lib.rs index ac917ab185..eab0be9c3e 100644 --- a/drivers/graphics/driver-graphics/src/lib.rs +++ b/drivers/graphics/driver-graphics/src/lib.rs @@ -424,13 +424,13 @@ impl SchemeSync for GraphicsSchemeInner { } fn fpath(&mut self, id: usize, buf: &mut [u8], _ctx: &CallerCtx) -> syscall::Result { - FpathWriter::with(buf, |w| { + FpathWriter::with(buf, &self.scheme_name, |w| { match self.handles.get(id)? { Handle::V2 { vt, next_id: _, buffers: _, - } => write!(w, "/scheme/{}/v2/{vt}", self.scheme_name).unwrap(), + } => write!(w, "v2/{vt}").unwrap(), Handle::SchemeRoot => return Err(Error::new(EOPNOTSUPP)), }; Ok(()) diff --git a/drivers/graphics/fbbootlogd/src/scheme.rs b/drivers/graphics/fbbootlogd/src/scheme.rs index 2f8f01e365..812c4a5bc3 100644 --- a/drivers/graphics/fbbootlogd/src/scheme.rs +++ b/drivers/graphics/fbbootlogd/src/scheme.rs @@ -197,10 +197,7 @@ impl SchemeSync for FbbootlogScheme { } fn fpath(&mut self, _id: usize, buf: &mut [u8], _ctx: &CallerCtx) -> Result { - FpathWriter::with(buf, |w| { - w.push_str("fbbootlog:"); - Ok(()) - }) + FpathWriter::with_legacy(buf, "fbbootlog", |_| Ok(())) } fn fsync(&mut self, _id: usize, _ctx: &CallerCtx) -> Result<()> { diff --git a/drivers/graphics/fbcond/src/scheme.rs b/drivers/graphics/fbcond/src/scheme.rs index 6fd35a77d2..1bee134e29 100644 --- a/drivers/graphics/fbcond/src/scheme.rs +++ b/drivers/graphics/fbcond/src/scheme.rs @@ -125,9 +125,9 @@ impl SchemeSync for FbconScheme { } fn fpath(&mut self, id: usize, buf: &mut [u8], _ctx: &CallerCtx) -> Result { - FpathWriter::with(buf, |w| { + FpathWriter::with_legacy(buf, "fbcon", |w| { let handle = self.get_vt_handle_mut(id)?; - write!(w, "fbcon:{}", handle.vt_i.0).unwrap(); + write!(w, "{}", handle.vt_i.0).unwrap(); Ok(()) }) } diff --git a/drivers/inputd/src/main.rs b/drivers/inputd/src/main.rs index edcf8760a3..07aa943eee 100644 --- a/drivers/inputd/src/main.rs +++ b/drivers/inputd/src/main.rs @@ -269,12 +269,12 @@ impl SchemeSync for InputScheme { } fn fpath(&mut self, id: usize, buf: &mut [u8], _ctx: &CallerCtx) -> syscall::Result { - FpathWriter::with(buf, |w| { + let display = self.display.as_ref().ok_or(SysError::new(EINVAL))?; + FpathWriter::with(buf, display, |w| { let handle = self.handles.get(id)?; if let Handle::Consumer { vt, .. } = handle { - let display = self.display.as_ref().ok_or(SysError::new(EINVAL))?; - write!(w, "/scheme/{}/{vt}", display).unwrap(); + write!(w, "{vt}").unwrap(); Ok(()) } else { Err(SysError::new(EINVAL)) diff --git a/drivers/net/driver-network/src/lib.rs b/drivers/net/driver-network/src/lib.rs index 160580e7ee..39d26d851b 100644 --- a/drivers/net/driver-network/src/lib.rs +++ b/drivers/net/driver-network/src/lib.rs @@ -315,8 +315,7 @@ impl SchemeSync for NetworkSchemeInner { } fn fpath(&mut self, id: usize, buf: &mut [u8], _ctx: &CallerCtx) -> Result { - FpathWriter::with(buf, |w| { - write!(w, "/scheme/{}/", self.scheme_name).unwrap(); + FpathWriter::with(buf, &self.scheme_name, |w| { let path = match self.handles.get(id)? { Handle::Data { .. } => "", Handle::Mac { .. } => "mac", diff --git a/drivers/storage/driver-block/src/lib.rs b/drivers/storage/driver-block/src/lib.rs index 40935189c6..315aa659d1 100644 --- a/drivers/storage/driver-block/src/lib.rs +++ b/drivers/storage/driver-block/src/lib.rs @@ -559,8 +559,7 @@ impl SchemeAsync for DiskSchemeInner { } async fn fpath(&mut self, id: usize, buf: &mut [u8], _ctx: &CallerCtx) -> Result { - FpathWriter::with(buf, |w| { - write!(w, "{}:", self.scheme_name).unwrap(); + FpathWriter::with_legacy(buf, &self.scheme_name, |w| { match *self.handles.get(id)? { Handle::List(_) => (), Handle::Disk(number) => { diff --git a/drivers/usb/xhcid/src/xhci/scheme.rs b/drivers/usb/xhcid/src/xhci/scheme.rs index ac8a8285e3..ca27b3fec7 100644 --- a/drivers/usb/xhcid/src/xhci/scheme.rs +++ b/drivers/usb/xhcid/src/xhci/scheme.rs @@ -198,7 +198,7 @@ impl Handle { /// /// # Returns /// - A [String] containing the scheme path that the handle is associated with. - pub(crate) fn to_scheme(&self) -> String { + pub(crate) fn to_path(&self) -> String { match self { Handle::TopLevel(_) => String::from(""), Handle::Port(port_num, _) => { @@ -2214,9 +2214,9 @@ impl SchemeSync for &Xhci { } fn fpath(&mut self, fd: usize, buf: &mut [u8], _ctx: &CallerCtx) -> Result { - FpathWriter::with(buf, |w| { + FpathWriter::with(buf, "xhci", |w| { let handle = self.handles.get(&fd).ok_or(Error::new(EBADF))?; - write!(w, "{}", handle.to_scheme()).unwrap(); + write!(w, "{}", handle.to_path()).unwrap(); Ok(()) }) } diff --git a/ipcd/src/chan.rs b/ipcd/src/chan.rs index 1258b9a10f..ec19751283 100644 --- a/ipcd/src/chan.rs +++ b/ipcd/src/chan.rs @@ -331,9 +331,7 @@ impl<'sock> SchemeSync for ChanScheme<'sock> { } } fn fpath(&mut self, id: usize, buf: &mut [u8], _ctx: &CallerCtx) -> Result { - FpathWriter::with(buf, |w| { - w.push_str("chan:"); - + FpathWriter::with_legacy(buf, "chan", |w| { let handle = self.handles.get(&id).ok_or(Error::new(EBADF))?; if let Extra::SchemeRoot = handle.extra { return Ok(()); diff --git a/ipcd/src/shm.rs b/ipcd/src/shm.rs index bf5c47eef3..2ea6964e05 100644 --- a/ipcd/src/shm.rs +++ b/ipcd/src/shm.rs @@ -90,8 +90,7 @@ impl SchemeSync for ShmScheme { }) } fn fpath(&mut self, id: usize, buf: &mut [u8], _ctx: &CallerCtx) -> Result { - FpathWriter::with(buf, |w| { - w.push_str("/scheme/shm/"); + FpathWriter::with(buf, "shm", |w| { w.push_str(self.handles.get(id).and_then(Handle::as_shm)?); Ok(()) }) diff --git a/ipcd/src/uds/dgram.rs b/ipcd/src/uds/dgram.rs index 982d999ffe..85c8d53b61 100644 --- a/ipcd/src/uds/dgram.rs +++ b/ipcd/src/uds/dgram.rs @@ -567,8 +567,7 @@ impl<'sock> UdsDgramScheme<'sock> { } fn fpath_inner(path: &String, buf: &mut [u8]) -> Result { - FpathWriter::with(buf, |w| { - w.push_str("/scheme/uds_dgram/"); + FpathWriter::with(buf, "uds_dgram", |w| { w.push_str(path); Ok(()) }) diff --git a/ipcd/src/uds/stream.rs b/ipcd/src/uds/stream.rs index 33b0f854b8..81c846fda0 100644 --- a/ipcd/src/uds/stream.rs +++ b/ipcd/src/uds/stream.rs @@ -1229,8 +1229,7 @@ impl<'sock> UdsStreamScheme<'sock> { } fn fpath_inner(path: &String, buf: &mut [u8]) -> Result { - FpathWriter::with(buf, |w| { - w.push_str("/scheme/uds_stream/"); + FpathWriter::with(buf, "uds_stream", |w| { w.push_str(path); Ok(()) }) diff --git a/logd/src/scheme.rs b/logd/src/scheme.rs index 1fbfd4d42b..070de3d678 100644 --- a/logd/src/scheme.rs +++ b/logd/src/scheme.rs @@ -229,8 +229,7 @@ impl<'sock> SchemeSync for LogScheme<'sock> { } fn fpath(&mut self, id: usize, buf: &mut [u8], _ctx: &CallerCtx) -> Result { - FpathWriter::with(buf, |w| { - w.push_str("/scheme/log/"); + FpathWriter::with(buf, "log", |w| { w.push_str(match self.handles.get(id)? { LogHandle::Log { context, .. } => context, LogHandle::AddSink => "add_sink", diff --git a/netstack/src/scheme/icmp.rs b/netstack/src/scheme/icmp.rs index fa71358929..e326c67eb5 100644 --- a/netstack/src/scheme/icmp.rs +++ b/netstack/src/scheme/icmp.rs @@ -250,14 +250,14 @@ impl<'a> SchemeSocket for IcmpSocket<'a> { } fn fpath(&self, file: &SchemeFile, buf: &mut [u8]) -> SyscallResult { - FpathWriter::with(buf, |w| { + FpathWriter::with(buf, "icmp", |w| { if let SchemeFile::Socket(ref socket_file) = *file { match socket_file.data.socket_type { IcmpSocketType::Echo => { - write!(w, "/scheme/icmp/echo/{}", socket_file.data.ip).unwrap(); + write!(w, "echo/{}", socket_file.data.ip).unwrap(); } IcmpSocketType::Udp => { - write!(w, "/scheme/icmp/udp/{}", socket_file.data.ip).unwrap(); + write!(w, "udp/{}", socket_file.data.ip).unwrap(); } } Ok(()) diff --git a/netstack/src/scheme/ip.rs b/netstack/src/scheme/ip.rs index ee9346c2a2..18d0dc6d9a 100644 --- a/netstack/src/scheme/ip.rs +++ b/netstack/src/scheme/ip.rs @@ -138,8 +138,8 @@ impl<'a> SchemeSocket for RawSocket<'a> { } fn fpath(&self, _file: &SchemeFile, buf: &mut [u8]) -> SyscallResult { - FpathWriter::with(buf, |w| { - write!(w, "/scheme/ip/{}", self.ip_protocol()).unwrap(); + FpathWriter::with(buf, "ip", |w| { + write!(w, "{}", self.ip_protocol()).unwrap(); Ok(()) }) } diff --git a/netstack/src/scheme/tcp.rs b/netstack/src/scheme/tcp.rs index b75583729f..435553829d 100644 --- a/netstack/src/scheme/tcp.rs +++ b/netstack/src/scheme/tcp.rs @@ -273,9 +273,8 @@ impl<'a> SchemeSocket for TcpSocket<'a> { } fn fpath(&self, file: &SchemeFile, buf: &mut [u8]) -> SyscallResult { - FpathWriter::with(buf, |w| { + FpathWriter::with(buf, "tcp", |w| { let unspecified = "0.0.0.0:0"; - write!(w, "/scheme/tcp/").unwrap(); match self.remote_endpoint() { Some(endpoint) => write!(w, "{}", endpoint).unwrap(), None => w.push_str(unspecified), diff --git a/netstack/src/scheme/udp.rs b/netstack/src/scheme/udp.rs index a53b5d51fa..f336d2544a 100644 --- a/netstack/src/scheme/udp.rs +++ b/netstack/src/scheme/udp.rs @@ -269,9 +269,8 @@ impl<'a> SchemeSocket for UdpSocket<'a> { } fn fpath(&self, file: &SchemeFile, buf: &mut [u8]) -> SyscallResult { - FpathWriter::with(buf, |w| { + FpathWriter::with(buf, "udp", |w| { let unspecified = "0.0.0.0:0"; - w.push_str("/scheme/udp/"); // remote match file { diff --git a/ptyd/src/pty.rs b/ptyd/src/pty.rs index bed5ed6254..bcc46ac35a 100644 --- a/ptyd/src/pty.rs +++ b/ptyd/src/pty.rs @@ -32,8 +32,8 @@ impl Pty { } pub fn path(&self, buf: &mut [u8]) -> Result { - FpathWriter::with(buf, |w| { - write!(w, "/scheme/pty/{}", self.id).unwrap(); + FpathWriter::with(buf, "pty", |w| { + write!(w, "{}", self.id).unwrap(); Ok(()) }) } diff --git a/ramfs/src/scheme.rs b/ramfs/src/scheme.rs index 84b9a3eb1a..421d814126 100644 --- a/ramfs/src/scheme.rs +++ b/ramfs/src/scheme.rs @@ -1,5 +1,4 @@ use std::convert::{TryFrom, TryInto}; -use std::iter; use std::os::unix::io::AsRawFd; use std::{mem, str}; @@ -460,7 +459,7 @@ impl SchemeSync for Scheme { Err(Error::new(ENOSYS)) } fn fpath(&mut self, fd: usize, buf: &mut [u8], _ctx: &CallerCtx) -> Result { - FpathWriter::with(buf, |w| { + FpathWriter::with(buf, &self.scheme_name, |w| { let mut current_inode = match *self.handles.get(fd)? { Handle::Inode(inode) => inode, Handle::SchemeRoot => return Err(Error::new(EISDIR)), @@ -495,10 +494,11 @@ impl SchemeSync for Scheme { current_info = parent_info; } - for component in iter::once(self.scheme_name.trim_start_matches('/')) - .chain(chain.iter().copied().rev()) - { - write!(w, "/{component}").unwrap(); + for (i, component) in chain.iter().copied().rev().enumerate() { + if i != 0 { + w.push_str("/"); + } + w.push_str(component); } Ok(()) }) diff --git a/randd/src/main.rs b/randd/src/main.rs index 7b3ffaaf31..d68dd732d1 100644 --- a/randd/src/main.rs +++ b/randd/src/main.rs @@ -431,10 +431,7 @@ impl SchemeSync for RandScheme { Ok(EventFlags::EVENT_READ) } fn fpath(&mut self, _file: usize, buf: &mut [u8], _ctx: &CallerCtx) -> Result { - FpathWriter::with(buf, |w| { - w.push_str("/scheme/rand"); - Ok(()) - }) + FpathWriter::with(buf, "rand", |_| Ok(())) } fn fstat(&mut self, file: usize, stat: &mut Stat, _ctx: &CallerCtx) -> Result<()> { diff --git a/scheme-utils/src/lib.rs b/scheme-utils/src/lib.rs index 84906fc5ff..b262939c6b 100644 --- a/scheme-utils/src/lib.rs +++ b/scheme-utils/src/lib.rs @@ -81,8 +81,24 @@ pub struct FpathWriter<'a> { } impl<'a> FpathWriter<'a> { - pub fn with(buf: &'a mut [u8], f: impl FnOnce(&mut Self) -> Result<()>) -> Result { + pub fn with( + buf: &'a mut [u8], + scheme_name: &str, + f: impl FnOnce(&mut Self) -> Result<()>, + ) -> Result { let mut w = FpathWriter { buf, written: 0 }; + write!(w, "/scheme/{scheme_name}/").unwrap(); + f(&mut w)?; + Ok(w.written) + } + + pub fn with_legacy( + buf: &'a mut [u8], + scheme_name: &str, + f: impl FnOnce(&mut Self) -> Result<()>, + ) -> Result { + let mut w = FpathWriter { buf, written: 0 }; + write!(w, "{scheme_name}:").unwrap(); f(&mut w)?; Ok(w.written) } diff --git a/zerod/src/scheme.rs b/zerod/src/scheme.rs index 5347c9ecf7..3e988461e1 100644 --- a/zerod/src/scheme.rs +++ b/zerod/src/scheme.rs @@ -68,10 +68,7 @@ impl SchemeSync for ZeroScheme { } fn fpath(&mut self, _id: usize, buf: &mut [u8], _ctx: &CallerCtx) -> Result { - FpathWriter::with(buf, |w| { - w.push_str("zero:"); - Ok(()) - }) + FpathWriter::with(buf, "zero", |_| Ok(())) } fn fsync(&mut self, _id: usize, _ctx: &CallerCtx) -> Result<()> {