Merge branch 'relpathat' into 'master'

feat: Implement relpathat

See merge request redox-os/relibc!1360
This commit is contained in:
Jacob Lorentzon
2026-05-27 16:36:45 +02:00
5 changed files with 53 additions and 47 deletions
Generated
+6 -6
View File
@@ -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",
]
+3 -4
View File
@@ -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
+1 -1
View File
@@ -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]
+29 -36
View File
@@ -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<u32> {
}
.map(|awoken| awoken as u32)
}
unsafe fn raw_sys_call(
fd: usize,
payload_ptr: *const u8,
len: usize,
flags: CallFlags,
metadata: &[u64],
) -> Result<usize> {
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<T: Call>(
fd: T,
payload: &mut [u8],
flags: CallFlags,
metadata: &[u64],
) -> Result<usize> {
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<usize> {
pub fn sys_call_wo<T: Call>(
fd: T,
payload: &[u8],
flags: CallFlags,
metadata: &[u64],
) -> Result<usize> {
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<T: Call>(
fd: T,
payload: &mut [u8],
flags: CallFlags,
metadata: &[u64],
) -> Result<usize> {
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<T: Call>(
fd: T,
payload: &mut [u8],
flags: CallFlags,
metadata: &[u64],
) -> Result<usize> {
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<usize> {
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<usize> {
pub fn std_fs_call_ro<T: Call>(
fd: T,
payload: &mut [u8],
metadata: &StdFsCallMeta,
) -> Result<usize> {
sys_call_ro(fd, payload, CallFlags::STD_FS, metadata)
}
pub fn std_fs_call_wo(fd: usize, payload: &[u8], metadata: &StdFsCallMeta) -> Result<usize> {
pub fn std_fs_call_wo<T: Call>(fd: T, payload: &[u8], metadata: &StdFsCallMeta) -> Result<usize> {
sys_call_wo(fd, payload, CallFlags::STD_FS, metadata)
}
pub fn std_fs_call_rw(fd: usize, payload: &mut [u8], metadata: &StdFsCallMeta) -> Result<usize> {
pub fn std_fs_call_rw<T: Call>(
fd: T,
payload: &mut [u8],
metadata: &StdFsCallMeta,
) -> Result<usize> {
sys_call_rw(fd, payload, CallFlags::STD_FS, metadata)
}
pub fn fstat(fd: usize, stat: &mut syscall::Stat) -> Result<usize> {
+14
View File
@@ -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),
))
}