Merge branch 'ramfs-unlinkat' into 'main'

refactor: Replace unlink and rmdir with unlinkat in ramfs. Update redox-scheme and redox-rt for bootstrap.

See merge request redox-os/base!65
This commit is contained in:
Jeremy Soller
2025-12-17 18:46:06 -07:00
56 changed files with 615 additions and 387 deletions
Generated
+89 -90
View File
@@ -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",
]
+3 -3
View File
@@ -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"
+10 -8
View File
@@ -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",
]
+2 -5
View File
@@ -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" }
+1 -1
View File
@@ -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::*;
+31 -3
View File
@@ -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
}
+1 -1
View File
@@ -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);
+2 -2
View File
@@ -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"] }
+2 -2
View File
@@ -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"
+2 -2
View File
@@ -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"
+2 -2
View File
@@ -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"
+1 -1
View File
@@ -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"
+2 -2
View File
@@ -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" }
+2 -2
View File
@@ -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" }
+2 -2
View File
@@ -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" }
+3 -3
View File
@@ -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 = []
+103 -53
View File
@@ -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<CallRequest>,
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 {
+71 -41
View File
@@ -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<VtIndex, TextScreen>,
next_id: usize,
pub handles: BTreeMap<usize, Handle>,
pub handles: BTreeMap<usize, FdHandle>,
}
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<Option<usize>> {
impl SchemeSync for FbconScheme {
fn open(&mut self, path_str: &str, flags: usize, _ctx: &CallerCtx) -> Result<OpenResult> {
let vt_i = VtIndex(path_str.parse::<usize>().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<Option<syscall::EventFlags>> {
let handle = self.handles.get_mut(&id).ok_or(Error::new(EBADF))?;
_ctx: &CallerCtx,
) -> Result<syscall::EventFlags> {
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<Option<usize>> {
let handle = self.handles.get(&id).ok_or(Error::new(EBADF))?;
fn fpath(&mut self, id: usize, buf: &mut [u8], _ctx: &CallerCtx) -> Result<usize> {
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<Option<usize>> {
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<usize> {
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<Option<usize>> {
let handle = self.handles.get(&id).ok_or(Error::new(EBADF))?;
_ctx: &CallerCtx,
) -> Result<usize> {
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<Option<usize>> {
let handle = self.handles.get(&id).ok_or(Error::new(EBADF))?;
_ctx: &CallerCtx,
) -> Result<usize> {
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);
}
}
+2 -2
View File
@@ -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" }
+1 -1
View File
@@ -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" }
+1 -1
View File
@@ -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"
+2 -2
View File
@@ -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" }
+1 -1
View File
@@ -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" }
+2 -2
View File
@@ -7,10 +7,10 @@ authors = ["Anhad Singh <andypython@protonmail.com>"]
[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"
+2 -2
View File
@@ -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"
+3 -3
View File
@@ -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"] }
+137 -82
View File
@@ -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<T: NetworkAdapter> {
adapter: T,
scheme_name: String,
scheme: NetworkSchemeInner<T>,
blocked: Vec<(Op, CallerCtx)>,
socket: Socket,
next_id: usize,
handles: BTreeMap<usize, Handle>,
blocked: Vec<CallRequest>,
}
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<T: NetworkAdapter> NetworkScheme<T> {
@@ -50,17 +52,14 @@ impl<T: NetworkAdapter> NetworkScheme<T> {
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<T: NetworkAdapter> NetworkScheme<T> {
}
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<T: NetworkAdapter> NetworkScheme<T> {
// 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<T: NetworkAdapter> NetworkScheme<T> {
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<T: NetworkAdapter> NetworkScheme<T> {
}
}
impl<T: NetworkAdapter> SchemeBlock for NetworkScheme<T> {
fn xopen(
&mut self,
path: &str,
_flags: usize,
caller_ctx: &CallerCtx,
) -> Result<Option<OpenResult>> {
if caller_ctx.uid != 0 {
struct NetworkSchemeInner<T: NetworkAdapter> {
adapter: T,
scheme_name: String,
next_id: usize,
handles: BTreeMap<usize, Handle>,
}
enum Handle {
Data,
Mac,
}
impl<T: NetworkAdapter> NetworkSchemeInner<T> {
pub fn new(adapter: T, scheme_name: String) -> Self {
Self {
adapter,
scheme_name,
next_id: 0,
handles: BTreeMap::new(),
}
}
}
impl<T: NetworkAdapter> SchemeSync for NetworkSchemeInner<T> {
fn open(&mut self, path: &str, _flags: usize, ctx: &CallerCtx) -> Result<OpenResult> {
if ctx.uid != 0 {
return Err(Error::new(EACCES));
}
@@ -169,10 +223,10 @@ impl<T: NetworkAdapter> SchemeBlock for NetworkScheme<T> {
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<T: NetworkAdapter> SchemeBlock for NetworkScheme<T> {
buf: &mut [u8],
offset: u64,
fcntl_flags: u32,
) -> Result<Option<usize>> {
_ctx: &CallerCtx,
) -> Result<usize> {
let handle = self.handles.get_mut(&id).ok_or(Error::new(EBADF))?;
match *handle {
@@ -190,17 +245,17 @@ impl<T: NetworkAdapter> SchemeBlock for NetworkScheme<T> {
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<T: NetworkAdapter> SchemeBlock for NetworkScheme<T> {
buf: &[u8],
_offset: u64,
_fcntl_flags: u32,
) -> Result<Option<usize>> {
_ctx: &CallerCtx,
) -> Result<usize> {
let handle = self.handles.get(&id).ok_or(Error::new(EBADF))?;
match handle {
@@ -220,18 +276,24 @@ impl<T: NetworkAdapter> SchemeBlock for NetworkScheme<T> {
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<Option<EventFlags>> {
fn fevent(&mut self, id: usize, _flags: EventFlags, _ctx: &CallerCtx) -> Result<EventFlags> {
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<Option<usize>> {
fn fpath(&mut self, id: usize, buf: &mut [u8], _ctx: &CallerCtx) -> Result<usize> {
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<T: NetworkAdapter> SchemeBlock for NetworkScheme<T> {
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<T: NetworkAdapter> SchemeBlock for NetworkScheme<T> {
j += 1;
}
Ok(Some(i))
Ok(i)
}
fn fstat(&mut self, id: usize, stat: &mut Stat) -> Result<Option<usize>> {
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<T: NetworkAdapter> SchemeBlock for NetworkScheme<T> {
}
}
Ok(Some(0))
Ok(())
}
fn fsync(&mut self, id: usize) -> Result<Option<usize>> {
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<T: NetworkAdapter> NetworkScheme<T> {
fn on_close(&mut self, id: usize) {
self.handles.remove(&id);
}
+3 -3
View File
@@ -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" }
+3 -3
View File
@@ -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" }
+3 -3
View File
@@ -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" }
+3 -3
View File
@@ -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" }
+2 -2
View File
@@ -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"
+1 -1
View File
@@ -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"
+2 -2
View File
@@ -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" }
+1 -1
View File
@@ -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"
+1 -1
View File
@@ -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" }
+1 -1
View File
@@ -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"
+2 -2
View File
@@ -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"
+1 -1
View File
@@ -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"
+1 -1
View File
@@ -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" }
+1 -1
View File
@@ -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" }
+1 -1
View File
@@ -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" }
+1 -1
View File
@@ -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" }
+1 -1
View File
@@ -8,7 +8,7 @@ license = "MIT"
[dependencies]
log = "0.4"
redox_syscall = "0.5"
redox_syscall = "0.6"
xhcid = { path = "../xhcid" }
common = { path = "../../common" }
+2 -2
View File
@@ -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"] }
+1 -1
View File
@@ -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" }
+1 -1
View File
@@ -7,7 +7,7 @@ authors = ["Anhad Singh <andypython@protonmail.com>"]
[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"
+2 -2
View File
@@ -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"
+76 -16
View File
@@ -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<str>),
SchemeRoot,
}
impl Handle {
fn as_shm(&self) -> Option<&Rc<str>> {
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<MmapGuard>,
@@ -17,7 +33,7 @@ pub struct ShmHandle {
}
pub struct ShmScheme {
maps: HashMap<Rc<str>, ShmHandle>,
handles: HashMap<usize, Rc<str>>,
handles: HashMap<usize, Handle>,
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<OpenResult> {
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<usize> {
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<usize> {
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<usize> {
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)
+2 -2
View File
@@ -5,7 +5,7 @@ authors = ["Jeremy Soller <jackpot51@gmail.com>"]
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"
+2 -2
View File
@@ -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"
+2 -2
View File
@@ -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"
+3 -3
View File
@@ -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"
+12 -5
View File
@@ -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,
+2 -2
View File
@@ -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"
+2 -2
View File
@@ -5,7 +5,7 @@ authors = ["Alex Lyon <arcterus@mail.com>"]
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"