feat: Implement realpathat for ramfs

This commit is contained in:
Ibuki Omatsu
2026-05-29 11:13:35 +00:00
committed by Jacob Lorentzon
parent 784801908e
commit 52b1d04e12
6 changed files with 176 additions and 129 deletions
Generated
+58 -58
View File
@@ -13,7 +13,7 @@ dependencies = [
"pcid",
"redox-scheme",
"redox_event",
"redox_syscall 0.7.5",
"redox_syscall 0.8.0",
"scheme-utils",
"spin",
]
@@ -48,7 +48,7 @@ dependencies = [
"plain",
"redox-scheme",
"redox_event",
"redox_syscall 0.7.5",
"redox_syscall 0.8.0",
"ron",
"rustc-hash",
"scheme-utils",
@@ -80,7 +80,7 @@ dependencies = [
"log",
"pcid",
"redox_event",
"redox_syscall 0.7.5",
"redox_syscall 0.8.0",
]
[[package]]
@@ -193,7 +193,7 @@ dependencies = [
"libc",
"libredox",
"redox-scheme",
"redox_syscall 0.7.5",
"redox_syscall 0.8.0",
"scheme-utils",
]
@@ -225,7 +225,7 @@ dependencies = [
"fdt 0.2.0-alpha1",
"libredox",
"redox_event",
"redox_syscall 0.7.5",
"redox_syscall 0.8.0",
]
[[package]]
@@ -423,7 +423,7 @@ dependencies = [
"libredox",
"log",
"redox-log",
"redox_syscall 0.7.5",
"redox_syscall 0.8.0",
]
[[package]]
@@ -514,7 +514,7 @@ dependencies = [
"libc",
"libredox",
"redox-scheme",
"redox_syscall 0.7.5",
"redox_syscall 0.8.0",
]
[[package]]
@@ -582,7 +582,7 @@ dependencies = [
"log",
"partitionlib",
"redox-scheme",
"redox_syscall 0.7.5",
"redox_syscall 0.8.0",
"scheme-utils",
]
@@ -599,7 +599,7 @@ dependencies = [
"log",
"redox-ioctl",
"redox-scheme",
"redox_syscall 0.7.5",
"redox_syscall 0.8.0",
"scheme-utils",
]
@@ -610,7 +610,7 @@ dependencies = [
"daemon",
"libredox",
"redox-scheme",
"redox_syscall 0.7.5",
"redox_syscall 0.8.0",
"scheme-utils",
]
@@ -667,7 +667,7 @@ dependencies = [
"log",
"pcid",
"redox_event",
"redox_syscall 0.7.5",
"redox_syscall 0.8.0",
]
[[package]]
@@ -747,7 +747,7 @@ dependencies = [
"ransid",
"redox-scheme",
"redox_event",
"redox_syscall 0.7.5",
"redox_syscall 0.8.0",
"scheme-utils",
]
@@ -768,7 +768,7 @@ dependencies = [
"ransid",
"redox-scheme",
"redox_event",
"redox_syscall 0.7.5",
"redox_syscall 0.8.0",
"scheme-utils",
"serde",
"toml",
@@ -1061,7 +1061,7 @@ dependencies = [
"log",
"pcid",
"redox_event",
"redox_syscall 0.7.5",
"redox_syscall 0.8.0",
]
[[package]]
@@ -1076,7 +1076,7 @@ dependencies = [
"pcid",
"redox-scheme",
"redox_event",
"redox_syscall 0.7.5",
"redox_syscall 0.8.0",
"scheme-utils",
"spin",
]
@@ -1100,7 +1100,7 @@ dependencies = [
"range-alloc",
"redox-scheme",
"redox_event",
"redox_syscall 0.7.5",
"redox_syscall 0.8.0",
"void",
]
@@ -1124,7 +1124,7 @@ dependencies = [
"libc",
"libredox",
"plain",
"redox_syscall 0.7.5",
"redox_syscall 0.8.0",
"serde",
"serde_json",
"toml",
@@ -1141,7 +1141,7 @@ dependencies = [
"log",
"orbclient",
"redox-scheme",
"redox_syscall 0.7.5",
"redox_syscall 0.8.0",
"scheme-utils",
]
@@ -1166,7 +1166,7 @@ dependencies = [
"rand 0.10.1",
"redox-scheme",
"redox_event",
"redox_syscall 0.7.5",
"redox_syscall 0.8.0",
"scheme-utils",
]
@@ -1193,7 +1193,7 @@ dependencies = [
"libredox",
"pcid",
"redox_event",
"redox_syscall 0.7.5",
"redox_syscall 0.8.0",
]
[[package]]
@@ -1228,15 +1228,15 @@ checksum = "68ab91017fe16c622486840e4c83c9a37afeff978bd239b5293d61ece587de66"
[[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 2.11.1",
"ioslice",
"libc",
"plain",
"redox_syscall 0.7.5",
"redox_syscall 0.8.0",
]
[[package]]
@@ -1260,7 +1260,7 @@ dependencies = [
"driver-block",
"libredox",
"redox_event",
"redox_syscall 0.7.5",
"redox_syscall 0.8.0",
]
[[package]]
@@ -1285,7 +1285,7 @@ dependencies = [
"daemon",
"libredox",
"redox-scheme",
"redox_syscall 0.7.5",
"redox_syscall 0.8.0",
"scheme-utils",
]
@@ -1342,7 +1342,7 @@ dependencies = [
"redox-log",
"redox-scheme",
"redox_event",
"redox_syscall 0.7.5",
"redox_syscall 0.8.0",
"scheme-utils",
"smoltcp",
]
@@ -1398,7 +1398,7 @@ dependencies = [
"partitionlib",
"pcid",
"redox_event",
"redox_syscall 0.7.5",
"redox_syscall 0.8.0",
"smallvec 1.15.1",
]
@@ -1525,7 +1525,7 @@ dependencies = [
"pico-args",
"plain",
"redox-scheme",
"redox_syscall 0.7.5",
"redox_syscall 0.8.0",
"scheme-utils",
"serde",
]
@@ -1541,7 +1541,7 @@ dependencies = [
"log",
"pcid",
"pico-args",
"redox_syscall 0.7.5",
"redox_syscall 0.8.0",
"serde",
"toml",
]
@@ -1627,7 +1627,7 @@ dependencies = [
"orbclient",
"redox-scheme",
"redox_event",
"redox_syscall 0.7.5",
"redox_syscall 0.8.0",
]
[[package]]
@@ -1649,7 +1649,7 @@ dependencies = [
"libredox",
"redox-scheme",
"redox_event",
"redox_syscall 0.7.5",
"redox_syscall 0.8.0",
"redox_termios",
"scheme-utils",
]
@@ -1683,7 +1683,7 @@ dependencies = [
"indexmap",
"libredox",
"redox-scheme",
"redox_syscall 0.7.5",
"redox_syscall 0.8.0",
"scheme-utils",
"slab",
]
@@ -1789,7 +1789,7 @@ dependencies = [
"rand_core 0.5.1",
"raw-cpuid",
"redox-scheme",
"redox_syscall 0.7.5",
"redox_syscall 0.8.0",
"scheme-utils",
"sha2",
]
@@ -1851,10 +1851,10 @@ dependencies = [
[[package]]
name = "redox-ioctl"
version = "0.1.0"
source = "git+https://gitlab.redox-os.org/redox-os/relibc.git#546bc6fb21b990ca9195a1115717c9a842fe4909"
source = "git+https://gitlab.redox-os.org/redox-os/relibc.git#0813a23294ba082037cf09d0afd2643e9e77b4ba"
dependencies = [
"drm-sys",
"redox_syscall 0.7.5",
"redox_syscall 0.8.0",
]
[[package]]
@@ -1870,19 +1870,19 @@ dependencies = [
[[package]]
name = "redox-scheme"
version = "0.11.0"
version = "0.11.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e58cb7dee1058575f320f9bfa32c7c0eda857e285c2a163a0eb595d37add09cd"
checksum = "ecd26e368655cb4fdda914512c46c5640221ebe5fa6df5da19c941b9f06ed153"
dependencies = [
"libredox",
"redox_syscall 0.7.5",
"redox_syscall 0.8.0",
]
[[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 2.11.1",
"libredox",
@@ -1899,9 +1899,9 @@ dependencies = [
[[package]]
name = "redox_syscall"
version = "0.7.5"
version = "0.8.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4666a1a60d8412eab19d94f6d13dcc9cea0a5ef4fdf6a5db306537413c661b1b"
checksum = "7c7591fa2c6b601dfcfe5f043f65a1c39fcdf50efefcd7f1572e538c1f4b398d"
dependencies = [
"bitflags 2.11.1",
]
@@ -1921,7 +1921,7 @@ dependencies = [
"libredox",
"qemu-exit",
"redox_event",
"redox_syscall 0.7.5",
"redox_syscall 0.8.0",
"redox_termios",
]
@@ -1997,7 +1997,7 @@ dependencies = [
"log",
"pcid",
"redox_event",
"redox_syscall 0.7.5",
"redox_syscall 0.8.0",
]
[[package]]
@@ -2012,7 +2012,7 @@ dependencies = [
"log",
"pcid",
"redox_event",
"redox_syscall 0.7.5",
"redox_syscall 0.8.0",
]
[[package]]
@@ -2051,7 +2051,7 @@ dependencies = [
"log",
"redox-scheme",
"redox_event",
"redox_syscall 0.7.5",
"redox_syscall 0.8.0",
"scheme-utils",
"spin",
]
@@ -2062,7 +2062,7 @@ version = "0.0.0"
dependencies = [
"libredox",
"redox-scheme",
"redox_syscall 0.7.5",
"redox_syscall 0.8.0",
]
[[package]]
@@ -2452,7 +2452,7 @@ dependencies = [
"log",
"orbclient",
"plain",
"redox_syscall 0.7.5",
"redox_syscall 0.8.0",
"rehid",
"smallvec 1.15.1",
"xhcid",
@@ -2464,7 +2464,7 @@ version = "0.1.0"
dependencies = [
"common",
"log",
"redox_syscall 0.7.5",
"redox_syscall 0.8.0",
"xhcid",
]
@@ -2478,7 +2478,7 @@ dependencies = [
"libredox",
"plain",
"redox_event",
"redox_syscall 0.7.5",
"redox_syscall 0.8.0",
"thiserror 2.0.18",
"xhcid",
]
@@ -2516,7 +2516,7 @@ dependencies = [
"orbclient",
"pcid",
"redox_event",
"redox_syscall 0.7.5",
"redox_syscall 0.8.0",
]
[[package]]
@@ -2543,7 +2543,7 @@ dependencies = [
"orbclient",
"ransid",
"redox_event",
"redox_syscall 0.7.5",
"redox_syscall 0.8.0",
]
[[package]]
@@ -2559,7 +2559,7 @@ dependencies = [
"log",
"pcid",
"redox_event",
"redox_syscall 0.7.5",
"redox_syscall 0.8.0",
"spin",
"static_assertions",
"thiserror 2.0.18",
@@ -2578,7 +2578,7 @@ dependencies = [
"log",
"pcid",
"redox_event",
"redox_syscall 0.7.5",
"redox_syscall 0.8.0",
"static_assertions",
"thiserror 2.0.18",
]
@@ -2598,7 +2598,7 @@ dependencies = [
"orbclient",
"pcid",
"redox_event",
"redox_syscall 0.7.5",
"redox_syscall 0.8.0",
"spin",
"static_assertions",
"virtio-core",
@@ -2615,7 +2615,7 @@ dependencies = [
"libredox",
"log",
"pcid",
"redox_syscall 0.7.5",
"redox_syscall 0.8.0",
"static_assertions",
"virtio-core",
]
@@ -2955,7 +2955,7 @@ dependencies = [
"plain",
"redox-scheme",
"redox_event",
"redox_syscall 0.7.5",
"redox_syscall 0.8.0",
"regex",
"scheme-utils",
"serde",
@@ -2992,7 +2992,7 @@ dependencies = [
"daemon",
"libredox",
"redox-scheme",
"redox_syscall 0.7.5",
"redox_syscall 0.8.0",
"scheme-utils",
]
+4 -4
View File
@@ -85,19 +85,19 @@ edid = "0.3.0" #TODO: edid is abandoned, fork it and maintain?
fdt = "0.1.5"
libc = "0.2.181"
log = "0.4"
libredox = "0.1.16"
libredox = "0.1.17"
orbclient = "0.3.51"
psf-rs = "2.2.0"
parking_lot = "0.12"
pico-args = "0.5"
plain = "0.2.3"
ransid = "0.4"
redox_event = "0.4.6"
redox_event = "0.4.7"
redox-ioctl = { git = "https://gitlab.redox-os.org/redox-os/relibc.git" }
redox-log = { git = "https://gitlab.redox-os.org/redox-os/redox-log.git" }
redox-rt = { git = "https://gitlab.redox-os.org/redox-os/relibc.git", default-features = false }
redox-scheme = "0.11.0"
redox_syscall = { version = "0.7.5", features = ["std"] }
redox-scheme = "0.11.1"
redox_syscall = { version = "0.8.0", features = ["std"] }
redox_termios = "0.1.3"
ron = "0.8.1"
serde = { version = "1", features = ["derive"] }
+8 -8
View File
@@ -41,7 +41,7 @@ checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2"
[[package]]
name = "generic-rt"
version = "0.1.0"
source = "git+https://gitlab.redox-os.org/redox-os/relibc.git#2b69838a481b7be9826b41e06a0b8f1346b80f9e"
source = "git+https://gitlab.redox-os.org/redox-os/relibc.git#0813a23294ba082037cf09d0afd2643e9e77b4ba"
[[package]]
name = "goblin"
@@ -77,9 +77,9 @@ checksum = "459427e2af2b9c839b132acb702a1c654d95e10f8c326bfc2ad11310e458b1c5"
[[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",
@@ -151,7 +151,7 @@ checksum = "436d45c2b6a5b159d43da708e62b25be3a4a3d5550d654b72216ade4c4bfd717"
[[package]]
name = "redox-rt"
version = "0.1.0"
source = "git+https://gitlab.redox-os.org/redox-os/relibc.git#2b69838a481b7be9826b41e06a0b8f1346b80f9e"
source = "git+https://gitlab.redox-os.org/redox-os/relibc.git#0813a23294ba082037cf09d0afd2643e9e77b4ba"
dependencies = [
"bitflags",
"generic-rt",
@@ -165,9 +165,9 @@ dependencies = [
[[package]]
name = "redox-scheme"
version = "0.11.0"
version = "0.11.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e58cb7dee1058575f320f9bfa32c7c0eda857e285c2a163a0eb595d37add09cd"
checksum = "ecd26e368655cb4fdda914512c46c5640221ebe5fa6df5da19c941b9f06ed153"
dependencies = [
"libredox",
"redox_syscall",
@@ -175,9 +175,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 -3
View File
@@ -12,12 +12,12 @@ hashbrown = { version = "0.15", default-features = false, features = [
"default-hasher",
] }
linked_list_allocator = "0.10"
libredox = { version = "0.1.16", default-features = false, features = ["protocol"] }
libredox = { version = "0.1.17", default-features = false, features = ["protocol"] }
log = { version = "0.4", default-features = false }
plain = "0.2"
redox-initfs = { path = "../initfs", default-features = false }
redox_syscall = "0.7.4"
redox-scheme = { version = "0.11.0", default-features = false }
redox_syscall = "0.8.0"
redox-scheme = { version = "0.11.1", default-features = false }
redox-path = "0.3.1"
slab = { version = "0.4.9", default-features = false }
arrayvec = { version = "0.7.6", default-features = false }
+18 -18
View File
@@ -725,10 +725,7 @@ impl<'a> ProcScheme<'a> {
sig_pctl: None, // TODO
rtqs: Vec::new(),
}));
if let Err(err) = new_process
.borrow_mut()
.sync_kernel_attrs(&self.auth)
{
if let Err(err) = new_process.borrow_mut().sync_kernel_attrs(&self.auth) {
log::warn!("Failed to set kernel attrs when forking: {err}");
}
@@ -919,7 +916,7 @@ impl<'a> ProcScheme<'a> {
mut op: OpCall,
awoken: &mut VecDeque<VirtualId>,
) -> Poll<Response> {
let id = op.fd;
let id = op.fd();
let (payload, metadata) = op.payload_and_metadata();
match self.handles[id] {
Handle::Init => Response::ready_err(EBADF, op),
@@ -1068,25 +1065,27 @@ impl<'a> ProcScheme<'a> {
// FIXME remove this ProcCall variant
ProcCall::Setrens => Response::ready_err(EINVAL, op),
ProcCall::SetProcPriority => {
let target_pid = NonZeroUsize::new(metadata[1] as usize).map_or(fd_pid, |n| ProcessId(n.get()));
let target_pid = NonZeroUsize::new(metadata[1] as usize)
.map_or(fd_pid, |n| ProcessId(n.get()));
let new_prio = metadata[2] as u32;
Ready(Response::new(
self.on_setprocprio(fd_pid, target_pid, new_prio).map(|()| 0),
op
self.on_setprocprio(fd_pid, target_pid, new_prio)
.map(|()| 0),
op,
))
},
}
ProcCall::GetProcPriority => {
let target_pid = NonZeroUsize::new(metadata[1] as usize)
.map_or(fd_pid, |n| ProcessId(n.get()));
Ready(Response::new(
self.on_getprocprio(fd_pid, target_pid).map(|prio| prio as usize),
self.on_getprocprio(fd_pid, target_pid)
.map(|prio| prio as usize),
op,
))
},
}
}
}
Handle::Ps(_) => Response::ready_err(EOPNOTSUPP, op),
@@ -2566,7 +2565,12 @@ impl<'a> ProcScheme<'a> {
return Err(Error::new(EINVAL));
}
let caller_euid = self.processes.get(&caller_pid).ok_or(Error::new(ESRCH))?.borrow().euid;
let caller_euid = self
.processes
.get(&caller_pid)
.ok_or(Error::new(ESRCH))?
.borrow()
.euid;
let target_rc = self.processes.get(&target_pid).ok_or(Error::new(ESRCH))?;
let mut target = target_rc.borrow_mut();
@@ -2583,11 +2587,7 @@ impl<'a> ProcScheme<'a> {
Ok(())
}
fn on_getprocprio(
&self,
caller_pid: ProcessId,
target_pid: ProcessId,
) -> Result<u32> {
fn on_getprocprio(&self, caller_pid: ProcessId, target_pid: ProcessId) -> Result<u32> {
let target_rc = self.processes.get(&target_pid).ok_or(Error::new(ESRCH))?;
Ok(target_rc.borrow().prio)
}
+85 -38
View File
@@ -6,7 +6,7 @@ use scheme_utils::{FpathWriter, HandleMap};
use syscall::dirent::{DirEntry, DirentBuf, DirentKind};
use syscall::error::{
EACCES, EBADF, EBADFD, EEXIST, EINVAL, EIO, EISDIR, ENOMEM, ENOSYS, ENOTDIR, ENOTEMPTY,
EOPNOTSUPP, EOVERFLOW, EPERM,
EOPNOTSUPP, EOVERFLOW, EPERM, ERANGE,
};
use syscall::flag::{
StdFsCallKind, O_ACCMODE, O_CREAT, O_DIRECTORY, O_EXCL, O_RDONLY, O_RDWR, O_STAT, O_TRUNC,
@@ -25,7 +25,14 @@ use crate::filesystem::{self, File, FileData, Filesystem, Inode};
enum Handle {
Inode(usize),
SchemeRoot,
}
impl Handle {
fn as_inode(&self) -> Result<usize> {
match self {
&Self::Inode(inode) => Ok(inode),
}
}
}
pub struct Scheme {
@@ -164,7 +171,7 @@ impl Scheme {
impl SchemeSync for Scheme {
fn scheme_root(&mut self) -> Result<usize> {
Ok(self.handles.insert(Handle::SchemeRoot))
Ok(self.handles.insert(Handle::Inode(Filesystem::ROOT_INODE)))
}
fn openat(
&mut self,
@@ -174,7 +181,7 @@ impl SchemeSync for Scheme {
fcntl_flags: u32,
ctx: &CallerCtx,
) -> Result<OpenResult> {
if !matches!(self.handles.get(dirfd)?, Handle::SchemeRoot) {
if self.handles.get(dirfd)?.as_inode()? != Filesystem::ROOT_INODE {
return Err(Error::new(EACCES));
}
@@ -272,7 +279,7 @@ impl SchemeSync for Scheme {
}
fn unlinkat(&mut self, dirfd: usize, path: &str, flags: usize, ctx: &CallerCtx) -> Result<()> {
{
if !matches!(self.handles.get(dirfd)?, Handle::SchemeRoot) {
if !self.handles.get(dirfd)?.as_inode()? != Filesystem::ROOT_INODE {
return Err(Error::new(EACCES));
}
}
@@ -294,10 +301,7 @@ impl SchemeSync for Scheme {
let Ok(offset) = usize::try_from(offset) else {
return Ok(0);
};
let inode = match self.handles.get(fd)? {
Handle::Inode(inode) => inode,
Handle::SchemeRoot => return Err(Error::new(EISDIR)),
};
let inode = self.handles.get(fd)?.as_inode()?;
let file = self
.filesystem
.files
@@ -330,10 +334,7 @@ impl SchemeSync for Scheme {
let Ok(offset) = usize::try_from(opaque_offset) else {
return Ok(buf);
};
let inode = match self.handles.get(fd)? {
Handle::Inode(inode) => inode,
Handle::SchemeRoot => return Err(Error::new(EISDIR)),
};
let inode = self.handles.get(fd)?.as_inode()?;
let file = self
.filesystem
.files
@@ -365,10 +366,7 @@ impl SchemeSync for Scheme {
let Ok(offset) = usize::try_from(offset) else {
return Ok(0);
};
let inode = match self.handles.get(fd)? {
Handle::Inode(inode) => inode,
Handle::SchemeRoot => return Err(Error::new(EISDIR)),
};
let inode = self.handles.get(fd)?.as_inode()?;
let file = self
.filesystem
.files
@@ -395,10 +393,7 @@ impl SchemeSync for Scheme {
}
}
fn fchmod(&mut self, fd: usize, mode: u16, _ctx: &CallerCtx) -> Result<()> {
let inode = match self.handles.get(fd)? {
Handle::Inode(inode) => inode,
Handle::SchemeRoot => return Err(Error::new(EISDIR)),
};
let inode = self.handles.get(fd)?.as_inode()?;
let file = self
.filesystem
.files
@@ -460,11 +455,7 @@ impl SchemeSync for Scheme {
}
fn fpath(&mut self, fd: usize, buf: &mut [u8], _ctx: &CallerCtx) -> Result<usize> {
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)),
};
let mut current_inode = self.handles.get(fd)?.as_inode()?;
let mut chain = Vec::new();
let mut current_info = self
@@ -508,10 +499,7 @@ impl SchemeSync for Scheme {
Err(Error::new(ENOSYS))
}
fn fstat(&mut self, fd: usize, stat: &mut Stat, _ctx: &CallerCtx) -> Result<()> {
let inode = match *self.handles.get(fd)? {
Handle::Inode(inode) => inode,
Handle::SchemeRoot => return Err(Error::new(EISDIR)),
};
let inode = self.handles.get(fd)?.as_inode()?;
let block_size = self.filesystem.block_size();
let file = self
@@ -586,10 +574,7 @@ impl SchemeSync for Scheme {
Ok(())
}
fn ftruncate(&mut self, fd: usize, size: u64, _ctx: &CallerCtx) -> Result<()> {
let inode = match self.handles.get(fd)? {
Handle::Inode(inode) => inode,
Handle::SchemeRoot => return Err(Error::new(EISDIR)),
};
let inode = self.handles.get(fd)?.as_inode()?;
let file = self
.filesystem
.files
@@ -615,10 +600,7 @@ impl SchemeSync for Scheme {
Ok(())
}
fn futimens(&mut self, fd: usize, times: &[TimeSpec], _ctx: &CallerCtx) -> Result<()> {
let inode = match self.handles.get(fd)? {
Handle::Inode(inode) => inode,
Handle::SchemeRoot => return Err(Error::new(EISDIR)),
};
let inode = self.handles.get(fd)?.as_inode()?;
let file = self
.filesystem
.files
@@ -634,6 +616,71 @@ impl SchemeSync for Scheme {
Ok(())
}
fn relpathat(
&mut self,
dir_id: usize,
id: usize,
path: &mut [u8],
_ctx: &CallerCtx,
) -> Result<usize> {
let (&Handle::Inode(dir_inode), &Handle::Inode(mut current_inode)) =
(self.handles.get(dir_id)?, self.handles.get(id)?)
else {
return Err(Error::new(EBADF));
};
let mut chain = Vec::new();
let mut current_info = self
.filesystem
.files
.get(&current_inode)
.ok_or(Error::new(EBADFD))?;
while current_inode != dir_inode && current_inode != Filesystem::ROOT_INODE {
let parent_info = self
.filesystem
.files
.get(&current_info.parent.0)
.ok_or(Error::new(EBADFD))?;
let FileData::Directory(ref dir) = parent_info.data else {
return Err(Error::new(EBADFD));
};
let (name, _) = dir
.iter()
.find(|(_name, inode)| inode.0 == current_inode)
.ok_or(Error::new(ENOENT))?;
chain.push(name);
current_inode = current_info.parent.0;
current_info = parent_info;
}
let mut offset = 0;
for (i, component) in chain.iter().rev().enumerate() {
if i != 0 {
if offset >= path.len() {
return Err(Error::new(ERANGE));
}
path[offset] = b'/';
offset += 1;
}
let bytes: &[u8] = component.as_ref();
if offset + bytes.len() > path.len() {
return Err(Error::new(ERANGE));
}
path[offset..offset + bytes.len()].copy_from_slice(bytes);
offset += bytes.len();
}
Ok(offset)
}
fn std_fs_call(
&mut self,
id: usize,