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:
Generated
+89
-90
@@ -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
@@ -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"
|
||||
|
||||
Generated
+10
-8
@@ -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",
|
||||
]
|
||||
|
||||
@@ -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" }
|
||||
|
||||
@@ -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
@@ -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
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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"] }
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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" }
|
||||
|
||||
@@ -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" }
|
||||
|
||||
@@ -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" }
|
||||
|
||||
@@ -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 = []
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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" }
|
||||
|
||||
@@ -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" }
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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" }
|
||||
|
||||
@@ -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" }
|
||||
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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"] }
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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" }
|
||||
|
||||
@@ -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" }
|
||||
|
||||
@@ -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" }
|
||||
|
||||
@@ -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" }
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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"
|
||||
|
||||
|
||||
@@ -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" }
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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" }
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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" }
|
||||
|
||||
@@ -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" }
|
||||
|
||||
@@ -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" }
|
||||
|
||||
@@ -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" }
|
||||
|
||||
@@ -8,7 +8,7 @@ license = "MIT"
|
||||
|
||||
[dependencies]
|
||||
log = "0.4"
|
||||
redox_syscall = "0.5"
|
||||
redox_syscall = "0.6"
|
||||
xhcid = { path = "../xhcid" }
|
||||
|
||||
common = { path = "../../common" }
|
||||
|
||||
@@ -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"] }
|
||||
|
||||
@@ -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" }
|
||||
|
||||
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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"
|
||||
|
||||
Reference in New Issue
Block a user