From 3681e1b74ac4d04e3831b575b24e4967f2549a22 Mon Sep 17 00:00:00 2001 From: Ibuki Omatsu Date: Thu, 18 Dec 2025 01:46:05 +0000 Subject: [PATCH] refactor: Replace unlink and rmdir with unlinkat in ramfs. Update redox-scheme and redox-rt for bootstrap. --- Cargo.lock | 179 ++++++++-------- audiod/Cargo.toml | 6 +- bootstrap/Cargo.lock | 18 +- bootstrap/Cargo.toml | 7 +- bootstrap/src/exec.rs | 2 +- bootstrap/src/initfs.rs | 34 ++- bootstrap/src/procmgr.rs | 2 +- drivers/acpid/Cargo.toml | 4 +- drivers/audio/ac97d/Cargo.toml | 4 +- drivers/audio/ihdad/Cargo.toml | 4 +- drivers/audio/sb16d/Cargo.toml | 4 +- drivers/common/Cargo.toml | 2 +- drivers/graphics/bgad/Cargo.toml | 4 +- drivers/graphics/driver-graphics/Cargo.toml | 4 +- drivers/graphics/fbbootlogd/Cargo.toml | 4 +- drivers/graphics/fbcond/Cargo.toml | 6 +- drivers/graphics/fbcond/src/main.rs | 156 +++++++++----- drivers/graphics/fbcond/src/scheme.rs | 112 ++++++---- drivers/graphics/graphics-ipc/Cargo.toml | 4 +- drivers/graphics/vesad/Cargo.toml | 2 +- drivers/graphics/virtio-gpud/Cargo.toml | 2 +- drivers/input/ps2d/Cargo.toml | 4 +- drivers/input/usbhidd/Cargo.toml | 2 +- drivers/inputd/Cargo.toml | 4 +- drivers/net/alxd/Cargo.toml | 4 +- drivers/net/driver-network/Cargo.toml | 6 +- drivers/net/driver-network/src/lib.rs | 219 ++++++++++++-------- drivers/net/e1000d/Cargo.toml | 6 +- drivers/net/ixgbed/Cargo.toml | 6 +- drivers/net/rtl8139d/Cargo.toml | 6 +- drivers/net/rtl8168d/Cargo.toml | 6 +- drivers/net/virtio-netd/Cargo.toml | 4 +- drivers/pcid-spawner/Cargo.toml | 2 +- drivers/pcid/Cargo.toml | 4 +- drivers/redoxerd/Cargo.toml | 2 +- drivers/storage/ahcid/Cargo.toml | 2 +- drivers/storage/bcm2835-sdhcid/Cargo.toml | 2 +- drivers/storage/driver-block/Cargo.toml | 4 +- drivers/storage/ided/Cargo.toml | 2 +- drivers/storage/lived/Cargo.toml | 2 +- drivers/storage/nvmed/Cargo.toml | 2 +- drivers/storage/usbscsid/Cargo.toml | 2 +- drivers/storage/virtio-blkd/Cargo.toml | 2 +- drivers/usb/usbhubd/Cargo.toml | 2 +- drivers/usb/xhcid/Cargo.toml | 4 +- drivers/vboxd/Cargo.toml | 2 +- drivers/virtio-core/Cargo.toml | 2 +- ipcd/Cargo.toml | 4 +- ipcd/src/shm.rs | 92 ++++++-- logd/Cargo.toml | 4 +- netstack/Cargo.toml | 4 +- ptyd/Cargo.toml | 4 +- ramfs/Cargo.toml | 6 +- ramfs/src/scheme.rs | 17 +- randd/Cargo.toml | 4 +- zerod/Cargo.toml | 4 +- 56 files changed, 615 insertions(+), 387 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 2db6a02f6e..c627610e0b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -12,9 +12,9 @@ dependencies = [ "libredox", "log", "pcid", - "redox-scheme 0.8.2", + "redox-scheme", "redox_event", - "redox_syscall", + "redox_syscall 0.6.0", "spin 0.9.8", ] @@ -46,9 +46,9 @@ dependencies = [ "num-traits", "parking_lot 0.12.5", "plain", - "redox-scheme 0.8.2", + "redox-scheme", "redox_event", - "redox_syscall", + "redox_syscall 0.6.0", "ron", "rustc-hash", "serde", @@ -68,7 +68,7 @@ dependencies = [ "log", "pcid", "redox_event", - "redox_syscall", + "redox_syscall 0.6.0", ] [[package]] @@ -88,9 +88,9 @@ dependencies = [ "common", "daemon", "libredox", - "redox-scheme 0.8.2", + "redox-scheme", "redox_event", - "redox_syscall", + "redox_syscall 0.6.0", ] [[package]] @@ -213,8 +213,8 @@ dependencies = [ "ioslice", "libc", "libredox", - "redox-scheme 0.8.2", - "redox_syscall", + "redox-scheme", + "redox_syscall 0.6.0", ] [[package]] @@ -245,7 +245,7 @@ dependencies = [ "fdt 0.2.0-alpha1", "libredox", "redox_event", - "redox_syscall", + "redox_syscall 0.6.0", ] [[package]] @@ -259,8 +259,8 @@ dependencies = [ "log", "orbclient", "pcid", - "redox-scheme 0.8.2", - "redox_syscall", + "redox-scheme", + "redox_syscall 0.6.0", ] [[package]] @@ -432,7 +432,7 @@ dependencies = [ "libredox", "log", "redox-log", - "redox_syscall", + "redox_syscall 0.6.0", ] [[package]] @@ -568,8 +568,8 @@ dependencies = [ "libredox", "log", "partitionlib", - "redox-scheme 0.8.2", - "redox_syscall", + "redox-scheme", + "redox_syscall 0.6.0", ] [[package]] @@ -582,8 +582,8 @@ dependencies = [ "inputd", "libredox", "log", - "redox-scheme 0.8.2", - "redox_syscall", + "redox-scheme", + "redox_syscall 0.6.0", ] [[package]] @@ -592,8 +592,8 @@ version = "0.1.0" dependencies = [ "daemon", "libredox", - "redox-scheme 0.4.0", - "redox_syscall", + "redox-scheme", + "redox_syscall 0.6.0", ] [[package]] @@ -618,7 +618,7 @@ dependencies = [ "log", "pcid", "redox_event", - "redox_syscall", + "redox_syscall 0.6.0", ] [[package]] @@ -666,9 +666,9 @@ dependencies = [ "libredox", "orbclient", "ransid", - "redox-scheme 0.8.2", + "redox-scheme", "redox_event", - "redox_syscall", + "redox_syscall 0.6.0", ] [[package]] @@ -684,9 +684,9 @@ dependencies = [ "log", "orbclient", "ransid", - "redox-scheme 0.4.0", + "redox-scheme", "redox_event", - "redox_syscall", + "redox_syscall 0.6.0", ] [[package]] @@ -869,7 +869,7 @@ dependencies = [ "libredox", "log", "redox-ioctl", - "redox_syscall", + "redox_syscall 0.6.0", ] [[package]] @@ -967,7 +967,7 @@ dependencies = [ "log", "pcid", "redox_event", - "redox_syscall", + "redox_syscall 0.6.0", ] [[package]] @@ -980,9 +980,9 @@ dependencies = [ "libredox", "log", "pcid", - "redox-scheme 0.8.2", + "redox-scheme", "redox_event", - "redox_syscall", + "redox_syscall 0.6.0", "spin 0.9.8", ] @@ -1013,8 +1013,8 @@ dependencies = [ "libredox", "log", "orbclient", - "redox-scheme 0.8.2", - "redox_syscall", + "redox-scheme", + "redox_syscall 0.6.0", ] [[package]] @@ -1037,9 +1037,9 @@ dependencies = [ "libredox", "rand 0.8.5", "redox-rt", - "redox-scheme 0.8.2", + "redox-scheme", "redox_event", - "redox_syscall", + "redox_syscall 0.6.0", ] [[package]] @@ -1065,7 +1065,7 @@ dependencies = [ "libredox", "pcid", "redox_event", - "redox_syscall", + "redox_syscall 0.6.0", ] [[package]] @@ -1091,14 +1091,14 @@ source = "git+https://gitlab.redox-os.org/redox-os/liblibc.git?branch=redox-0.2# [[package]] name = "libredox" -version = "0.1.10" +version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "416f7e718bdb06000964960ffa43b4335ad4012ae8b99060261aa4a8088d5ccb" +checksum = "df15f6eac291ed1cf25865b1ee60399f57e7c227e7f51bdbd4c5270396a9ed50" dependencies = [ "bitflags 2.10.0", "ioslice", "libc", - "redox_syscall", + "redox_syscall 0.6.0", ] [[package]] @@ -1116,7 +1116,7 @@ dependencies = [ "driver-block", "libredox", "redox_event", - "redox_syscall", + "redox_syscall 0.6.0", ] [[package]] @@ -1140,8 +1140,8 @@ version = "0.1.0" dependencies = [ "daemon", "libredox", - "redox-scheme 0.8.2", - "redox_syscall", + "redox-scheme", + "redox_syscall 0.6.0", ] [[package]] @@ -1205,7 +1205,7 @@ dependencies = [ "partitionlib", "pcid", "redox_event", - "redox_syscall", + "redox_syscall 0.6.0", "smallvec 1.15.1", ] @@ -1287,7 +1287,7 @@ checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1" dependencies = [ "cfg-if 1.0.4", "libc", - "redox_syscall", + "redox_syscall 0.5.18", "smallvec 1.15.1", "windows-link", ] @@ -1331,8 +1331,8 @@ dependencies = [ "pci_types", "pico-args", "plain", - "redox-scheme 0.8.2", - "redox_syscall", + "redox-scheme", + "redox_syscall 0.6.0", "serde", ] @@ -1345,7 +1345,7 @@ dependencies = [ "log", "pcid", "pico-args", - "redox_syscall", + "redox_syscall 0.6.0", "serde", "toml 0.5.11", ] @@ -1425,9 +1425,9 @@ dependencies = [ "libredox", "log", "orbclient", - "redox-scheme 0.8.2", + "redox-scheme", "redox_event", - "redox_syscall", + "redox_syscall 0.6.0", ] [[package]] @@ -1436,9 +1436,9 @@ version = "0.1.0" dependencies = [ "daemon", "libredox", - "redox-scheme 0.8.2", + "redox-scheme", "redox_event", - "redox_syscall", + "redox_syscall 0.6.0", "redox_termios", ] @@ -1470,8 +1470,8 @@ dependencies = [ "daemon", "indexmap", "libredox", - "redox-scheme 0.8.2", - "redox_syscall", + "redox-scheme", + "redox_syscall 0.6.0", "slab", ] @@ -1558,8 +1558,8 @@ dependencies = [ "rand_chacha 0.2.2", "rand_core 0.5.1", "raw-cpuid", - "redox-scheme 0.8.2", - "redox_syscall", + "redox-scheme", + "redox_syscall 0.6.0", "sha2", ] @@ -1619,10 +1619,10 @@ dependencies = [ [[package]] name = "redox-ioctl" version = "0.1.0" -source = "git+https://gitlab.redox-os.org/redox-os/relibc.git#3ebd43b4ceb77bfee2a9c155993ec2fb5843ad6b" +source = "git+https://gitlab.redox-os.org/Ibuki.O/relibc.git?branch=replace-unlink-rmdir-with-unlinkat#daf01ee12975a5481d2c1302e19eab45013427f4" dependencies = [ "drm-sys", - "redox_syscall", + "redox_syscall 0.6.0", ] [[package]] @@ -1646,34 +1646,24 @@ dependencies = [ "generic-rt", "goblin", "plain", - "redox_syscall", + "redox_syscall 0.5.18", ] [[package]] name = "redox-scheme" -version = "0.4.0" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a28d292981c8f3338cb772b6024b08bcc597d0dd81020de17080a9a7b470ebb2" +checksum = "2cea2668a5932f878a4298a1d7f8950249bbbb77120fb263da252c589152f5ea" dependencies = [ "libredox", - "redox_syscall", -] - -[[package]] -name = "redox-scheme" -version = "0.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d54adf6001069dfc77e8e9f62dc62d4c9c1471fff65ca577ca140f0e9bdf4e10" -dependencies = [ - "libredox", - "redox_syscall", + "redox_syscall 0.6.0", ] [[package]] name = "redox_event" -version = "0.4.1" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69609faa5d5992247a4ef379917bb3e39be281405d6a0ccd4f942429400b956f" +checksum = "f8eafe403549fab08a0c0862769493ad992625bb5a694aae2df6901e7e4fd05a" dependencies = [ "bitflags 2.10.0", "libredox", @@ -1688,9 +1678,9 @@ dependencies = [ "libredox", "log", "redox-log", - "redox-scheme 0.8.2", + "redox-scheme", "redox_event", - "redox_syscall", + "redox_syscall 0.6.0", "smoltcp", ] @@ -1703,6 +1693,15 @@ dependencies = [ "bitflags 2.10.0", ] +[[package]] +name = "redox_syscall" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec96166dafa0886eb81fe1c0a388bece180fbef2135f97c1e2cf8302e74b43b5" +dependencies = [ + "bitflags 2.10.0", +] + [[package]] name = "redox_termios" version = "0.1.3" @@ -1718,7 +1717,7 @@ dependencies = [ "libredox", "qemu-exit", "redox_event", - "redox_syscall", + "redox_syscall 0.6.0", "redox_termios", ] @@ -1792,7 +1791,7 @@ dependencies = [ "log", "pcid", "redox_event", - "redox_syscall", + "redox_syscall 0.6.0", ] [[package]] @@ -1807,7 +1806,7 @@ dependencies = [ "log", "pcid", "redox_event", - "redox_syscall", + "redox_syscall 0.6.0", ] [[package]] @@ -1837,9 +1836,9 @@ dependencies = [ "daemon", "libredox", "log", - "redox-scheme 0.8.2", + "redox-scheme", "redox_event", - "redox_syscall", + "redox_syscall 0.6.0", "spin 0.9.8", ] @@ -2251,7 +2250,7 @@ dependencies = [ "inputd", "log", "orbclient", - "redox_syscall", + "redox_syscall 0.6.0", "rehid", "xhcid", ] @@ -2262,7 +2261,7 @@ version = "0.1.0" dependencies = [ "common", "log", - "redox_syscall", + "redox_syscall 0.6.0", "xhcid", ] @@ -2276,7 +2275,7 @@ dependencies = [ "libredox", "plain", "redox_event", - "redox_syscall", + "redox_syscall 0.6.0", "thiserror 1.0.69", "xhcid", ] @@ -2314,7 +2313,7 @@ dependencies = [ "orbclient", "pcid", "redox_event", - "redox_syscall", + "redox_syscall 0.6.0", ] [[package]] @@ -2342,7 +2341,7 @@ dependencies = [ "orbclient", "ransid", "redox_event", - "redox_syscall", + "redox_syscall 0.6.0", ] [[package]] @@ -2358,7 +2357,7 @@ dependencies = [ "log", "pcid", "redox_event", - "redox_syscall", + "redox_syscall 0.6.0", "spin 0.10.0", "static_assertions", "thiserror 1.0.69", @@ -2377,7 +2376,7 @@ dependencies = [ "log", "pcid", "redox_event", - "redox_syscall", + "redox_syscall 0.6.0", "static_assertions", "thiserror 1.0.69", ] @@ -2398,7 +2397,7 @@ dependencies = [ "orbclient", "pcid", "redox_event", - "redox_syscall", + "redox_syscall 0.6.0", "spin 0.9.8", "static_assertions", "virtio-core", @@ -2415,7 +2414,7 @@ dependencies = [ "libredox", "log", "pcid", - "redox_syscall", + "redox_syscall 0.6.0", "static_assertions", "virtio-core", ] @@ -2618,9 +2617,9 @@ dependencies = [ "log", "pcid", "plain", - "redox-scheme 0.8.2", + "redox-scheme", "redox_event", - "redox_syscall", + "redox_syscall 0.6.0", "regex", "serde", "serde_json", @@ -2655,6 +2654,6 @@ version = "0.1.0" dependencies = [ "daemon", "libredox", - "redox-scheme 0.8.2", - "redox_syscall", + "redox-scheme", + "redox_syscall 0.6.0", ] diff --git a/audiod/Cargo.toml b/audiod/Cargo.toml index add7b1fc28..70e3f038d4 100644 --- a/audiod/Cargo.toml +++ b/audiod/Cargo.toml @@ -6,9 +6,9 @@ edition = "2021" [dependencies] daemon = { path = "../daemon" } -redox_syscall = { version = "0.5", features = ["std"] } +redox_syscall = { version = "0.6", features = ["std"] } libc = "0.2" -libredox = { version = "0.1", features = ["mkns"] } -redox-scheme = "0.8.2" +libredox = { version = "0.1.10", features = ["mkns"] } +redox-scheme = "0.8.3" anyhow = "1.0.97" ioslice = "0.6.0" diff --git a/bootstrap/Cargo.lock b/bootstrap/Cargo.lock index 5c1c1771d1..0eb90899c6 100644 --- a/bootstrap/Cargo.lock +++ b/bootstrap/Cargo.lock @@ -40,7 +40,7 @@ checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" [[package]] name = "generic-rt" version = "0.1.0" -source = "git+https://gitlab.redox-os.org/redox-os/relibc.git#9db10bb0a9651b86012a0d58a3327df95a20a297" +source = "git+https://gitlab.redox-os.org/redox-os/relibc.git#a88ce5116a57cef347a87dbc1a4dd2949867110c" [[package]] name = "goblin" @@ -70,9 +70,9 @@ checksum = "2874a2af47a2325c2001a6e6fad9b16a53b802102b528163885171cf92b15976" [[package]] name = "libredox" -version = "0.1.10" +version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "416f7e718bdb06000964960ffa43b4335ad4012ae8b99060261aa4a8088d5ccb" +checksum = "df15f6eac291ed1cf25865b1ee60399f57e7c227e7f51bdbd4c5270396a9ed50" dependencies = [ "bitflags", "libc", @@ -143,20 +143,21 @@ checksum = "436d45c2b6a5b159d43da708e62b25be3a4a3d5550d654b72216ade4c4bfd717" [[package]] name = "redox-rt" version = "0.1.0" -source = "git+https://gitlab.redox-os.org/redox-os/relibc.git#9db10bb0a9651b86012a0d58a3327df95a20a297" +source = "git+https://gitlab.redox-os.org/redox-os/relibc.git#a88ce5116a57cef347a87dbc1a4dd2949867110c" dependencies = [ "bitflags", "generic-rt", "goblin", "plain", + "redox-path", "redox_syscall", ] [[package]] name = "redox-scheme" -version = "0.6.2" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c00025a04f76fdcf72c15f10c7a12d9f2fdde93e539be9a57d5d632c4158a9e" +checksum = "2cea2668a5932f878a4298a1d7f8950249bbbb77120fb263da252c589152f5ea" dependencies = [ "libredox", "redox_syscall", @@ -164,8 +165,9 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.5.18" -source = "git+https://gitlab.redox-os.org/redox-os/syscall.git?branch=master#15aa8e32ef0f3328dd9d48cc8ca02e148a362069" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec96166dafa0886eb81fe1c0a388bece180fbef2135f97c1e2cf8302e74b43b5" dependencies = [ "bitflags", ] diff --git a/bootstrap/Cargo.toml b/bootstrap/Cargo.toml index c7a17745f1..2ebbe71d5e 100644 --- a/bootstrap/Cargo.toml +++ b/bootstrap/Cargo.toml @@ -18,8 +18,8 @@ linked_list_allocator = "0.10" log = { version = "0.4", default-features = false } plain = "0.2" redox-initfs = { path = "../initfs", default-features = false } -redox_syscall = { version = "0.5.4", default-features = false } -redox-scheme = { version = "0.6", default-features = false } +redox_syscall = { version = "0.6.0", default-features = false } +redox-scheme = { version = "0.8.3", default-features = false } redox-path = "0.3.1" slab = { version = "0.4.9", default-features = false } arrayvec = { version = "0.7.6", default-features = false } @@ -33,6 +33,3 @@ lto = "fat" [profile.dev] panic = "abort" - -[patch.crates-io] -redox_syscall = { git = "https://gitlab.redox-os.org/redox-os/syscall.git", branch = "master" } diff --git a/bootstrap/src/exec.rs b/bootstrap/src/exec.rs index d1f7f473d7..f543344b14 100644 --- a/bootstrap/src/exec.rs +++ b/bootstrap/src/exec.rs @@ -2,7 +2,7 @@ use alloc::borrow::ToOwned; use alloc::vec::Vec; use syscall::flag::{O_CLOEXEC, O_RDONLY}; -use syscall::{Error, EINTR}; +use syscall::{EINTR, Error}; use redox_rt::proc::*; diff --git a/bootstrap/src/initfs.rs b/bootstrap/src/initfs.rs index 0fcfbe98dd..5a1c57d18a 100644 --- a/bootstrap/src/initfs.rs +++ b/bootstrap/src/initfs.rs @@ -6,12 +6,13 @@ use core::str; use alloc::string::String; use hashbrown::HashMap; -use redox_initfs::{types::Timespec, InitFs, Inode, InodeDir, InodeKind, InodeStruct}; +use redox_initfs::{InitFs, Inode, InodeDir, InodeKind, InodeStruct, types::Timespec}; use redox_path::canonicalize_to_standard; -use redox_scheme::{scheme::SchemeSync, CallerCtx, OpenResult, RequestKind}; +use redox_scheme::{CallerCtx, OpenResult, RequestKind, scheme::SchemeSync}; use redox_scheme::{SignalBehavior, Socket}; +use syscall::PAGE_SIZE; use syscall::data::Stat; use syscall::dirent::DirEntry; use syscall::dirent::DirentBuf; @@ -19,7 +20,6 @@ use syscall::dirent::DirentKind; use syscall::error::*; use syscall::flag::*; use syscall::schemev2::NewFdFlags; -use syscall::PAGE_SIZE; struct Handle { inode: Inode, @@ -397,3 +397,31 @@ pub unsafe extern "C" fn redox_open_v1(ptr: *const u8, len: usize, flags: usize) pub extern "C" fn redox_close_v1(fd: usize) -> isize { Error::mux(syscall::close(fd)) as isize } + +#[unsafe(no_mangle)] +pub unsafe extern "C" fn redox_sys_call_v0( + fd: usize, + payload: *mut u8, + payload_len: usize, + flags: usize, + metadata: *const u64, + metadata_len: usize, +) -> isize { + let flags = CallFlags::from_bits_retain(flags); + + let metadata = unsafe { core::slice::from_raw_parts(metadata, metadata_len) }; + + let result = if flags.contains(CallFlags::READ) { + let payload = unsafe { core::slice::from_raw_parts_mut(payload, payload_len) }; + if flags.contains(CallFlags::WRITE) { + syscall::call_rw(fd, payload, flags, metadata) + } else { + syscall::call_ro(fd, payload, flags, metadata) + } + } else { + let payload = unsafe { core::slice::from_raw_parts(payload, payload_len) }; + syscall::call_wo(fd, payload, flags, metadata) + }; + + Error::mux(result) as isize +} diff --git a/bootstrap/src/procmgr.rs b/bootstrap/src/procmgr.rs index 4b74a14aac..6635ab98ad 100644 --- a/bootstrap/src/procmgr.rs +++ b/bootstrap/src/procmgr.rs @@ -586,7 +586,7 @@ impl<'a> ProcScheme<'a> { match self.handles[req.id()] { ref mut st @ Handle::Init => { let mut fd_out = usize::MAX; - if let Err(e) = req.obtain_fd(socket, FobtainFdFlags::empty(), Err(&mut fd_out)) { + if let Err(e) = req.obtain_fd(socket, FobtainFdFlags::empty(), core::slice::from_mut(&mut fd_out)) { return Response::new(Err(e), req); }; let fd = FdGuard::new(fd_out); diff --git a/drivers/acpid/Cargo.toml b/drivers/acpid/Cargo.toml index c8b8307496..9c774fbfab 100644 --- a/drivers/acpid/Cargo.toml +++ b/drivers/acpid/Cargo.toml @@ -13,7 +13,7 @@ num-derive = "0.3" num-traits = "0.2" parking_lot = "0.12" plain = "0.2.3" -redox_syscall = "0.5.6" +redox_syscall = "0.6" redox_event = "0.4.1" rustc-hash = "1.1.0" thiserror = "1" @@ -23,6 +23,6 @@ amlserde = { path = "../amlserde" } common = { path = "../common" } daemon = { path = "../../daemon" } libredox = "0.1.3" -redox-scheme = "0.8.2" +redox-scheme = "0.8.3" arrayvec = "0.7.6" serde = { version = "1.0.228", features = ["derive"] } diff --git a/drivers/audio/ac97d/Cargo.toml b/drivers/audio/ac97d/Cargo.toml index e0c9f52c7c..8b8957a8e0 100644 --- a/drivers/audio/ac97d/Cargo.toml +++ b/drivers/audio/ac97d/Cargo.toml @@ -9,9 +9,9 @@ common = { path = "../../common" } libredox = "0.1.3" log = "0.4" redox_event = "0.4.1" -redox_syscall = "0.5" +redox_syscall = "0.6" spin = "0.9" daemon = { path = "../../../daemon" } pcid = { path = "../../pcid" } -redox-scheme = "0.8.2" +redox-scheme = "0.8.3" diff --git a/drivers/audio/ihdad/Cargo.toml b/drivers/audio/ihdad/Cargo.toml index fe95a59d2f..d8791c510c 100644 --- a/drivers/audio/ihdad/Cargo.toml +++ b/drivers/audio/ihdad/Cargo.toml @@ -8,10 +8,10 @@ bitflags = "2" libredox = "0.1.3" log = "0.4" redox_event = "0.4.1" -redox_syscall = "0.5" +redox_syscall = "0.6" spin = "0.9" common = { path = "../../common" } daemon = { path = "../../../daemon" } pcid = { path = "../../pcid" } -redox-scheme = "0.8.2" +redox-scheme = "0.8.3" diff --git a/drivers/audio/sb16d/Cargo.toml b/drivers/audio/sb16d/Cargo.toml index 269751122e..17e60eb9f4 100644 --- a/drivers/audio/sb16d/Cargo.toml +++ b/drivers/audio/sb16d/Cargo.toml @@ -10,6 +10,6 @@ libredox = "0.1.3" log = "0.4" daemon = { path = "../../../daemon" } redox_event = "0.4.1" -redox_syscall = "0.5" +redox_syscall = "0.6" spin = "0.9" -redox-scheme = "0.8.2" +redox-scheme = "0.8.3" diff --git a/drivers/common/Cargo.toml b/drivers/common/Cargo.toml index 8cea98c907..96c4551924 100644 --- a/drivers/common/Cargo.toml +++ b/drivers/common/Cargo.toml @@ -10,5 +10,5 @@ license = "MIT" [dependencies] libredox = "0.1.3" log = "0.4" -redox_syscall = { version = "0.5.10", features = ["std"] } +redox_syscall = { version = "0.6", features = ["std"] } redox-log = "0.1.2" diff --git a/drivers/graphics/bgad/Cargo.toml b/drivers/graphics/bgad/Cargo.toml index 25b4c127fd..2494f8fa4f 100644 --- a/drivers/graphics/bgad/Cargo.toml +++ b/drivers/graphics/bgad/Cargo.toml @@ -6,8 +6,8 @@ edition = "2021" [dependencies] orbclient = "0.3.47" log = "0.4" -redox-scheme = "0.8.2" -redox_syscall = "0.5" +redox-scheme = "0.8.3" +redox_syscall = "0.6" common = { path = "../../common" } daemon = { path = "../../../daemon" } diff --git a/drivers/graphics/driver-graphics/Cargo.toml b/drivers/graphics/driver-graphics/Cargo.toml index 553951225a..66ddfc54b5 100644 --- a/drivers/graphics/driver-graphics/Cargo.toml +++ b/drivers/graphics/driver-graphics/Cargo.toml @@ -6,8 +6,8 @@ edition = "2021" [dependencies] drm-sys = "0.8.0" log = "0.4" -redox-scheme = "0.8.2" -redox_syscall = "0.5" +redox-scheme = "0.8.3" +redox_syscall = "0.6" libredox = "0.1.3" common = { path = "../../common" } diff --git a/drivers/graphics/fbbootlogd/Cargo.toml b/drivers/graphics/fbbootlogd/Cargo.toml index 58629b6bef..44436d0f2c 100644 --- a/drivers/graphics/fbbootlogd/Cargo.toml +++ b/drivers/graphics/fbbootlogd/Cargo.toml @@ -7,8 +7,8 @@ edition = "2021" orbclient = "0.3.27" ransid = "0.4" redox_event = "0.4" -redox_syscall = "0.5" -redox-scheme = "0.8.2" +redox_syscall = "0.6" +redox-scheme = "0.8.3" console-draw = { path = "../console-draw" } daemon = { path = "../../../daemon" } diff --git a/drivers/graphics/fbcond/Cargo.toml b/drivers/graphics/fbcond/Cargo.toml index 5020e6a354..a0a206da8f 100644 --- a/drivers/graphics/fbcond/Cargo.toml +++ b/drivers/graphics/fbcond/Cargo.toml @@ -8,15 +8,15 @@ log = "0.4" orbclient = "0.3.27" ransid = "0.4" redox_event = "0.4" -redox_syscall = "0.5" -redox-scheme = "0.4" +redox_syscall = "0.6" +redox-scheme = "0.8.3" common = { path = "../../common" } console-draw = { path = "../console-draw" } daemon = { path = "../../../daemon" } graphics-ipc = { path = "../graphics-ipc" } inputd = { path = "../../inputd" } -libredox = "0.1.3" +libredox = "0.1.11" [features] default = [] diff --git a/drivers/graphics/fbcond/src/main.rs b/drivers/graphics/fbcond/src/main.rs index 1ecfd30403..e7e6764eae 100644 --- a/drivers/graphics/fbcond/src/main.rs +++ b/drivers/graphics/fbcond/src/main.rs @@ -2,9 +2,12 @@ use event::EventQueue; use inputd::ConsumerHandleEvent; use libredox::errno::{EAGAIN, EINTR}; use orbclient::Event; -use redox_scheme::{CallRequest, RequestKind, Response, SignalBehavior, Socket}; +use redox_scheme::{ + scheme::{Op, SchemeResponse, SchemeSync}, + CallerCtx, RequestKind, Response, SignalBehavior, Socket, +}; use std::env; -use syscall::EVENT_READ; +use syscall::{EOPNOTSUPP, EVENT_READ}; use crate::scheme::{FbconScheme, VtIndex}; @@ -28,7 +31,6 @@ fn daemon(daemon: daemon::Daemon) -> ! { common::output_level(), common::file_level(), ); - let mut event_queue = EventQueue::new().expect("fbcond: failed to create event queue"); // FIXME listen for resize events from inputd and handle them @@ -46,7 +48,7 @@ fn daemon(daemon: daemon::Daemon) -> ! { // This is not possible for now as fbcond needs to open new displays at runtime for graphics // driver handoff. In the future inputd may directly pass a handle to the display instead. - //libredox::call::setrens(0, 0).expect("fbcond: failed to enter null namespace"); + // libredox::call::setrens(0, 0).expect("fbcond: failed to enter null namespace"); daemon.ready(); @@ -74,51 +76,78 @@ fn daemon(daemon: daemon::Daemon) -> ! { fn handle_event( socket: &mut Socket, scheme: &mut FbconScheme, - blocked: &mut Vec, + blocked: &mut Vec<(Op, CallerCtx)>, event: VtIndex, ) { match event { - VtIndex::SCHEMA_SENTINEL => { - loop { - let request = match socket.next_request(SignalBehavior::Restart) { - Ok(Some(request)) => request, - Ok(None) => { - // Scheme likely got unmounted - std::process::exit(0); - } - Err(err) if err.errno == EAGAIN => break, - Err(err) => panic!("vesad: failed to read display scheme: {err}"), - }; - - match request.kind() { - RequestKind::Call(call_request) => { - if let Some(resp) = call_request.handle_scheme_block(scheme) { - socket - .write_response(resp, SignalBehavior::Restart) - .expect("fbcond: failed to write display scheme"); - } else { - blocked.push(call_request); - } - } - RequestKind::OnClose { id } => { - scheme.on_close(id); - } - RequestKind::Cancellation(cancellation_request) => { - if let Some(i) = blocked - .iter() - .position(|req| req.request().request_id() == cancellation_request.id) - { - let blocked_req = blocked.remove(i); - let resp = Response::new(&blocked_req, Err(syscall::Error::new(EINTR))); - socket - .write_response(resp, SignalBehavior::Restart) - .expect("vesad: failed to write display scheme"); - } - } - _ => {} + VtIndex::SCHEMA_SENTINEL => loop { + let request = match socket.next_request(SignalBehavior::Restart) { + Ok(Some(request)) => request, + Ok(None) => { + // Scheme likely got unmounted + std::process::exit(0); } + Err(err) if err.errno == EAGAIN => { + break; + } + Err(err) => panic!("fbcond: failed to read display scheme: {err}"), + }; + + match request.kind() { + RequestKind::Call(req) => { + let caller = req.caller(); + let mut op = match req.op() { + Ok(op) => op, + Err(req) => { + let _ = socket + .write_response( + Response::err(EOPNOTSUPP, req), + SignalBehavior::Restart, + ) + .expect("fbcond: failed to write responses to fbcon scheme"); + continue; + } + }; + match op.handle_sync_dont_consume(&caller, scheme) { + SchemeResponse::Opened(Err(e)) | SchemeResponse::Regular(Err(e)) + if libredox::error::Error::from(e).is_wouldblock() + && !op.is_explicitly_nonblock() => + { + blocked.push((op, caller)); + } + SchemeResponse::Regular(r) => { + let _ = socket + .write_response(Response::new(r, op), SignalBehavior::Restart) + .expect("fbcond: failed to write responses to fbcon scheme"); + } + SchemeResponse::Opened(o) => { + let _ = socket + .write_response( + Response::open_dup_like(o, op), + SignalBehavior::Restart, + ) + .expect("fbcond: failed to write responses to fbcon scheme"); + } + }; + } + RequestKind::OnClose { id } => { + scheme.on_close(id); + } + RequestKind::Cancellation(cancellation_request) => { + if let Some(i) = blocked + .iter() + .position(|(op, caller)| caller.id == cancellation_request.id) + { + let (blocked_req, _) = blocked.remove(i); + let resp = Response::err(EINTR, blocked_req); + socket + .write_response(resp, SignalBehavior::Restart) + .expect("vesad: failed to write display scheme"); + } + } + _ => {} } - } + }, vt_i => { let vt = scheme.vts.get_mut(&vt_i).unwrap(); @@ -131,6 +160,7 @@ fn handle_event( .expect("fbcond: Error while reading events") { ConsumerHandleEvent::Events(&[]) => break, + ConsumerHandleEvent::Events(events) => { for event in events { vt.input(event) @@ -146,18 +176,37 @@ fn handle_event( { let mut i = 0; while i < blocked.len() { - if let Some(resp) = blocked[i].handle_scheme_block(scheme) { - socket - .write_response(resp, SignalBehavior::Restart) - .expect("vesad: failed to write display scheme"); - blocked.remove(i); - } else { - i += 1; - } + let (op, caller) = blocked + .get_mut(i) + .expect("vesad: Failed to get blocked request"); + let resp = match op.handle_sync_dont_consume(&caller, scheme) { + SchemeResponse::Opened(Err(e)) | SchemeResponse::Regular(Err(e)) + if libredox::error::Error::from(e).is_wouldblock() + && !op.is_explicitly_nonblock() => + { + i += 1; + continue; + } + SchemeResponse::Regular(r) => { + let (op, _) = blocked.remove(i); + Response::new(r, op) + } + SchemeResponse::Opened(o) => { + let (op, _) = blocked.remove(i); + Response::open_dup_like(o, op) + } + }; + let _ = socket + .write_response(resp, SignalBehavior::Restart) + .expect("vesad: failed to write display scheme"); } } for (handle_id, handle) in scheme.handles.iter_mut() { + let handle = match handle { + handle => handle, + }; + if !handle.events.contains(EVENT_READ) { continue; } @@ -170,8 +219,9 @@ fn handle_event( if can_read { if !handle.notified_read { handle.notified_read = true; + let response = Response::post_fevent(*handle_id, EVENT_READ.bits()); socket - .post_fevent(*handle_id, EVENT_READ.bits()) + .write_response(response, SignalBehavior::Restart) .expect("fbcond: failed to write display event"); } } else { diff --git a/drivers/graphics/fbcond/src/scheme.rs b/drivers/graphics/fbcond/src/scheme.rs index 76c17ff210..bdb4583783 100644 --- a/drivers/graphics/fbcond/src/scheme.rs +++ b/drivers/graphics/fbcond/src/scheme.rs @@ -2,8 +2,10 @@ use std::collections::BTreeMap; use std::os::fd::AsRawFd; use event::{EventQueue, UserData}; -use redox_scheme::SchemeBlock; -use syscall::{Error, EventFlags, Result, EBADF, ENOENT, O_NONBLOCK}; +use redox_scheme::scheme::SchemeSync; +use redox_scheme::{CallerCtx, OpenResult}; +use syscall::schemev2::NewFdFlags; +use syscall::{Error, EventFlags, Result, EACCES, EAGAIN, EBADF, ENOENT, O_NONBLOCK}; use crate::display::Display; use crate::text::TextScreen; @@ -25,7 +27,7 @@ impl UserData for VtIndex { } } -pub struct Handle { +pub struct FdHandle { pub vt_i: VtIndex, pub flags: usize, pub events: EventFlags, @@ -35,7 +37,7 @@ pub struct Handle { pub struct FbconScheme { pub vts: BTreeMap, next_id: usize, - pub handles: BTreeMap, + pub handles: BTreeMap, } impl FbconScheme { @@ -60,32 +62,36 @@ impl FbconScheme { handles: BTreeMap::new(), } } + + fn get_vt_handle_mut(&mut self, id: usize) -> Result<&mut FdHandle> { + match self.handles.get_mut(&id) { + Some(handle) => Ok(handle), + None => Err(Error::new(EBADF)), + } + } } -impl SchemeBlock for FbconScheme { - fn open( - &mut self, - path_str: &str, - flags: usize, - _uid: u32, - _gid: u32, - ) -> Result> { +impl SchemeSync for FbconScheme { + fn open(&mut self, path_str: &str, flags: usize, _ctx: &CallerCtx) -> Result { let vt_i = VtIndex(path_str.parse::().map_err(|_| Error::new(ENOENT))?); - if let Some(_console) = self.vts.get_mut(&vt_i) { + if self.vts.contains_key(&vt_i) { let id = self.next_id; self.next_id += 1; self.handles.insert( id, - Handle { + FdHandle { vt_i, - flags, + flags: flags, events: EventFlags::empty(), notified_read: false, }, ); - Ok(Some(id)) + Ok(OpenResult::ThisScheme { + number: id, + flags: NewFdFlags::empty(), + }) } else { Err(Error::new(ENOENT)) } @@ -95,20 +101,26 @@ impl SchemeBlock for FbconScheme { &mut self, id: usize, flags: syscall::EventFlags, - ) -> Result> { - let handle = self.handles.get_mut(&id).ok_or(Error::new(EBADF))?; + _ctx: &CallerCtx, + ) -> Result { + let handle = match self.handles.get_mut(&id) { + Some(handle) => Ok(handle), + None => Err(Error::new(EBADF)), + }?; handle.notified_read = false; - handle.events = flags; - Ok(Some(syscall::EventFlags::empty())) + + Ok(syscall::EventFlags::empty()) } - fn fpath(&mut self, id: usize, buf: &mut [u8]) -> Result> { - let handle = self.handles.get(&id).ok_or(Error::new(EBADF))?; + fn fpath(&mut self, id: usize, buf: &mut [u8], _ctx: &CallerCtx) -> Result { + let handle = match self.handles.get(&id) { + Some(handle) => Ok(handle), + None => Err(Error::new(EBADF)), + }?; let path_str = format!("fbcon:{}", handle.vt_i.0); - let path = path_str.as_bytes(); let mut i = 0; @@ -117,13 +129,21 @@ impl SchemeBlock for FbconScheme { i += 1; } - Ok(Some(i)) + Ok(i) } - fn fsync(&mut self, id: usize) -> Result> { - let _handle = self.handles.get(&id).ok_or(Error::new(EBADF))?; + fn fsync(&mut self, id: usize, _ctx: &CallerCtx) -> Result<()> { + match self.handles.get(&id) { + Some(_) => Ok(()), + None => Err(Error::new(EBADF)), + } + } - return Ok(Some(0)); + fn fcntl(&mut self, id: usize, cmd: usize, arg: usize, _ctx: &CallerCtx) -> Result { + if !self.handles.get(&id).is_some() { + return Err(Error::new(EBADF)); + }; + Ok(0) } fn read( @@ -132,18 +152,26 @@ impl SchemeBlock for FbconScheme { buf: &mut [u8], _offset: u64, _fcntl_flags: u32, - ) -> Result> { - let handle = self.handles.get(&id).ok_or(Error::new(EBADF))?; + _ctx: &CallerCtx, + ) -> Result { + let handle = match self.handles.get(&id) { + Some(handle) => Ok(handle), + None => Err(Error::new(EBADF)), + }?; if let Some(screen) = self.vts.get_mut(&handle.vt_i) { - if !screen.can_read() && handle.flags & O_NONBLOCK != O_NONBLOCK { - return Ok(None); + if !screen.can_read() { + if handle.flags & O_NONBLOCK != 0 { + Err(Error::new(EAGAIN)) + } else { + Err(Error::new(EAGAIN)) + } } else { - return screen.read(buf).map(Some); + screen.read(buf) } + } else { + Err(Error::new(EBADF)) } - - Err(Error::new(EBADF)) } fn write( @@ -152,19 +180,21 @@ impl SchemeBlock for FbconScheme { buf: &[u8], _offset: u64, _fcntl_flags: u32, - ) -> Result> { - let handle = self.handles.get(&id).ok_or(Error::new(EBADF))?; + _ctx: &CallerCtx, + ) -> Result { + let handle = match self.handles.get(&id) { + Some(handle) => Ok(handle), + None => Err(Error::new(EBADF)), + }?; if let Some(console) = self.vts.get_mut(&handle.vt_i) { - console.write(buf).map(Some) + console.write(buf) } else { Err(Error::new(EBADF)) } } -} -impl FbconScheme { - pub fn on_close(&mut self, id: usize) { - self.handles.remove(&id); + fn on_close(&mut self, id: usize) { + let _ = self.handles.remove(&id); } } diff --git a/drivers/graphics/graphics-ipc/Cargo.toml b/drivers/graphics/graphics-ipc/Cargo.toml index 0175a52c72..8abc977e04 100644 --- a/drivers/graphics/graphics-ipc/Cargo.toml +++ b/drivers/graphics/graphics-ipc/Cargo.toml @@ -6,7 +6,7 @@ edition = "2021" [dependencies] log = "0.4" libredox = "0.1.3" -redox_syscall = "0.5" -redox-ioctl = { git = "https://gitlab.redox-os.org/redox-os/relibc.git" } +redox-ioctl = { git = "https://gitlab.redox-os.org/Ibuki.O/relibc.git", branch = "replace-unlink-rmdir-with-unlinkat" } +redox_syscall = "0.6" common = { path = "../../common" } diff --git a/drivers/graphics/vesad/Cargo.toml b/drivers/graphics/vesad/Cargo.toml index 3449f3e289..c1cb39e253 100644 --- a/drivers/graphics/vesad/Cargo.toml +++ b/drivers/graphics/vesad/Cargo.toml @@ -6,7 +6,7 @@ edition = "2021" [dependencies] orbclient = "0.3.27" ransid = "0.4" -redox_syscall = "0.5" +redox_syscall = "0.6" redox_event = "0.4.1" common = { path = "../../common" } diff --git a/drivers/graphics/virtio-gpud/Cargo.toml b/drivers/graphics/virtio-gpud/Cargo.toml index 908436b28c..1559cf1f05 100644 --- a/drivers/graphics/virtio-gpud/Cargo.toml +++ b/drivers/graphics/virtio-gpud/Cargo.toml @@ -19,7 +19,7 @@ pcid = { path = "../../pcid" } inputd = { path = "../../inputd" } redox_event = "0.4.1" -redox_syscall = "0.5" +redox_syscall = "0.6" orbclient = "0.3.27" spin = "0.9.8" libredox = "0.1.3" diff --git a/drivers/input/ps2d/Cargo.toml b/drivers/input/ps2d/Cargo.toml index 7b2831736d..d1716b19b9 100644 --- a/drivers/input/ps2d/Cargo.toml +++ b/drivers/input/ps2d/Cargo.toml @@ -8,8 +8,8 @@ bitflags = "1" log = "0.4" orbclient = "0.3.27" redox_event = "0.4.1" -redox_syscall = "0.5.10" -redox-scheme = "0.8.2" +redox_syscall = "0.6" +redox-scheme = "0.8.3" libredox = "0.1.3" common = { path = "../../common" } diff --git a/drivers/input/usbhidd/Cargo.toml b/drivers/input/usbhidd/Cargo.toml index 0a98084810..0e0969f10d 100644 --- a/drivers/input/usbhidd/Cargo.toml +++ b/drivers/input/usbhidd/Cargo.toml @@ -11,7 +11,7 @@ license = "MIT" bitflags = "2" log = "0.4" orbclient = "0.3.47" -redox_syscall = "0.5" +redox_syscall = "0.6" rehid = { git = "https://gitlab.redox-os.org/redox-os/rehid.git" } xhcid = { path = "../../usb/xhcid" } diff --git a/drivers/inputd/Cargo.toml b/drivers/inputd/Cargo.toml index e1ccb14b04..1dd9f7bd2f 100644 --- a/drivers/inputd/Cargo.toml +++ b/drivers/inputd/Cargo.toml @@ -7,10 +7,10 @@ authors = ["Anhad Singh "] [dependencies] anyhow = "1.0.71" log = "0.4.19" -redox_syscall = { version = "0.5", features = ["std"] } +redox_syscall = { version = "0.6", features = ["std"] } orbclient = "0.3.27" libredox = "0.1.3" common = { path = "../common" } daemon = { path = "../../daemon" } -redox-scheme = "0.8.2" +redox-scheme = "0.8.3" diff --git a/drivers/net/alxd/Cargo.toml b/drivers/net/alxd/Cargo.toml index 91e185336d..95e96e2491 100644 --- a/drivers/net/alxd/Cargo.toml +++ b/drivers/net/alxd/Cargo.toml @@ -6,9 +6,9 @@ edition = "2018" [dependencies] bitflags = "2" redox_event = "0.4.1" -redox_syscall = "0.5" +redox_syscall = "0.6" common = { path = "../../common" } daemon = { path = "../../../daemon" } libredox = "0.1.3" -redox-scheme = "0.8.2" +redox-scheme = "0.8.3" diff --git a/drivers/net/driver-network/Cargo.toml b/drivers/net/driver-network/Cargo.toml index 0b942b282a..559b8e8e27 100644 --- a/drivers/net/driver-network/Cargo.toml +++ b/drivers/net/driver-network/Cargo.toml @@ -4,7 +4,7 @@ version = "0.1.0" edition = "2021" [dependencies] -libredox = "0.1.3" +libredox = "0.1.11" daemon = { path = "../../../daemon" } -redox-scheme = "0.4" -redox_syscall = { version = "0.5", features = ["std"] } +redox-scheme = "0.8.3" +redox_syscall = { version = "0.6", features = ["std"] } diff --git a/drivers/net/driver-network/src/lib.rs b/drivers/net/driver-network/src/lib.rs index 5771b82860..d2e3fc0b04 100644 --- a/drivers/net/driver-network/src/lib.rs +++ b/drivers/net/driver-network/src/lib.rs @@ -4,7 +4,8 @@ use std::{cmp, io}; use libredox::flag::O_NONBLOCK; use libredox::Fd; use redox_scheme::{ - CallRequest, CallerCtx, OpenResult, RequestKind, Response, SchemeBlock, SignalBehavior, Socket, + scheme::{IntoTag, Op, SchemeResponse, SchemeSync}, + CallerCtx, OpenResult, RequestKind, Response, SignalBehavior, Socket, }; use syscall::schemev2::NewFdFlags; use syscall::{ @@ -31,17 +32,18 @@ pub trait NetworkAdapter { } pub struct NetworkScheme { - adapter: T, - scheme_name: String, + scheme: NetworkSchemeInner, + blocked: Vec<(Op, CallerCtx)>, socket: Socket, - next_id: usize, - handles: BTreeMap, - blocked: Vec, } -enum Handle { - Data, - Mac, +fn post_fevent(socket: &Socket, id: usize, flags: usize) -> Result<()> { + let fevent_response = Response::post_fevent(id, flags); + match socket.write_response(fevent_response, SignalBehavior::Restart) { + Ok(true) => Ok(()), // Write response success + Ok(false) => Err(Error::new(syscall::EAGAIN)), // Write response failed, retry. + Err(err) => Err(err), // Error writing response + } } impl NetworkScheme { @@ -50,17 +52,14 @@ impl NetworkScheme { daemon: daemon::Daemon, scheme_name: String, ) -> Self { - assert!(scheme_name.starts_with("network")); let socket = Socket::nonblock(&scheme_name).expect("failed to create network scheme"); - daemon.ready(); let adapter = adapter_fn(); - NetworkScheme { - adapter, - scheme_name, + let scheme = NetworkSchemeInner::new(adapter, scheme_name.clone()); + daemon.ready(); + Self { + scheme, + blocked: Vec::new(), socket, - next_id: 0, - handles: BTreeMap::new(), - blocked: vec![], } } @@ -69,11 +68,11 @@ impl NetworkScheme { } pub fn adapter(&self) -> &T { - &self.adapter + &self.scheme.adapter } pub fn adapter_mut(&mut self) -> &mut T { - &mut self.adapter + &mut self.scheme.adapter } /// Process pending and new requests. @@ -88,13 +87,31 @@ impl NetworkScheme { // Handle any blocked requests let mut i = 0; while i < self.blocked.len() { - if let Some(resp) = self.blocked[i].handle_scheme_block(self) { - self.socket - .write_response(resp, SignalBehavior::Restart) - .expect("driver-network: failed to write scheme"); - self.blocked.remove(i); - } else { - i += 1; + let (op, caller) = &mut self.blocked[i]; + let res = op.handle_sync_dont_consume(caller, &mut self.scheme); + match res { + SchemeResponse::Opened(Err(Error { + errno: syscall::EWOULDBLOCK, + })) + | SchemeResponse::Regular(Err(Error { + errno: syscall::EWOULDBLOCK, + })) if !op.is_explicitly_nonblock() => { + i += 1; + } + SchemeResponse::Regular(r) => { + let (op, _) = self.blocked.remove(i); + let _ = self + .socket + .write_response(Response::new(r, op), SignalBehavior::Restart) + .expect("driver-network: failed to write scheme"); + } + SchemeResponse::Opened(o) => { + let (op, _) = self.blocked.remove(i); + let _ = self + .socket + .write_response(Response::open_dup_like(o, op), SignalBehavior::Restart) + .expect("driver-network: failed to write scheme"); + } } } @@ -110,38 +127,57 @@ impl NetworkScheme { Err(err) => return Err(err.into()), }; - match request.kind() { - RequestKind::Call(call_request) => { - if let Some(resp) = call_request.handle_scheme_block(self) { - self.socket.write_response(resp, SignalBehavior::Restart)?; - } else { - self.blocked.push(call_request); - } - } + let req = match request.kind() { + RequestKind::Call(c) => c, RequestKind::OnClose { id } => { - self.on_close(id); + self.scheme.on_close(id); + continue; } - RequestKind::Cancellation(cancellation_request) => { - if let Some(i) = self - .blocked - .iter() - .position(|req| req.request().request_id() == cancellation_request.id) - { - let blocked_req = self.blocked.remove(i); - let resp = Response::new(&blocked_req, Err(syscall::Error::new(EINTR))); + RequestKind::Cancellation(req) => { + if let Some(i) = self.blocked.iter().position(|q| q.0.req_id() == req.id) { + let (blocked_req, _) = self.blocked.remove(i); + let resp = Response::new(Err(Error::new(EINTR)), blocked_req); self.socket.write_response(resp, SignalBehavior::Restart)?; } + continue; } - _ => {} - } + _ => { + continue; + } + }; + let caller = req.caller(); + let mut op = match req.op() { + Ok(op) => op, + Err(req) => { + self.socket.write_response( + Response::err(syscall::EOPNOTSUPP, req), + SignalBehavior::Restart, + )?; + continue; + } + }; + + let resp = match op.handle_sync_dont_consume(&caller, &mut self.scheme) { + SchemeResponse::Opened(Err(Error { + errno: syscall::EWOULDBLOCK, + })) + | SchemeResponse::Regular(Err(Error { + errno: syscall::EWOULDBLOCK, + })) if !op.is_explicitly_nonblock() => { + self.blocked.push((op, caller)); + continue; + } + SchemeResponse::Regular(r) => Response::new(r, op), + SchemeResponse::Opened(o) => Response::open_dup_like(o, op), + }; + let _ = self.socket.write_response(resp, SignalBehavior::Restart)?; } // Notify readers about incoming events - let available_for_read = self.adapter.available_for_read(); + let available_for_read = self.scheme.adapter.available_for_read(); if available_for_read > 0 { - for &handle_id in self.handles.keys() { - self.socket - .post_fevent(handle_id, syscall::flag::EVENT_READ.bits())?; + for &handle_id in self.scheme.handles.keys() { + post_fevent(&self.socket, handle_id, syscall::flag::EVENT_READ.bits())?; } return Ok(()); } @@ -150,14 +186,32 @@ impl NetworkScheme { } } -impl SchemeBlock for NetworkScheme { - fn xopen( - &mut self, - path: &str, - _flags: usize, - caller_ctx: &CallerCtx, - ) -> Result> { - if caller_ctx.uid != 0 { +struct NetworkSchemeInner { + adapter: T, + scheme_name: String, + next_id: usize, + handles: BTreeMap, +} + +enum Handle { + Data, + Mac, +} + +impl NetworkSchemeInner { + pub fn new(adapter: T, scheme_name: String) -> Self { + Self { + adapter, + scheme_name, + next_id: 0, + handles: BTreeMap::new(), + } + } +} + +impl SchemeSync for NetworkSchemeInner { + fn open(&mut self, path: &str, _flags: usize, ctx: &CallerCtx) -> Result { + if ctx.uid != 0 { return Err(Error::new(EACCES)); } @@ -169,10 +223,10 @@ impl SchemeBlock for NetworkScheme { self.next_id += 1; self.handles.insert(self.next_id, handle); - Ok(Some(OpenResult::ThisScheme { + Ok(OpenResult::ThisScheme { number: self.next_id, flags, - })) + }) } fn read( @@ -181,7 +235,8 @@ impl SchemeBlock for NetworkScheme { buf: &mut [u8], offset: u64, fcntl_flags: u32, - ) -> Result> { + _ctx: &CallerCtx, + ) -> Result { let handle = self.handles.get_mut(&id).ok_or(Error::new(EBADF))?; match *handle { @@ -190,17 +245,17 @@ impl SchemeBlock for NetworkScheme { let data = &self.adapter.mac_address()[offset as usize..]; let i = cmp::min(buf.len(), data.len()); buf[..i].copy_from_slice(&data[..i]); - return Ok(Some(i)); + return Ok(i); } }; match self.adapter.read_packet(buf)? { - Some(count) => Ok(Some(count)), + Some(count) => Ok(count), None => { if fcntl_flags & O_NONBLOCK as u32 != 0 { - Err(Error::new(EWOULDBLOCK)) + Err(Error::new(EAGAIN)) } else { - Ok(None) + Err(Error::new(EWOULDBLOCK)) } } } @@ -212,7 +267,8 @@ impl SchemeBlock for NetworkScheme { buf: &[u8], _offset: u64, _fcntl_flags: u32, - ) -> Result> { + _ctx: &CallerCtx, + ) -> Result { let handle = self.handles.get(&id).ok_or(Error::new(EBADF))?; match handle { @@ -220,18 +276,24 @@ impl SchemeBlock for NetworkScheme { Handle::Mac { .. } => return Err(Error::new(EINVAL)), } - Ok(Some(self.adapter.write_packet(buf)?)) + Ok(self.adapter.write_packet(buf)?) } - fn fevent(&mut self, id: usize, _flags: EventFlags) -> Result> { + fn fevent(&mut self, id: usize, _flags: EventFlags, _ctx: &CallerCtx) -> Result { let _handle = self.handles.get(&id).ok_or(Error::new(EBADF))?; - Ok(Some(EventFlags::empty())) + Ok(EventFlags::empty()) } - fn fpath(&mut self, id: usize, buf: &mut [u8]) -> Result> { + fn fpath(&mut self, id: usize, buf: &mut [u8], _ctx: &CallerCtx) -> Result { let handle = self.handles.get(&id).ok_or(Error::new(EBADF))?; - let mut i = 0; + const PREFIX: &[u8] = b"/scheme/"; + let len = cmp::min(PREFIX.len(), buf.len()); + buf[..len].copy_from_slice(&PREFIX[..len]); + if len < PREFIX.len() { + return Ok(len); + } + let mut i = len; let scheme_name = self.scheme_name.as_bytes(); let mut j = 0; @@ -241,11 +303,6 @@ impl SchemeBlock for NetworkScheme { j += 1; } - if i < buf.len() { - buf[i] = b':'; - i += 1; - } - let path = match handle { Handle::Data { .. } => &b""[..], Handle::Mac { .. } => &b"mac"[..], @@ -258,10 +315,10 @@ impl SchemeBlock for NetworkScheme { j += 1; } - Ok(Some(i)) + Ok(i) } - fn fstat(&mut self, id: usize, stat: &mut Stat) -> Result> { + fn fstat(&mut self, id: usize, stat: &mut Stat, _ctx: &CallerCtx) -> Result<()> { let handle = self.handles.get(&id).ok_or(Error::new(EBADF))?; match handle { @@ -274,16 +331,14 @@ impl SchemeBlock for NetworkScheme { } } - Ok(Some(0)) + Ok(()) } - fn fsync(&mut self, id: usize) -> Result> { + fn fsync(&mut self, id: usize, _ctx: &CallerCtx) -> Result<()> { let _handle = self.handles.get(&id).ok_or(Error::new(EBADF))?; - Ok(Some(0)) + Ok(()) } -} -impl NetworkScheme { fn on_close(&mut self, id: usize) { self.handles.remove(&id); } diff --git a/drivers/net/e1000d/Cargo.toml b/drivers/net/e1000d/Cargo.toml index 3987b8ce2e..d2eb47da22 100644 --- a/drivers/net/e1000d/Cargo.toml +++ b/drivers/net/e1000d/Cargo.toml @@ -6,9 +6,9 @@ edition = "2018" [dependencies] bitflags = "2" log = "0.4" -libredox = "0.1.3" -redox_event = "0.4.1" -redox_syscall = "0.5" +libredox = "0.1.11" +redox_event = "0.4.2" +redox_syscall = "0.6" common = { path = "../../common" } daemon = { path = "../../../daemon" } diff --git a/drivers/net/ixgbed/Cargo.toml b/drivers/net/ixgbed/Cargo.toml index 87419bc57b..83bf1d4b27 100644 --- a/drivers/net/ixgbed/Cargo.toml +++ b/drivers/net/ixgbed/Cargo.toml @@ -5,9 +5,9 @@ edition = "2021" [dependencies] bitflags = "2" -libredox = "0.1.3" -redox_event = "0.4.1" -redox_syscall = "0.5" +libredox = "0.1.11" +redox_event = "0.4.2" +redox_syscall = "0.6" common = { path = "../../common" } daemon = { path = "../../../daemon" } diff --git a/drivers/net/rtl8139d/Cargo.toml b/drivers/net/rtl8139d/Cargo.toml index d7a6a411d1..b14f1acdfe 100644 --- a/drivers/net/rtl8139d/Cargo.toml +++ b/drivers/net/rtl8139d/Cargo.toml @@ -5,10 +5,10 @@ edition = "2018" [dependencies] bitflags = "2" -libredox = "0.1.3" +libredox = "0.1.11" log = "0.4" -redox_event = "0.4.1" -redox_syscall = "0.5" +redox_event = "0.4.2" +redox_syscall = "0.6" common = { path = "../../common" } daemon = { path = "../../../daemon" } diff --git a/drivers/net/rtl8168d/Cargo.toml b/drivers/net/rtl8168d/Cargo.toml index 29c8d1a2ff..01d5edb53d 100644 --- a/drivers/net/rtl8168d/Cargo.toml +++ b/drivers/net/rtl8168d/Cargo.toml @@ -5,10 +5,10 @@ edition = "2018" [dependencies] bitflags = "2" -libredox = "0.1.3" +libredox = "0.1.11" log = "0.4" -redox_event = "0.4.1" -redox_syscall = "0.5" +redox_event = "0.4.2" +redox_syscall = "0.6" common = { path = "../../common" } daemon = { path = "../../../daemon" } diff --git a/drivers/net/virtio-netd/Cargo.toml b/drivers/net/virtio-netd/Cargo.toml index 8acd46c8da..a2588e6de1 100644 --- a/drivers/net/virtio-netd/Cargo.toml +++ b/drivers/net/virtio-netd/Cargo.toml @@ -14,5 +14,5 @@ common = { path = "../../common" } daemon = { path = "../../../daemon" } driver-network = { path = "../driver-network" } -redox_syscall = "0.5" -libredox = "0.1.3" +redox_syscall = "0.6" +libredox = "0.1.11" diff --git a/drivers/pcid-spawner/Cargo.toml b/drivers/pcid-spawner/Cargo.toml index 77dd21063f..32f6856eb8 100644 --- a/drivers/pcid-spawner/Cargo.toml +++ b/drivers/pcid-spawner/Cargo.toml @@ -9,7 +9,7 @@ license = "MIT" anyhow = "1" log = "0.4" pico-args = "0.5" -redox_syscall = "0.5.9" +redox_syscall = "0.6" serde = { version = "1", features = ["derive"] } toml = "0.5" diff --git a/drivers/pcid/Cargo.toml b/drivers/pcid/Cargo.toml index a4d75f9431..aead23096e 100644 --- a/drivers/pcid/Cargo.toml +++ b/drivers/pcid/Cargo.toml @@ -19,8 +19,8 @@ log = "0.4" pci_types = "0.10" pico-args = { version = "0.5", features = ["combined-flags"] } plain = "0.2" -redox-scheme = "0.8.2" -redox_syscall = "0.5.9" +redox-scheme = "0.8.3" +redox_syscall = "0.6" serde = { version = "1", features = ["derive"] } common = { path = "../common" } diff --git a/drivers/redoxerd/Cargo.toml b/drivers/redoxerd/Cargo.toml index 878625912c..e9eb2599fb 100644 --- a/drivers/redoxerd/Cargo.toml +++ b/drivers/redoxerd/Cargo.toml @@ -8,7 +8,7 @@ edition = "2018" anyhow = "1.0" libredox = "0.1" redox_event = "0.4.1" -redox_syscall = "0.5" +redox_syscall = "0.6" redox_termios = "0.1" common = { path = "../common" } qemu-exit = "3.0.2" diff --git a/drivers/storage/ahcid/Cargo.toml b/drivers/storage/ahcid/Cargo.toml index 3191ac1aee..2ed160c342 100644 --- a/drivers/storage/ahcid/Cargo.toml +++ b/drivers/storage/ahcid/Cargo.toml @@ -7,7 +7,7 @@ edition = "2021" bitflags = "1.2" byteorder = "1.2" log = "0.4" -redox_syscall = { version = "0.5", features = ["std"] } +redox_syscall = { version = "0.6", features = ["std"] } common = { path = "../../common" } daemon = { path = "../../../daemon" } diff --git a/drivers/storage/bcm2835-sdhcid/Cargo.toml b/drivers/storage/bcm2835-sdhcid/Cargo.toml index 0c2c50cdd2..25db1243df 100644 --- a/drivers/storage/bcm2835-sdhcid/Cargo.toml +++ b/drivers/storage/bcm2835-sdhcid/Cargo.toml @@ -12,5 +12,5 @@ daemon = { path = "../../../daemon" } driver-block = { path = "../driver-block" } libredox = "0.1.3" -redox_syscall = { version = "0.5", features = ["std"] } +redox_syscall = { version = "0.6", features = ["std"] } redox_event = "0.4" diff --git a/drivers/storage/driver-block/Cargo.toml b/drivers/storage/driver-block/Cargo.toml index f74d302749..5a6c4a03d6 100644 --- a/drivers/storage/driver-block/Cargo.toml +++ b/drivers/storage/driver-block/Cargo.toml @@ -14,5 +14,5 @@ log = "0.4" # TODO: migrate virtio to our executor futures = { version = "0.3.28", features = ["executor"] } -redox_syscall = { version = "0.5", features = ["std"] } -redox-scheme = "0.8.2" +redox_syscall = { version = "0.6", features = ["std"] } +redox-scheme = "0.8.3" diff --git a/drivers/storage/ided/Cargo.toml b/drivers/storage/ided/Cargo.toml index 51a940455a..bd163e2348 100644 --- a/drivers/storage/ided/Cargo.toml +++ b/drivers/storage/ided/Cargo.toml @@ -10,5 +10,5 @@ libredox = "0.1.3" log = "0.4" pcid = { path = "../../pcid" } daemon = { path = "../../../daemon" } -redox_syscall = { version = "0.5", features = ["std"] } +redox_syscall = { version = "0.6", features = ["std"] } redox_event = "0.4" diff --git a/drivers/storage/lived/Cargo.toml b/drivers/storage/lived/Cargo.toml index 45a57cae51..4b89ba2748 100644 --- a/drivers/storage/lived/Cargo.toml +++ b/drivers/storage/lived/Cargo.toml @@ -11,6 +11,6 @@ license = "MIT" anyhow = "1" libredox = "0.1.3" daemon = { path = "../../../daemon" } -redox_syscall = { version = "0.5", features = ["std"] } +redox_syscall = { version = "0.6", features = ["std"] } redox_event = "0.4" driver-block = { path = "../driver-block" } diff --git a/drivers/storage/nvmed/Cargo.toml b/drivers/storage/nvmed/Cargo.toml index af9b786dc0..c874e053e4 100644 --- a/drivers/storage/nvmed/Cargo.toml +++ b/drivers/storage/nvmed/Cargo.toml @@ -11,7 +11,7 @@ libredox = "0.1.3" log = "0.4" parking_lot = "0.12.1" redox_event = "0.4.1" -redox_syscall = { version = "0.5", features = ["std"] } +redox_syscall = { version = "0.6", features = ["std"] } smallvec = "1" executor = { path = "../../executor" } diff --git a/drivers/storage/usbscsid/Cargo.toml b/drivers/storage/usbscsid/Cargo.toml index 5acc053c32..9d01dc8d74 100644 --- a/drivers/storage/usbscsid/Cargo.toml +++ b/drivers/storage/usbscsid/Cargo.toml @@ -14,6 +14,6 @@ plain = "0.2" driver-block = { path = "../driver-block" } daemon = { path = "../../../daemon" } redox_event = "0.4" -redox_syscall = { version = "0.5", features = ["std"] } +redox_syscall = { version = "0.6", features = ["std"] } thiserror = "1" xhcid = { path = "../../usb/xhcid" } diff --git a/drivers/storage/virtio-blkd/Cargo.toml b/drivers/storage/virtio-blkd/Cargo.toml index f479db06eb..282844f65a 100644 --- a/drivers/storage/virtio-blkd/Cargo.toml +++ b/drivers/storage/virtio-blkd/Cargo.toml @@ -13,7 +13,7 @@ futures = { version = "0.3.28", features = ["executor"] } spin = "*" redox_event = "0.4" -redox_syscall = { version = "0.5", features = ["std"] } +redox_syscall = { version = "0.6", features = ["std"] } common = { path = "../../common" } daemon = { path = "../../../daemon" } diff --git a/drivers/usb/usbhubd/Cargo.toml b/drivers/usb/usbhubd/Cargo.toml index 8534ebb2a1..bd3d0a5aa4 100644 --- a/drivers/usb/usbhubd/Cargo.toml +++ b/drivers/usb/usbhubd/Cargo.toml @@ -8,7 +8,7 @@ license = "MIT" [dependencies] log = "0.4" -redox_syscall = "0.5" +redox_syscall = "0.6" xhcid = { path = "../xhcid" } common = { path = "../../common" } diff --git a/drivers/usb/xhcid/Cargo.toml b/drivers/usb/xhcid/Cargo.toml index 435aab952e..722a6435ae 100644 --- a/drivers/usb/xhcid/Cargo.toml +++ b/drivers/usb/xhcid/Cargo.toml @@ -20,8 +20,8 @@ plain = "0.2" lazy_static = "1.4" log = "0.4" redox_event = "0.4.1" -redox-scheme = "0.8.2" -redox_syscall = "0.5" +redox-scheme = "0.8.3" +redox_syscall = "0.6" serde = { version = "1", features = ["derive"] } serde_json = "1" smallvec = { version = "1", features = ["serde"] } diff --git a/drivers/vboxd/Cargo.toml b/drivers/vboxd/Cargo.toml index 55da21d060..639eccbd5f 100644 --- a/drivers/vboxd/Cargo.toml +++ b/drivers/vboxd/Cargo.toml @@ -7,7 +7,7 @@ edition = "2018" libredox = "0.1.3" orbclient = "0.3.47" redox_event = "0.4.1" -redox_syscall = "0.5" +redox_syscall = "0.6" common = { path = "../common" } daemon = { path = "../../daemon" } diff --git a/drivers/virtio-core/Cargo.toml b/drivers/virtio-core/Cargo.toml index 4a5630b53a..09a623d042 100644 --- a/drivers/virtio-core/Cargo.toml +++ b/drivers/virtio-core/Cargo.toml @@ -7,7 +7,7 @@ authors = ["Anhad Singh "] [dependencies] static_assertions = "1.1.0" bitflags = "2.3.2" -redox_syscall = "0.5" +redox_syscall = "0.6" libredox = "0.1.3" log = "0.4" thiserror = "1.0.40" diff --git a/ipcd/Cargo.toml b/ipcd/Cargo.toml index 53586a144a..6c9b61bff6 100644 --- a/ipcd/Cargo.toml +++ b/ipcd/Cargo.toml @@ -6,8 +6,8 @@ version = "0.1.0" [dependencies] libredox = { version = "0.1.8", features = ["call"]} daemon = { path = "../daemon" } -redox_syscall = "0.5.17" -redox-scheme = "0.8.0" +redox_syscall = "0.6" +redox-scheme = "0.8.3" redox_event = "0.4.0" anyhow = "1.0.97" libc = "0.2" diff --git a/ipcd/src/shm.rs b/ipcd/src/shm.rs index c31e27966d..e0983a2d4f 100644 --- a/ipcd/src/shm.rs +++ b/ipcd/src/shm.rs @@ -6,9 +6,25 @@ use std::{ }; use syscall::{ data::Stat, error::*, schemev2::NewFdFlags, Error, Map, MapFlags, Result, MAP_PRIVATE, - MAP_SHARED, PAGE_SIZE, PROT_READ, PROT_WRITE, + PAGE_SIZE, PROT_READ, PROT_WRITE, }; +enum Handle { + Shm(Rc), + SchemeRoot, +} +impl Handle { + fn as_shm(&self) -> Option<&Rc> { + match self { + Self::Shm(path) => Some(path), + Self::SchemeRoot => None, + } + } +} + +// TODO: Move to relibc +const AT_REMOVEDIR: usize = 0x200; + #[derive(Default)] pub struct ShmHandle { buffer: Option, @@ -17,7 +33,7 @@ pub struct ShmHandle { } pub struct ShmScheme { maps: HashMap, ShmHandle>, - handles: HashMap>, + handles: HashMap, next_id: usize, } impl ShmScheme { @@ -33,6 +49,17 @@ impl ShmScheme { impl SchemeSync for ShmScheme { //FIXME: Handle O_RDONLY/O_WRONLY/O_RDWR fn open(&mut self, path: &str, flags: usize, _ctx: &CallerCtx) -> Result { + if path.is_empty() { + let id = self.next_id; + self.next_id += 1; + + self.handles.insert(id, Handle::SchemeRoot); + + return Ok(OpenResult::ThisScheme { + number: id, + flags: NewFdFlags::empty(), + }); + } let path = Rc::from(path); let entry = match self.maps.entry(Rc::clone(&path)) { Entry::Occupied(e) => { @@ -49,7 +76,7 @@ impl SchemeSync for ShmScheme { } }; entry.refs += 1; - self.handles.insert(self.next_id, path); + self.handles.insert(self.next_id, Handle::Shm(path)); let id = self.next_id; self.next_id += 1; @@ -68,14 +95,20 @@ impl SchemeSync for ShmScheme { } // Write path - let path = self.handles.get(&id).ok_or(Error::new(EBADF))?; + let path = self + .handles + .get(&id) + .and_then(Handle::as_shm) + .ok_or(Error::new(EBADF))?; let len = cmp::min(path.len(), buf.len() - PREFIX.len()); buf[PREFIX.len()..][..len].copy_from_slice(&path.as_bytes()[..len]); Ok(PREFIX.len() + len) } fn on_close(&mut self, id: usize) { - let path = self.handles.remove(&id).unwrap(); + let Handle::Shm(path) = self.handles.remove(&id).unwrap() else { + return; + }; let mut entry = match self.maps.entry(path) { Entry::Occupied(entry) => entry, Entry::Vacant(_) => panic!("handle pointing to nothing"), @@ -86,7 +119,14 @@ impl SchemeSync for ShmScheme { entry.remove_entry(); } } - fn unlink(&mut self, path: &str, ctx: &CallerCtx) -> Result<()> { + fn unlinkat(&mut self, dirfd: usize, path: &str, flags: usize, _ctx: &CallerCtx) -> Result<()> { + let handle = self.handles.get(&dirfd).ok_or(Error::new(EBADF))?; + if !matches!(handle, Handle::SchemeRoot) { + return Err(Error::new(EACCES)); + } + if flags & AT_REMOVEDIR == AT_REMOVEDIR { + return Err(Error::new(ENOTDIR)); + } let path = Rc::from(path); let mut entry = match self.maps.entry(Rc::clone(&path)) { Entry::Occupied(e) => e, @@ -101,7 +141,11 @@ impl SchemeSync for ShmScheme { Ok(()) } fn fstat(&mut self, id: usize, stat: &mut Stat, _ctx: &CallerCtx) -> Result<()> { - let path = self.handles.get(&id).ok_or(Error::new(EBADF))?; + let path = self + .handles + .get(&id) + .and_then(Handle::as_shm) + .ok_or(Error::new(EBADF))?; let size = match self .maps .get(path) @@ -122,7 +166,11 @@ impl SchemeSync for ShmScheme { Ok(()) } fn ftruncate(&mut self, id: usize, len: u64, _ctx: &CallerCtx) -> Result<()> { - let path = self.handles.get(&id).ok_or(Error::new(EBADF))?; + let path = self + .handles + .get(&id) + .and_then(Handle::as_shm) + .ok_or(Error::new(EBADF))?; match self .maps .get_mut(path) @@ -135,7 +183,7 @@ impl SchemeSync for ShmScheme { Err(Error::new(EIO)) } ref mut buf @ None => { - *buf = Some(MmapGuard::alloc((len as usize))?); + *buf = Some(MmapGuard::alloc(len as usize)?); Ok(()) } } @@ -148,7 +196,11 @@ impl SchemeSync for ShmScheme { _flags: MapFlags, _ctx: &CallerCtx, ) -> Result { - let path = self.handles.get(&id).ok_or(Error::new(EBADF))?; + let path = self + .handles + .get(&id) + .and_then(Handle::as_shm) + .ok_or(Error::new(EBADF))?; let total_size = offset as usize + size; match self .maps @@ -174,10 +226,14 @@ impl SchemeSync for ShmScheme { id: usize, buf: &mut [u8], offset: u64, - fcntl_flags: u32, - ctx: &CallerCtx, + _fcntl_flags: u32, + _ctx: &CallerCtx, ) -> Result { - let path = self.handles.get(&id).ok_or(Error::new(EBADF))?; + let path = self + .handles + .get(&id) + .and_then(Handle::as_shm) + .ok_or(Error::new(EBADF))?; match self .maps .get_mut(path) @@ -193,10 +249,14 @@ impl SchemeSync for ShmScheme { id: usize, buf: &[u8], offset: u64, - fcntl_flags: u32, - ctx: &CallerCtx, + _fcntl_flags: u32, + _ctx: &CallerCtx, ) -> Result { - let path = self.handles.get(&id).ok_or(Error::new(EBADF))?; + let path = self + .handles + .get(&id) + .and_then(Handle::as_shm) + .ok_or(Error::new(EBADF))?; match self .maps .get_mut(path) diff --git a/logd/Cargo.toml b/logd/Cargo.toml index 08d754da44..bb8c7db3eb 100644 --- a/logd/Cargo.toml +++ b/logd/Cargo.toml @@ -5,7 +5,7 @@ authors = ["Jeremy Soller "] edition = "2021" [dependencies] -redox_syscall = "0.5" +redox_syscall = "0.6" daemon = { path = "../daemon" } libredox = "0.1.3" -redox-scheme = "0.8.2" +redox-scheme = "0.8.3" diff --git a/netstack/Cargo.toml b/netstack/Cargo.toml index 29321b230a..24a1a367ee 100644 --- a/netstack/Cargo.toml +++ b/netstack/Cargo.toml @@ -10,11 +10,11 @@ path = "src/main.rs" [dependencies] redox_event = "0.4.1" daemon = { path = "../daemon" } -redox_syscall = { version = "0.5", features = ["std"] } +redox_syscall = { version = "0.6", features = ["std"] } redox-log = "0.1" libredox = { version = "0.1.3", features = ["mkns"] } anyhow = "1.0.81" -redox-scheme = "0.8" +redox-scheme = "0.8.3" [dependencies.log] version = "0.4" diff --git a/ptyd/Cargo.toml b/ptyd/Cargo.toml index 91348d0793..782318855c 100644 --- a/ptyd/Cargo.toml +++ b/ptyd/Cargo.toml @@ -6,7 +6,7 @@ edition = "2021" [dependencies] libredox = "0.1.3" daemon = { path = "../daemon" } -redox-scheme = "0.8.2" +redox-scheme = "0.8.3" redox_event = "0.4.0" -redox_syscall = "0.5.0" +redox_syscall = "0.6" redox_termios = "0.1.3" diff --git a/ramfs/Cargo.toml b/ramfs/Cargo.toml index 9e31f95db5..c715732482 100644 --- a/ramfs/Cargo.toml +++ b/ramfs/Cargo.toml @@ -10,8 +10,8 @@ description = "In-memory filesystem for Redox, which is useful for early logging [dependencies] daemon = { path = "../daemon" } -redox_syscall = "0.5.10" -redox-scheme = "0.8.2" -libredox = "0.1.3" +redox_syscall = "0.6.0" +redox-scheme = "0.8.3" +libredox = { version = "0.1.11", features = ["call"] } indexmap = "2.5.0" slab = "0.4.9" diff --git a/ramfs/src/scheme.rs b/ramfs/src/scheme.rs index 78cac0a766..f569380dda 100644 --- a/ramfs/src/scheme.rs +++ b/ramfs/src/scheme.rs @@ -239,11 +239,18 @@ impl SchemeSync for Scheme { flags: NewFdFlags::POSITIONED, }) } - fn rmdir(&mut self, path: &str, ctx: &CallerCtx) -> Result<()> { - self.remove_dentry(path, ctx.uid, ctx.gid, true) - } - fn unlink(&mut self, path: &str, ctx: &CallerCtx) -> Result<()> { - self.remove_dentry(path, ctx.uid, ctx.gid, false) + fn unlinkat(&mut self, dirfd: usize, path: &str, flags: usize, ctx: &CallerCtx) -> Result<()> { + let _ = self + .filesystem + .files + .get_mut(&dirfd) + .ok_or(Error::new(EBADFD))?; + self.remove_dentry( + path, + ctx.uid, + ctx.gid, + flags & syscall::AT_REMOVEDIR == syscall::AT_REMOVEDIR, + ) } fn read( &mut self, diff --git a/randd/Cargo.toml b/randd/Cargo.toml index aecd92388a..52327b0edd 100644 --- a/randd/Cargo.toml +++ b/randd/Cargo.toml @@ -7,10 +7,10 @@ edition = "2021" rand_chacha = "0.2" rand_core = "0.5" daemon = { path = "../daemon" } -redox_syscall = "0.5" +redox_syscall = "0.6" libredox = "0.1.3" sha2 = "0.8" -redox-scheme = "0.8.2" +redox-scheme = "0.8.3" [target.'cfg(target_arch = "x86_64")'.dependencies] raw-cpuid = "11.0.1" diff --git a/zerod/Cargo.toml b/zerod/Cargo.toml index 94f8780326..d0ab36dd72 100644 --- a/zerod/Cargo.toml +++ b/zerod/Cargo.toml @@ -5,7 +5,7 @@ authors = ["Alex Lyon "] edition = "2021" [dependencies] -redox_syscall = "0.5" -redox-scheme = "0.8.2" +redox_syscall = "0.6" +redox-scheme = "0.8.3" daemon = { path = "../daemon" } libredox = "0.1.3"