From c2bcf91339125927f15a93d32f61c08c44acc144 Mon Sep 17 00:00:00 2001 From: Ibuki Omatsu Date: Wed, 27 May 2026 14:36:44 +0000 Subject: [PATCH] feat: Implement relpathat --- Cargo.lock | 12 +++---- Cargo.toml | 7 ++-- redox-ioctl/Cargo.toml | 2 +- redox-rt/src/sys.rs | 65 +++++++++++++++------------------- src/platform/redox/libredox.rs | 14 ++++++++ 5 files changed, 53 insertions(+), 47 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 0ac6eeabe5..aa6e71ad98 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -256,9 +256,9 @@ checksum = "f9fbbcab51052fe104eb5e5d351cf728d30a5be1fe14d9be8a3b097481fb97de" [[package]] name = "libredox" -version = "0.1.16" +version = "0.1.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e02f3bb43d335493c96bf3fd3a321600bf6bd07ed34bc64118e9293bdffea46c" +checksum = "f02ab6bace2054fb888a3c16f990117b579d14a3088e472d63c6011fa185c9d3" dependencies = [ "bitflags", "libc", @@ -461,9 +461,9 @@ dependencies = [ [[package]] name = "redox_event" -version = "0.4.6" +version = "0.4.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ea3e412d205440c7b0218af26247226f979ed1201674cda7a33cc70609084b5" +checksum = "8c07d0d6d291e3a951bd847b1cd4af32fc6243d64116cf7702838c02797688b7" dependencies = [ "bitflags", "libredox", @@ -472,9 +472,9 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.7.4" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f450ad9c3b1da563fb6948a8e0fb0fb9269711c9c73d9ea1de5058c79c8d643a" +checksum = "7c7591fa2c6b601dfcfe5f043f65a1c39fcdf50efefcd7f1572e538c1f4b398d" dependencies = [ "bitflags", ] diff --git a/Cargo.toml b/Cargo.toml index fdcf48763d..0beb3d5308 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -67,9 +67,8 @@ bitflags = "2" ioslice = { version = "0.6", default-features = false } plain = "0.2" redox-path = "0.3" -redox_protocols = { package = "libredox", version = "0.1.16", default-features = false, features = ["protocol"] } -redox_syscall = "0.7.4" - +redox_protocols = { package = "libredox", version = "0.1.17", default-features = false, features = ["protocol"] } +redox_syscall = "0.8.0" [build-dependencies] cc = "1" @@ -121,7 +120,7 @@ sc = "0.2.7" redox_syscall.workspace = true redox-rt = { path = "redox-rt" } redox-path.workspace = true -redox_event = { version = "0.4.6", default-features = false, features = [ +redox_event = { version = "0.4.7", default-features = false, features = [ "redox_syscall", ] } ioslice.workspace = true diff --git a/redox-ioctl/Cargo.toml b/redox-ioctl/Cargo.toml index 2acdaa8e7e..0bf8029cab 100644 --- a/redox-ioctl/Cargo.toml +++ b/redox-ioctl/Cargo.toml @@ -8,6 +8,6 @@ description = "Ioctl definitions and (de)serialization for Redox" [dependencies] drm-sys = "0.8.0" -redox_syscall = "0.7" +redox_syscall = "0.8" [features] diff --git a/redox-rt/src/sys.rs b/redox-rt/src/sys.rs index f0363a39a9..190610b5de 100644 --- a/redox-rt/src/sys.rs +++ b/redox-rt/src/sys.rs @@ -6,7 +6,7 @@ use core::{ use ioslice::IoSlice; use syscall::{ - CallFlags, EINVAL, ERESTART, StdFsCallKind, TimeSpec, + Call, CallFlags, EINVAL, ERESTART, StdFsCallKind, TimeSpec, data::StdFsCallMeta, error::{self, EINTR, ENODEV, ESRCH, Error, Result}, }; @@ -171,33 +171,14 @@ pub unsafe fn sys_futex_wake(addr: *mut u32, num: u32) -> Result { } .map(|awoken| awoken as u32) } -unsafe fn raw_sys_call( - fd: usize, - payload_ptr: *const u8, - len: usize, - flags: CallFlags, - metadata: &[u64], -) -> Result { - unsafe { - syscall::syscall5( - syscall::SYS_CALL, - fd, - payload_ptr as usize, - len, - metadata.len() | flags.bits(), - metadata.as_ptr() as usize, - ) - } -} -pub fn sys_call_ro( - fd: usize, +pub fn sys_call_ro( + fd: T, payload: &mut [u8], flags: CallFlags, metadata: &[u64], ) -> Result { unsafe { - raw_sys_call( - fd, + fd.raw_call( payload.as_mut_ptr(), payload.len(), flags | CallFlags::READ, @@ -205,10 +186,14 @@ pub fn sys_call_ro( ) } } -pub fn sys_call_wo(fd: usize, payload: &[u8], flags: CallFlags, metadata: &[u64]) -> Result { +pub fn sys_call_wo( + fd: T, + payload: &[u8], + flags: CallFlags, + metadata: &[u64], +) -> Result { unsafe { - raw_sys_call( - fd, + fd.raw_call( payload.as_ptr(), payload.len(), flags | CallFlags::WRITE, @@ -216,15 +201,14 @@ pub fn sys_call_wo(fd: usize, payload: &[u8], flags: CallFlags, metadata: &[u64] ) } } -pub fn sys_call_rw( - fd: usize, +pub fn sys_call_rw( + fd: T, payload: &mut [u8], flags: CallFlags, metadata: &[u64], ) -> Result { unsafe { - raw_sys_call( - fd, + fd.raw_call( payload.as_mut_ptr(), payload.len(), flags | CallFlags::READ | CallFlags::WRITE, @@ -232,14 +216,15 @@ pub fn sys_call_rw( ) } } -pub fn sys_call( - fd: usize, +pub fn sys_call( + fd: T, payload: &mut [u8], flags: CallFlags, metadata: &[u64], ) -> Result { - unsafe { raw_sys_call(fd, payload.as_mut_ptr(), payload.len(), flags, metadata) } + unsafe { fd.raw_call(payload.as_mut_ptr(), payload.len(), flags, metadata) } } + pub fn this_proc_call(payload: &mut [u8], flags: CallFlags, metadata: &[u64]) -> Result { proc_call( crate::current_proc_fd().as_raw_fd(), @@ -549,13 +534,21 @@ pub fn register_scheme_to_ns(ns_fd: usize, name: &str, cap_fd: usize) -> Result< ns_this_scheme.call_wo(&cap_bytes, CallFlags::FD, &[])?; Ok(()) } -pub fn std_fs_call_ro(fd: usize, payload: &mut [u8], metadata: &StdFsCallMeta) -> Result { +pub fn std_fs_call_ro( + fd: T, + payload: &mut [u8], + metadata: &StdFsCallMeta, +) -> Result { sys_call_ro(fd, payload, CallFlags::STD_FS, metadata) } -pub fn std_fs_call_wo(fd: usize, payload: &[u8], metadata: &StdFsCallMeta) -> Result { +pub fn std_fs_call_wo(fd: T, payload: &[u8], metadata: &StdFsCallMeta) -> Result { sys_call_wo(fd, payload, CallFlags::STD_FS, metadata) } -pub fn std_fs_call_rw(fd: usize, payload: &mut [u8], metadata: &StdFsCallMeta) -> Result { +pub fn std_fs_call_rw( + fd: T, + payload: &mut [u8], + metadata: &StdFsCallMeta, +) -> Result { sys_call_rw(fd, payload, CallFlags::STD_FS, metadata) } pub fn fstat(fd: usize, stat: &mut syscall::Stat) -> Result { diff --git a/src/platform/redox/libredox.rs b/src/platform/redox/libredox.rs index 827c02dcf6..60ac55183c 100644 --- a/src/platform/redox/libredox.rs +++ b/src/platform/redox/libredox.rs @@ -616,3 +616,17 @@ pub unsafe extern "C" fn redox_register_scheme_to_ns_v0( .map(|()| 0), ) } + +#[unsafe(no_mangle)] +pub unsafe extern "C" fn redox_relpathat_v0( + dirfd: usize, + fd: usize, + dst_base: *mut u8, + dst_len: usize, +) -> RawResult { + Error::mux(redox_rt::sys::std_fs_call_ro( + &[dirfd, fd][..], + unsafe { slice::from_raw_parts_mut(dst_base, dst_len) }, + &StdFsCallMeta::new(StdFsCallKind::Relpathat, 0, 0), + )) +}