From 8e2d02232f441ec9697c020ca5630eada558aaa2 Mon Sep 17 00:00:00 2001 From: 4lDO2 <4lDO2@protonmail.com> Date: Mon, 18 Mar 2024 17:10:07 +0100 Subject: [PATCH] Switch to libredox and redox-event. --- Cargo.lock | 345 +++++++++++++++++++++------------- Cargo.toml | 9 +- src/dnsd/main.rs | 107 ++++++----- src/dnsd/scheme.rs | 102 +++++----- src/lib/error.rs | 3 + src/smolnetd/main.rs | 173 ++++++++--------- src/smolnetd/scheme/mod.rs | 56 +++--- src/smolnetd/scheme/socket.rs | 20 +- 8 files changed, 447 insertions(+), 368 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index bbeab0af36..28723fb7c2 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -17,6 +17,12 @@ dependencies = [ "libc", ] +[[package]] +name = "anyhow" +version = "1.0.81" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0952808a6c2afd1aa8947271f3a60f1a6763c7b912d210184c5149b5cf147247" + [[package]] name = "arg_parser" version = "0.1.0" @@ -24,9 +30,9 @@ source = "git+https://gitlab.redox-os.org/redox-os/arg-parser.git#1c434b55f3e1a0 [[package]] name = "atomic-polyfill" -version = "0.1.11" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3ff7eb3f316534d83a8a2c3d1674ace8a5a71198eba31e2e2b597833f699b28" +checksum = "8cf2bce30dfe09ef0bfaef228b9d414faaf7e563035494d7fe092dba54b300f4" dependencies = [ "critical-section", ] @@ -44,10 +50,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] -name = "bumpalo" -version = "3.13.0" +name = "bitflags" +version = "2.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3e2c3daef883ecc1b5d58c15adae93470a91d425f3532ba1695849656af3fc1" +checksum = "ed570934406eb16438a4e976b1b4500774099c13b8cb96eec99f620f05090ddf" + +[[package]] +name = "bumpalo" +version = "3.15.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ff69b9dd49fd426c69a0db9fc04dd934cdb6645ff000864d98f7e2af8830eaa" [[package]] name = "byteorder" @@ -57,18 +69,15 @@ checksum = "0fc10e8cc6b2580fda3f36eb6dc5316657f812a3df879a44a66fc9f0fdbc4855" [[package]] name = "byteorder" -version = "1.4.3" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "cc" -version = "1.0.83" +version = "1.0.90" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1174fb0b6ec23863f8b971027804a42614e347eafb0a95bf0b12cdae21fc4d0" -dependencies = [ - "libc", -] +checksum = "8cd6604a82acf3039f1144f54b8eb34e91ffba622051189e71b781822d5ee1f5" [[package]] name = "cfg-if" @@ -84,24 +93,23 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] name = "chrono" -version = "0.4.28" +version = "0.4.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95ed24df0632f708f5f6d8082675bef2596f7084dee3dd55f632290bf35bfe0f" +checksum = "8eaf5903dcbc0a39312feb77df2ff4c76387d591b9fc7b04a238dcf8bb62639a" dependencies = [ "android-tzdata", "iana-time-zone", "js-sys", "num-traits", - "time", "wasm-bindgen", "windows-targets", ] [[package]] name = "core-foundation-sys" -version = "0.8.4" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e496a50fda8aacccc86d7529e2c1e0892dbd0f898a6b5645b5561b89c3210efa" +checksum = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f" [[package]] name = "critical-section" @@ -111,51 +119,47 @@ checksum = "7059fff8937831a9ae6f0fe4d658ffabf58f2ca96aa9dec1c889f936f705f216" [[package]] name = "crossbeam-channel" -version = "0.5.8" +version = "0.5.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a33c2bf77f2df06183c3aa30d1e96c0695a313d4f9c453cc3762a6db39f99200" +checksum = "ab3db02a9c5b5121e1e42fbdb1aeb65f5e02624cc58c43f2884c6ccac0b82f95" dependencies = [ - "cfg-if 1.0.0", "crossbeam-utils", ] [[package]] name = "crossbeam-utils" -version = "0.8.16" +version = "0.8.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a22b2d63d4d1dc0b7f1b6b2747dd0088008a9be28b6ddf0b1e7d335e3037294" -dependencies = [ - "cfg-if 1.0.0", -] +checksum = "248e3bacc7dc6baa3b21e405ee045c3047101a49145e7e9eca583ab4c2ca5345" [[package]] name = "defmt" -version = "0.3.5" +version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8a2d011b2fee29fb7d659b83c43fce9a2cb4df453e16d441a51448e448f3f98" +checksum = "3939552907426de152b3c2c6f51ed53f98f448babd26f28694c95f5906194595" dependencies = [ - "bitflags", + "bitflags 1.3.2", "defmt-macros", ] [[package]] name = "defmt-macros" -version = "0.3.6" +version = "0.3.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54f0216f6c5acb5ae1a47050a6645024e6edafc2ee32d421955eccfef12ef92e" +checksum = "18bdc7a7b92ac413e19e95240e75d3a73a8d8e78aa24a594c22cbb4d44b4bbda" dependencies = [ "defmt-parser", "proc-macro-error", "proc-macro2", "quote", - "syn 2.0.29", + "syn 2.0.53", ] [[package]] name = "defmt-parser" -version = "0.3.3" +version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "269924c02afd7f94bc4cecbfa5c379f6ffcf9766b3408fe63d22c728654eccd0" +checksum = "ff4a5fefe330e8d7f31b16a318f9ce81000d8e35e69b93eae154d16d2278f70f" dependencies = [ "thiserror", ] @@ -166,7 +170,7 @@ version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f7020f6760aea312d43d23cb83bf6c0c49f162541db8b02bf95209ac51dc253d" dependencies = [ - "byteorder 1.4.3", + "byteorder 1.5.0", "quick-error", ] @@ -176,14 +180,14 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b0c35f58762feb77d74ebe43bdbc3210f09be9fe6742234d573bacc26ed92b67" dependencies = [ - "byteorder 1.4.3", + "byteorder 1.5.0", ] [[package]] name = "heapless" -version = "0.7.16" +version = "0.7.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db04bc24a18b9ea980628ecf00e6c0264f3c1426dac36c00cb49b6fbad8b0743" +checksum = "cdc6457c0eb62c71aac4bc17216026d8410337c4126773b9c5daba343f17964f" dependencies = [ "atomic-polyfill", "hash32", @@ -194,16 +198,16 @@ dependencies = [ [[package]] name = "iana-time-zone" -version = "0.1.57" +version = "0.1.60" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2fad5b825842d2b38bd206f3e81d6957625fd7f0a361e345c30e01a0ae2dd613" +checksum = "e7ffbb5a1b541ea2561f8c41c087286cc091e21e556a4f09a8f6cbf17b69b141" dependencies = [ "android_system_properties", "core-foundation-sys", "iana-time-zone-haiku", "js-sys", "wasm-bindgen", - "windows", + "windows-core", ] [[package]] @@ -227,25 +231,69 @@ dependencies = [ ] [[package]] -name = "js-sys" -version = "0.3.64" +name = "ioslice" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5f195fe497f702db0f318b07fdd68edb16955aed830df8363d837542f8f935a" +checksum = "5e571352c8a3b89074d12e3ee5173ffe162159105352aaaf1fc5764da747e31b" +dependencies = [ + "libc", + "winapi", +] + +[[package]] +name = "js-sys" +version = "0.3.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29c15563dc2726973df627357ce0c9ddddbea194836909d655df6a75d2cf296d" dependencies = [ "wasm-bindgen", ] [[package]] name = "libc" -version = "0.2.147" +version = "0.2.153" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4668fb0ea861c1df094127ac5f1da3409a82116a4ba74fca2e58ef927159bb3" +checksum = "9c198f91728a82281a64e1f4f9eeb25d82cb32a5de251c6bd1b5154d63a8e7bd" + +[[package]] +name = "libredox" +version = "0.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3af92c55d7d839293953fcd0fda5ecfe93297cfde6ffbdec13b41d99c0ba6607" +dependencies = [ + "bitflags 2.4.2", + "libc", + "redox_syscall 0.4.1", +] + +[[package]] +name = "libredox" +version = "0.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "86b5213a34db3434d9c562c16af0d4da82653193805009da815cbc020e8b39df" +dependencies = [ + "bitflags 2.4.2", + "libc", + "redox_syscall 0.4.1", +] + +[[package]] +name = "libredox" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d" +dependencies = [ + "bitflags 2.4.2", + "ioslice", + "libc", + "redox_syscall 0.5.1", +] [[package]] name = "lock_api" -version = "0.4.10" +version = "0.4.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1cc9717a20b1bb222f333e6a92fd32f7d8a18ddc5a3191a11af45dcbf4dcd16" +checksum = "3c168f8615b12bc01f9c17e2eb0cc07dcae1940121185446edc3744920e8ef45" dependencies = [ "autocfg", "scopeguard", @@ -253,9 +301,9 @@ dependencies = [ [[package]] name = "log" -version = "0.4.20" +version = "0.4.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f" +checksum = "90ed8c1e510134f979dbc4f070f87d4313098b704861a105fe34231c70a3901c" [[package]] name = "managed" @@ -282,18 +330,19 @@ dependencies = [ [[package]] name = "netutils" version = "0.1.0" -source = "git+https://gitlab.redox-os.org/redox-os/netutils.git#fc11b9bb3c1f5eefccb93ae670e4ec8b3d6fad4f" +source = "git+https://gitlab.redox-os.org/redox-os/netutils.git#c78177b7d7a694511d88a6b04df3e9d04ed7c78e" dependencies = [ + "anyhow", "arg_parser", "libc", + "libredox 0.0.4", "net2", "ntpclient", "pbr", "redox-daemon", - "redox_event", - "redox_syscall 0.3.5", + "redox_event 0.3.0", "redox_termios", - "termion", + "termion 2.0.3", "url", ] @@ -308,9 +357,9 @@ dependencies = [ [[package]] name = "num-traits" -version = "0.2.16" +version = "0.2.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f30b0abd723be7e2ffca1272140fac1a2f084c77ec3e123c192b66af1ee9e6c2" +checksum = "da0df0e5185db44f69b44f26786fe401b6c293d1907744beaa7fa62b2e5a517a" dependencies = [ "autocfg", ] @@ -323,9 +372,9 @@ checksum = "b8f8bdf33df195859076e54ab11ee78a1b208382d3a26ec40d142ffc1ecc49ef" [[package]] name = "once_cell" -version = "1.18.0" +version = "1.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d" +checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" [[package]] name = "pbr" @@ -370,9 +419,9 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.66" +version = "1.0.79" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "18fb31db3f9bddb2ea821cde30a9f70117e3f119938b5ee630b7403aa6e2ead9" +checksum = "e835ff2298f5721608eb1a980ecaee1aef2c132bf95ecc026a11b7bf3c01c02e" dependencies = [ "unicode-ident", ] @@ -385,21 +434,21 @@ checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" [[package]] name = "quote" -version = "1.0.33" +version = "1.0.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5267fca4496028628a95160fc423a33e8b2e6af8a5302579e322e4b520293cae" +checksum = "291ec9ab5efd934aaf503a6466c5d5251535d108ee747472c3977cc5acc868ef" dependencies = [ "proc-macro2", ] [[package]] name = "redox-daemon" -version = "0.1.1" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "811fd0d382a70c9e9192166ee794567b65ef34cc7309c86a49b071779ca9b5f3" +checksum = "7fbdeffdb03cf2961b211a2023e683d71f2c225ea93404da5dc34b0dc94f0341" dependencies = [ "libc", - "redox_syscall 0.3.5", + "libredox 0.1.3", ] [[package]] @@ -411,29 +460,45 @@ dependencies = [ "chrono", "log", "smallvec", - "termion", + "termion 1.5.6", ] [[package]] name = "redox_event" -version = "0.1.0" -source = "git+https://gitlab.redox-os.org/redox-os/event.git#f7db3d25ca5e282c12ded12bf6c720087b570132" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35eb92c4487aacb8d4326ae0d4d443237528a42f41b95d62858d95c6a42f0272" dependencies = [ - "redox_syscall 0.3.5", + "bitflags 2.4.2", + "libredox 0.0.4", + "redox_syscall 0.4.1", +] + +[[package]] +name = "redox_event" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69609faa5d5992247a4ef379917bb3e39be281405d6a0ccd4f942429400b956f" +dependencies = [ + "bitflags 2.4.2", + "libredox 0.1.3", ] [[package]] name = "redox_netstack" version = "0.1.0" dependencies = [ - "byteorder 1.4.3", + "anyhow", + "byteorder 1.5.0", "dns-parser", + "ioslice", + "libredox 0.1.3", "log", "netutils", "redox-daemon", "redox-log", - "redox_event", - "redox_syscall 0.3.5", + "redox_event 0.4.1", + "redox_syscall 0.5.1", "smoltcp", ] @@ -443,26 +508,32 @@ version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a" dependencies = [ - "bitflags", + "bitflags 1.3.2", ] [[package]] name = "redox_syscall" -version = "0.3.5" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29" +checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa" dependencies = [ - "bitflags", + "bitflags 1.3.2", +] + +[[package]] +name = "redox_syscall" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "469052894dcb553421e483e4209ee581a45100d31b4018de03e5a7ad86374a7e" +dependencies = [ + "bitflags 2.4.2", ] [[package]] name = "redox_termios" -version = "0.1.2" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8440d8acb4fd3d277125b4bd01a6f38aee8d814b3b5fc09b3f2b825d37d3fe8f" -dependencies = [ - "redox_syscall 0.2.16", -] +checksum = "20145670ba436b55d91fc92d25e71160fbfbdd57831631c8d7d36377a476f1cb" [[package]] name = "rustc_version" @@ -481,15 +552,15 @@ checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" [[package]] name = "semver" -version = "1.0.18" +version = "1.0.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0293b4b29daaf487284529cc2f5675b8e57c61f70167ba415a463651fd6a918" +checksum = "92d43fe69e652f3df9bdc2b85b2854a0825b86e4fb76bc44d945137d053639ca" [[package]] name = "smallvec" -version = "1.11.0" +version = "1.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62bb4feee49fdd9f707ef802e22365a35de4b7b299de4763d44bfea899442ff9" +checksum = "e6ecd384b10a64542d77071bd64bd7b231f4ed5940fba55e98c3de13824cf3d7" [[package]] name = "smoltcp" @@ -497,8 +568,8 @@ version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8d2e3a36ac8fea7b94e666dfa3871063d6e0a5c9d5d4fec9a1a6b7b6760f0229" dependencies = [ - "bitflags", - "byteorder 1.4.3", + "bitflags 1.3.2", + "byteorder 1.5.0", "cfg-if 1.0.0", "defmt", "heapless", @@ -533,9 +604,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.29" +version = "2.0.53" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c324c494eba9d92503e6f1ef2e6df781e78f6a7705a0202d9801b198807d518a" +checksum = "7383cd0e49fff4b6b90ca5670bfd3e9d6a733b3f90c686605aa7eec8c4996032" dependencies = [ "proc-macro2", "quote", @@ -555,23 +626,35 @@ dependencies = [ ] [[package]] -name = "thiserror" -version = "1.0.47" +name = "termion" +version = "2.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97a802ec30afc17eee47b2855fc72e0c4cd62be9b4efe6591edde0ec5bd68d8f" +checksum = "c4648c7def6f2043b2568617b9f9b75eae88ca185dbc1f1fda30e95a85d49d7d" +dependencies = [ + "libc", + "libredox 0.0.2", + "numtoa", + "redox_termios", +] + +[[package]] +name = "thiserror" +version = "1.0.58" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03468839009160513471e86a034bb2c5c0e4baae3b43f79ffc55c4a5427b3297" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.47" +version = "1.0.58" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6bb623b56e39ab7dcd4b1b98bb6c8f8d907ed255b18de254088016b27a8ee19b" +checksum = "c61f3ba182994efc43764a46c018c347bc492c79f024e705f46567b418f6d4f7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.29", + "syn 2.0.53", ] [[package]] @@ -602,21 +685,21 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "unicode-bidi" -version = "0.3.13" +version = "0.3.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92888ba5573ff080736b3648696b70cafad7d250551175acbaa4e0385b3e1460" +checksum = "08f95100a766bf4f8f28f90d77e0a5461bbdb219042e7679bebe79004fed8d75" [[package]] name = "unicode-ident" -version = "1.0.11" +version = "1.0.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "301abaae475aa91687eb82514b328ab47a211a533026cb25fc3e519b86adfc3c" +checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" [[package]] name = "unicode-normalization" -version = "0.1.22" +version = "0.1.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c5713f0fc4b5db668a2ac63cdb7bb4469d8c9fed047b1d0292cc7b0ce2ba921" +checksum = "a56d1686db2308d901306f92a263857ef59ea39678a5458e7cb17f01415101f5" dependencies = [ "tinyvec", ] @@ -646,9 +729,9 @@ checksum = "1a143597ca7c7793eff794def352d41792a93c481eb1042423ff7ff72ba2c31f" [[package]] name = "wasm-bindgen" -version = "0.2.87" +version = "0.2.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7706a72ab36d8cb1f80ffbf0e071533974a60d0a308d01a5d0375bf60499a342" +checksum = "4be2531df63900aeb2bca0daaaddec08491ee64ceecbee5076636a3b026795a8" dependencies = [ "cfg-if 1.0.0", "wasm-bindgen-macro", @@ -656,24 +739,24 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.87" +version = "0.2.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ef2b6d3c510e9625e5fe6f509ab07d66a760f0885d858736483c32ed7809abd" +checksum = "614d787b966d3989fa7bb98a654e369c762374fd3213d212cfc0251257e747da" dependencies = [ "bumpalo", "log", "once_cell", "proc-macro2", "quote", - "syn 2.0.29", + "syn 2.0.53", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-macro" -version = "0.2.87" +version = "0.2.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dee495e55982a3bd48105a7b947fd2a9b4a8ae3010041b9e0faab3f9cd028f1d" +checksum = "a1f8823de937b71b9460c0c34e25f3da88250760bec0ebac694b49997550d726" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -681,22 +764,22 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.87" +version = "0.2.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54681b18a46765f095758388f2d0cf16eb8d4169b639ab575a8f5693af210c7b" +checksum = "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.29", + "syn 2.0.53", "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.87" +version = "0.2.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca6ad05a4870b2bf5fe995117d3728437bd27d7cd5f06f13c17443ef369775a1" +checksum = "af190c94f2773fdb3729c55b007a722abb5384da03bc0986df4c289bf5567e96" [[package]] name = "winapi" @@ -721,19 +804,19 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" [[package]] -name = "windows" -version = "0.48.0" +name = "windows-core" +version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e686886bc078bc1b0b600cac0147aadb815089b6e4da64016cbd754b6342700f" +checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" dependencies = [ "windows-targets", ] [[package]] name = "windows-targets" -version = "0.48.5" +version = "0.52.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" +checksum = "7dd37b7e5ab9018759f893a1952c9420d060016fc19a472b4bb20d1bdd694d1b" dependencies = [ "windows_aarch64_gnullvm", "windows_aarch64_msvc", @@ -746,45 +829,45 @@ dependencies = [ [[package]] name = "windows_aarch64_gnullvm" -version = "0.48.5" +version = "0.52.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" +checksum = "bcf46cf4c365c6f2d1cc93ce535f2c8b244591df96ceee75d8e83deb70a9cac9" [[package]] name = "windows_aarch64_msvc" -version = "0.48.5" +version = "0.52.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" +checksum = "da9f259dd3bcf6990b55bffd094c4f7235817ba4ceebde8e6d11cd0c5633b675" [[package]] name = "windows_i686_gnu" -version = "0.48.5" +version = "0.52.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" +checksum = "b474d8268f99e0995f25b9f095bc7434632601028cf86590aea5c8a5cb7801d3" [[package]] name = "windows_i686_msvc" -version = "0.48.5" +version = "0.52.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" +checksum = "1515e9a29e5bed743cb4415a9ecf5dfca648ce85ee42e15873c3cd8610ff8e02" [[package]] name = "windows_x86_64_gnu" -version = "0.48.5" +version = "0.52.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" +checksum = "5eee091590e89cc02ad514ffe3ead9eb6b660aedca2183455434b93546371a03" [[package]] name = "windows_x86_64_gnullvm" -version = "0.48.5" +version = "0.52.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" +checksum = "77ca79f2451b49fa9e2af39f0747fe999fcda4f5e241b2898624dca97a1f2177" [[package]] name = "windows_x86_64_msvc" -version = "0.48.5" +version = "0.52.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" +checksum = "32b752e52a2da0ddfbdbcc6fceadfeede4c939ed16d13e648833a61dfb611ed8" [[patch.unused]] name = "mio" diff --git a/Cargo.toml b/Cargo.toml index 4f4ef1b4b5..9113191568 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -17,12 +17,15 @@ path = "src/lib/lib.rs" [dependencies] netutils = { git = "https://gitlab.redox-os.org/redox-os/netutils.git" } -redox_event = { git = "https://gitlab.redox-os.org/redox-os/event.git" } -redox-daemon = "0.1.1" -redox_syscall = "0.3" +redox_event = "0.4.1" +redox-daemon = "0.1.2" +redox_syscall = "0.5" redox-log = "0.1" byteorder = { version = "1.0", default-features = false } dns-parser = "0.7.1" +libredox = { version = "0.1.3", features = ["mkns"] } +anyhow = "1.0.81" +ioslice = "0.6.0" [dependencies.log] version = "0.4" diff --git a/src/dnsd/main.rs b/src/dnsd/main.rs index ce21854cde..7a6becfd0c 100644 --- a/src/dnsd/main.rs +++ b/src/dnsd/main.rs @@ -1,84 +1,74 @@ -extern crate dns_parser; -extern crate event; #[macro_use] extern crate log; -extern crate redox_netstack; -extern crate syscall; +use anyhow::{Error, Result, Context}; use event::EventQueue; -use redox_netstack::error::{Error, Result}; +use ioslice::IoSlice; +use libredox::Fd; use redox_netstack::logger; use scheme::Dnsd; -use std::cell::RefCell; use std::fs::File; -use std::os::unix::io::{AsRawFd, FromRawFd, RawFd}; +use std::os::unix::io::{FromRawFd, RawFd}; use std::process; -use std::rc::Rc; mod scheme; fn run(daemon: redox_daemon::Daemon) -> Result<()> { - use syscall::flag::*; + use libredox::flag::*; - let dns_fd = syscall::open(":dns", O_RDWR | O_CREAT | O_NONBLOCK) - .map_err(|e| Error::from_syscall_error(e, "failed to open :dns"))? - as RawFd; + let dns_fd = Fd::open(":dns", O_RDWR | O_CREAT | O_NONBLOCK, 0) + .context("failed to open :dns")?; - let time_path = format!("time:{}", syscall::CLOCK_MONOTONIC); - let time_fd = syscall::open(&time_path, syscall::O_RDWR) - .map_err(|e| Error::from_syscall_error(e, "failed to open time:"))? - as RawFd; + let time_path = format!("time:{}", CLOCK_MONOTONIC); + let time_fd = Fd::open(&time_path, O_RDWR, 0) + .context("failed to open time")?; - let nameserver_fd = syscall::open( + let nameserver_fd = Fd::open( "netcfg:resolv/nameserver", - syscall::O_RDWR | syscall::O_CREAT | syscall::O_NONBLOCK, - ).map_err(|e| Error::from_syscall_error(e, "failed to open nameserver:"))? - as RawFd; + O_RDWR | O_CREAT | O_NONBLOCK, + 0, + ).context("failed to open nameserver")?; + + let event_queue = EventQueue::::new() + .context("failed to create event queue")?; + + event_queue + .subscribe(dns_fd.raw(), EventSource::DnsScheme, event::EventFlags::READ) + .context("failed to listen to time events")?; + event_queue + .subscribe(nameserver_fd.raw(), EventSource::NameserverScheme, event::EventFlags::READ) + .context("failed to listen to nameserver socket events")?; + event_queue + .subscribe(time_fd.raw(), EventSource::Timer, event::EventFlags::READ) + .context("failed to listen to timer events")?; let (dns_file, time_file) = unsafe { ( - File::from_raw_fd(dns_fd), - File::from_raw_fd(time_fd), + File::from_raw_fd(dns_fd.into_raw() as RawFd), + File::from_raw_fd(time_fd.into_raw() as RawFd), ) }; - let mut event_queue = EventQueue::<(), Error>::new() - .map_err(|e| Error::from_io_error(e, "failed to create event queue"))?; + let mut dnsd = Dnsd::new(dns_file, time_file, &event_queue); - let dnsd = Rc::new(RefCell::new(Dnsd::new(dns_file, time_file, event_queue.file.as_raw_fd()))); - - let new_ns = syscall::mkns(&[["udp".as_ptr() as usize, "udp".len()]]) + let new_ns = libredox::call::mkns(&[IoSlice::new(b"dns")]) .expect("dnsd: failed to create namespace"); - syscall::setrens(new_ns, new_ns).expect("dnsd: failed to enter namespace"); + libredox::call::setrens(new_ns, new_ns).expect("dnsd: failed to enter namespace"); daemon.ready().expect("dnsd: failed to notify parent"); - let dnsd_ = Rc::clone(&dnsd); - - event_queue - .add(dns_fd, move |_| dnsd_.borrow_mut().on_dns_file_event()) - .map_err(|e| Error::from_io_error(e, "failed to listen to time events"))?; - - let dnsd_ = Rc::clone(&dnsd); - - event_queue - .add(nameserver_fd, move |_| dnsd_.borrow_mut().on_nameserver_event()) - .map_err(|e| Error::from_io_error(e, "failed to listen to nameserver"))?; - - let dnsd_ = Rc::clone(&dnsd); - - event_queue.set_default_callback(move |event| dnsd_.borrow_mut().on_unknown_fd_event(event.fd)); - - event_queue - .add(time_fd, move |_| dnsd.borrow_mut().on_time_event()) - .map_err(|e| Error::from_io_error(e, "failed to listen to time events"))?; - - event_queue.trigger_all(event::Event { - fd: 0, - flags: EventFlags::empty(), - })?; - - event_queue.run() + for event_res in event_queue.iter() { + let event = event_res.context("failed to read from event queue")?; + match event.user_data { + EventSource::DnsScheme => if !dnsd.on_dns_file_event()? { + break + }, + EventSource::NameserverScheme => dnsd.on_nameserver_event()?, + EventSource::Timer => dnsd.on_time_event()?, + EventSource::Other => dnsd.on_unknown_fd_event(event.fd as RawFd)?, + } + } + Ok(()) } fn main() { @@ -91,3 +81,12 @@ fn main() { process::exit(0); }).expect("dnsd: failed to daemonize"); } + +event::user_data! { + enum EventSource { + DnsScheme, + NameserverScheme, + Timer, + Other, + } +} diff --git a/src/dnsd/scheme.rs b/src/dnsd/scheme.rs index b7935ded5f..b2ec78c17e 100644 --- a/src/dnsd/scheme.rs +++ b/src/dnsd/scheme.rs @@ -1,5 +1,3 @@ -use redox_netstack::error::{Error, Result}; -use event::{subscribe_to_fd, unsubscribe_from_fd}; use std::borrow::ToOwned; use std::collections::{BTreeMap, BTreeSet}; use std::collections::VecDeque; @@ -12,13 +10,19 @@ use std::str; use std::str::FromStr; use std::rc::Rc; use std::net::Ipv4Addr; + use syscall::data::TimeSpec; use syscall::{Error as SyscallError, EventFlags as SyscallEventFlags, Packet as SyscallPacket, Result as SyscallResult, SchemeMut}; use syscall; +use event::EventQueue; +use redox_netstack::error::{Error, Result}; + use dns_parser::{Builder, Packet as DNSPacket, RRData, ResponseCode}; use dns_parser::{QueryClass, QueryType}; +use crate::EventSource; + enum DnsFile { Resolved { data: Rc<[u8]>, pos: usize }, Waiting { domain: String }, @@ -76,25 +80,26 @@ impl Domains { } } - fn request_domain(&mut self, domain: &str, queue_fd: RawFd) -> Option { + fn request_domain(&mut self, domain: &str, queue: &EventQueue) -> Option { trace!("Requesting domain {}", domain); let mut builder = Builder::new_query(1, true); builder.add_question(domain, QueryType::A, QueryClass::IN); let packet = builder.build().ok()?; - let udp_fd = syscall::open( + let udp_fd = libredox::call::open( &format!("udp:{}:53", self.nameserver), - syscall::O_RDWR | syscall::O_CREAT | syscall::O_NONBLOCK, - ).ok()? as RawFd; - if syscall::write(udp_fd as usize, &packet) != Ok(packet.len()) { - syscall::close(udp_fd as usize).ok()?; + libredox::flag::O_RDWR | libredox::flag::O_CREAT | libredox::flag::O_NONBLOCK, + 0, + ).ok()?; + if libredox::call::write(udp_fd, &packet) != Ok(packet.len()) { + libredox::call::close(udp_fd).ok()?; return None; } - subscribe_to_fd(queue_fd, udp_fd, 0xFFFFFFFF).ok()?; - self.requests.insert(udp_fd, domain.to_owned().into()); - Some(udp_fd) + queue.subscribe(udp_fd, EventSource::Other, event::EventFlags::READ).ok()?; + self.requests.insert(udp_fd as RawFd, domain.to_owned().into()); + Some(udp_fd as RawFd) } - fn on_time_event(&mut self, cur_time: &TimeSpec, queue_fd: RawFd) -> BTreeSet { + fn on_time_event(&mut self, cur_time: &TimeSpec, queue: &EventQueue) -> Result> { while let Some((timeout, domain)) = self.resolved_timeouts.pop_front() { if timeout.tv_sec > cur_time.tv_sec || (timeout.tv_sec == cur_time.tv_sec && timeout.tv_nsec > cur_time.tv_nsec) @@ -133,18 +138,18 @@ impl Domains { } = e.remove() { fds_to_wakeup.append(&mut waiting_fds); - let _ = unsubscribe_from_fd(queue_fd, socket_fd, 0xFFFFFFFF); - let _ = syscall::close(socket_fd as usize); + queue.unsubscribe(socket_fd as usize).map_err(|e| Error::from_syscall_error(e.into(), "unsubscribe failure"))?; + let _ = libredox::call::close(socket_fd as usize); } } } } } - fds_to_wakeup + Ok(fds_to_wakeup) } - fn on_fd_event(&mut self, fd: RawFd, cur_time: &TimeSpec, queue_fd: RawFd) -> Option { + fn on_fd_event(&mut self, fd: RawFd, cur_time: &TimeSpec, queue: &EventQueue) -> Option { let e = match self.requests.entry(fd) { Entry::Vacant(_) => { return None; @@ -152,7 +157,7 @@ impl Domains { Entry::Occupied(e) => e, }; let mut buf = [0u8; 0x1000]; - let readed = syscall::read(fd as usize, &mut buf).ok()?; + let readed = libredox::call::read(fd as usize, &mut buf).ok()?; if readed == 0 { return None; } @@ -160,8 +165,8 @@ impl Domains { if pkt.header.response_code != ResponseCode::NoError || pkt.answers.is_empty() { if let Some(query) = pkt.questions.iter().next() { if query.qname.to_string().to_lowercase() == e.get().as_ref() { - unsubscribe_from_fd(queue_fd, fd, 0xFFFFFFFF).ok()?; - syscall::close(fd as usize).ok()?; + queue.unsubscribe(fd as usize).ok()?; + libredox::call::close(fd as usize).ok()?; let domain = e.remove(); self.requested_timeouts .retain(|&(_, ref d)| d.as_ref() != domain.as_ref()); @@ -190,8 +195,8 @@ impl Domains { return None; } let data = Rc::from(result.into_bytes()); - unsubscribe_from_fd(queue_fd, fd, 0xFFFFFFFF).ok()?; - syscall::close(fd as usize).ok()?; + queue.unsubscribe(fd as usize).ok()?; + libredox::call::close(fd as usize).ok()?; let domain = e.remove(); let mut domain_data = Domain::Resolved { data }; trace!("On FD event {} {} resolved", fd, domain); @@ -221,7 +226,7 @@ impl Domains { } } - fn file_from_domain(&mut self, domain: &str, fd: usize, cur_time: &TimeSpec, queue_fd: RawFd) -> DnsFile { + fn file_from_domain(&mut self, domain: &str, fd: usize, cur_time: &TimeSpec, queue: &EventQueue) -> DnsFile { if let Some(domain_data) = self.domains.get_mut(domain) { match *domain_data { Domain::Resolved { ref data } => DnsFile::Resolved { @@ -239,7 +244,7 @@ impl Domains { } } } else { - if let Some(socket_fd) = self.request_domain(domain, queue_fd) { + if let Some(socket_fd) = self.request_domain(domain, queue) { let mut waiting_fds = BTreeSet::new(); let domain = domain.to_owned().into(); waiting_fds.insert(fd); @@ -273,26 +278,26 @@ impl Domains { } } -pub struct Dnsd { +pub struct Dnsd<'q> { dns_file: File, time_file: File, - queue_fd: RawFd, + queue: &'q EventQueue, files: BTreeMap, domains: Domains, wait_map: BTreeMap, next_fd: usize, } -impl Dnsd { +impl<'q> Dnsd<'q> { const RESOLVED_TIMEOUT_S: i64 = 5 * 60; const REQUEST_TIMEOUT_S: i64 = 30; const TIME_EVENT_TIMEOUT_S: i64 = 5; - pub fn new(dns_file: File, time_file: File, queue_fd: RawFd) -> Dnsd { + pub fn new(dns_file: File, time_file: File, queue: &'q EventQueue) -> Dnsd { Dnsd { dns_file, time_file, - queue_fd, + queue, files: BTreeMap::new(), domains: Domains::new(), wait_map: BTreeMap::new(), @@ -300,7 +305,7 @@ impl Dnsd { } } - pub fn on_time_event(&mut self) -> Result> { + pub fn on_time_event(&mut self) -> Result<()> { let mut time = TimeSpec::default(); if self.time_file.read(&mut time)? < mem::size_of::() { return Err(Error::from_syscall_error( @@ -309,7 +314,7 @@ impl Dnsd { )); } - let fds_to_wakeup = self.domains.on_time_event(&time, self.queue_fd); + let fds_to_wakeup = self.domains.on_time_event(&time, self.queue)?; if !fds_to_wakeup.is_empty() { for fd in &fds_to_wakeup { if let Some(file) = self.files.get_mut(fd) { @@ -323,24 +328,25 @@ impl Dnsd { self.time_file .write_all(&time) .map_err(|e| Error::from_io_error(e, "Failed to write to time file"))?; - Ok(None) + Ok(()) } - pub fn on_dns_file_event(&mut self) -> Result> { - let result = loop { + pub fn on_dns_file_event(&mut self) -> Result { + loop { let mut packet = SyscallPacket::default(); match self.dns_file.read(&mut packet) { Ok(0) => { //TODO: Cleanup must occur - break Some(()); + return Ok(false); }, Ok(_) => (), Err(err) => if err.kind() == ErrorKind::WouldBlock { - break None; + return Ok(true); } else { return Err(Error::from(err)); } } + // TODO: implement cancellation let a = packet.a; self.handle(&mut packet); if packet.a != (-syscall::EWOULDBLOCK) as usize { @@ -349,17 +355,17 @@ impl Dnsd { packet.a = a; self.handle_block(packet)?; } - }; - Ok(result) + } } - pub fn on_unknown_fd_event(&mut self, fd: RawFd) -> Result> { + pub fn on_unknown_fd_event(&mut self, fd: RawFd) -> Result<()> { trace!("Unknown fd event {}", fd); - let mut cur_time = TimeSpec::default(); - syscall::clock_gettime(syscall::CLOCK_MONOTONIC, &mut cur_time) - .map_err(|e| Error::from_syscall_error(e, "Can't get time"))?; + let cur_time = libredox::call::clock_gettime(libredox::flag::CLOCK_MONOTONIC) + .map_err(|e| Error::from_syscall_error(e.into(), "Can't get time"))?; + // TODO + let cur_time = TimeSpec { tv_sec: cur_time.tv_sec, tv_nsec: cur_time.tv_nsec as _ }; - match self.domains.on_fd_event(fd, &cur_time, self.queue_fd) { + match self.domains.on_fd_event(fd, &cur_time, self.queue) { Some(DnsParsingResult::FailFiles(fds_to_fail)) => { for fd in &fds_to_fail { if let Some(file) = self.files.get_mut(fd) { @@ -373,12 +379,12 @@ impl Dnsd { } None => {} } - Ok(None) + Ok(()) } - pub fn on_nameserver_event(&mut self) -> Result> { + pub fn on_nameserver_event(&mut self) -> Result<()> { self.domains.update_nameserver(); - Ok(None) + Ok(()) } fn wakeup_fds(&mut self, fds_to_wakeup: &BTreeSet) { @@ -416,7 +422,7 @@ impl Dnsd { } } -impl SchemeMut for Dnsd { +impl SchemeMut for Dnsd<'_> { fn open(&mut self, url: &str, _flags: usize, _uid: u32, _gid: u32) -> SyscallResult { let domain = url.to_lowercase(); if domain.is_empty() || !Dnsd::validate_domain(&domain) { @@ -426,7 +432,7 @@ impl SchemeMut for Dnsd { self.next_fd += 1; let mut cur_time = TimeSpec::default(); syscall::clock_gettime(syscall::CLOCK_MONOTONIC, &mut cur_time)?; - let dns_file = self.domains.file_from_domain(&domain, fd, &cur_time, self.queue_fd); + let dns_file = self.domains.file_from_domain(&domain, fd, &cur_time, self.queue); self.files.insert(fd, dns_file); trace!("Open {} {}", &domain, fd); Ok(fd) @@ -460,7 +466,7 @@ impl SchemeMut for Dnsd { syscall::clock_gettime(syscall::CLOCK_MONOTONIC, &mut cur_time)?; if let DnsFile::Waiting { ref domain } = *file { - *file = self.domains.file_from_domain(domain, fd, &cur_time, self.queue_fd); + *file = self.domains.file_from_domain(domain, fd, &cur_time, self.queue); } match *file { diff --git a/src/lib/error.rs b/src/lib/error.rs index 0c5191e146..3f4cc46630 100644 --- a/src/lib/error.rs +++ b/src/lib/error.rs @@ -4,12 +4,14 @@ use std::result; use std::io::Error as IOError; use syscall::error::Error as SyscallError; +#[derive(Debug)] enum ErrorType { Syscall(SyscallError), IOError(IOError), Other, } +#[derive(Debug)] pub struct Error { error_type: ErrorType, descr: String, @@ -53,6 +55,7 @@ impl fmt::Display for Error { } } } +impl std::error::Error for Error {} impl convert::From for Error { fn from(e: IOError) -> Self { diff --git a/src/smolnetd/main.rs b/src/smolnetd/main.rs index d750abbbc1..d16fcf3be7 100644 --- a/src/smolnetd/main.rs +++ b/src/smolnetd/main.rs @@ -13,12 +13,14 @@ use std::os::unix::io::{FromRawFd, RawFd}; use std::process; use std::rc::Rc; -use event::EventQueue; -use redox_netstack::error::{Error, Result}; +use event::{EventQueue, EventFlags}; +use libredox::Fd; +use libredox::flag::{O_RDWR, O_NONBLOCK, O_CREAT}; +use anyhow::{Result, anyhow, bail, Context}; + use redox_netstack::logger; use scheme::Smolnetd; use smoltcp::wire::EthernetAddress; -use syscall::flag::*; mod buffer_pool; mod link; @@ -48,7 +50,7 @@ fn get_network_adapter() -> Result { } if adapters.is_empty() { - Err(Error::other_error("no network adapter found")) + bail!("no network adapter found"); } else { let adapter = adapters.remove(0); if !adapters.is_empty() { @@ -62,129 +64,106 @@ fn get_network_adapter() -> Result { fn run(daemon: redox_daemon::Daemon) -> Result<()> { let adapter = get_network_adapter()?; trace!("opening {adapter}:"); - let network_fd = syscall::open(format!("{adapter}:"), O_RDWR | O_NONBLOCK) - .map_err(|e| Error::from_syscall_error(e, format!("failed to open {adapter}:")))? - as RawFd; + let network_fd = Fd::open(&format!("{adapter}:"), O_RDWR | O_NONBLOCK, 0) + .map_err(|e| anyhow!("failed to open {adapter}: {e}"))?; let hardware_addr = std::fs::read(format!("{adapter}:mac")) .map(|mac_address| EthernetAddress::from_bytes(&mac_address)) - .expect("failed to get mac address from network adapter"); + .context("failed to get mac address from network adapter")?; trace!("opening :ip"); - let ip_fd = syscall::open(":ip", O_RDWR | O_CREAT | O_NONBLOCK) - .map_err(|e| Error::from_syscall_error(e, "failed to open :ip"))? as RawFd; + let ip_fd = Fd::open(":ip", O_RDWR | O_CREAT | O_NONBLOCK, 0) + .context("failed to open :ip")?; trace!("opening :udp"); - let udp_fd = syscall::open(":udp", O_RDWR | O_CREAT | O_NONBLOCK) - .map_err(|e| Error::from_syscall_error(e, "failed to open :udp"))? - as RawFd; + let udp_fd = Fd::open(":udp", O_RDWR | O_CREAT | O_NONBLOCK, 0) + .context("failed to open :udp")?; trace!("opening :tcp"); - let tcp_fd = syscall::open(":tcp", O_RDWR | O_CREAT | O_NONBLOCK) - .map_err(|e| Error::from_syscall_error(e, "failed to open :tcp"))? - as RawFd; + let tcp_fd = Fd::open(":tcp", O_RDWR | O_CREAT | O_NONBLOCK, 0) + .context("failed to open :tcp")?; trace!("opening :icmp"); - let icmp_fd = syscall::open(":icmp", O_RDWR | O_CREAT | O_NONBLOCK) - .map_err(|e| Error::from_syscall_error(e, "failed to open :icmp"))? - as RawFd; + let icmp_fd = Fd::open(":icmp", O_RDWR | O_CREAT | O_NONBLOCK, 0) + .context("failed to open :icmp")?; trace!("opening :netcfg"); - let netcfg_fd = syscall::open(":netcfg", O_RDWR | O_CREAT | O_NONBLOCK) - .map_err(|e| Error::from_syscall_error(e, "failed to open :netcfg"))? - as RawFd; + let netcfg_fd = Fd::open(":netcfg", O_RDWR | O_CREAT | O_NONBLOCK, 0) + .context("failed to open :netcfg")?; let time_path = format!("time:{}", syscall::CLOCK_MONOTONIC); - let time_fd = syscall::open(&time_path, syscall::O_RDWR) - .map_err(|e| Error::from_syscall_error(e, "failed to open time:"))? - as RawFd; + let time_fd = Fd::open(&time_path, O_RDWR, 0) + .context("failed to open time:")?; - let (network_file, ip_file, time_file, udp_file, tcp_file, icmp_file, netcfg_file) = unsafe { - ( - File::from_raw_fd(network_fd), - File::from_raw_fd(ip_fd), - File::from_raw_fd(time_fd), - File::from_raw_fd(udp_fd), - File::from_raw_fd(tcp_fd), - File::from_raw_fd(icmp_fd), - File::from_raw_fd(netcfg_fd), - ) - }; + event::user_data! { + enum EventSource { + Network, + Time, + IpScheme, + UdpScheme, + TcpScheme, + IcmpScheme, + NetcfgScheme, + } + } - let smolnetd = Rc::new(RefCell::new(Smolnetd::new( - network_file, - hardware_addr, - ip_file, - udp_file, - tcp_file, - icmp_file, - time_file, - netcfg_file, - ))); - - let mut event_queue = EventQueue::<(), Error>::new() - .map_err(|e| Error::from_io_error(e, "failed to create event queue"))?; - - syscall::setrens(0, 0).expect("smolnetd: failed to enter null namespace"); + let event_queue = EventQueue::::new() + .context("failed to create event queue")?; daemon.ready().expect("smolnetd: failed to notify parent"); - let smolnetd_ = Rc::clone(&smolnetd); + event_queue.subscribe(network_fd.raw(), EventSource::Network, EventFlags::READ) + .context("failed to listen to network events")?; - event_queue - .add(network_fd, move |_| { - smolnetd_.borrow_mut().on_network_scheme_event() - }) - .map_err(|e| Error::from_io_error(e, "failed to listen to network events"))?; + event_queue.subscribe(time_fd.raw(), EventSource::Time, EventFlags::READ) + .context("failed to listen to timer events")?; - let smolnetd_ = Rc::clone(&smolnetd); + event_queue.subscribe(ip_fd.raw(), EventSource::IpScheme, EventFlags::READ) + .context("failed to listen to ip scheme events")?; - event_queue - .add(ip_fd, move |_| smolnetd_.borrow_mut().on_ip_scheme_event()) - .map_err(|e| Error::from_io_error(e, "failed to listen to ip events"))?; + event_queue.subscribe(udp_fd.raw(), EventSource::UdpScheme, EventFlags::READ) + .context("failed to listen to udp scheme events")?; - let smolnetd_ = Rc::clone(&smolnetd); + event_queue.subscribe(tcp_fd.raw(), EventSource::TcpScheme, EventFlags::READ) + .context("failed to listen to tcp scheme events")?; - event_queue - .add(udp_fd, move |_| { - smolnetd_.borrow_mut().on_udp_scheme_event() - }) - .map_err(|e| Error::from_io_error(e, "failed to listen to udp events"))?; + event_queue.subscribe(icmp_fd.raw(), EventSource::IcmpScheme, EventFlags::READ) + .context("failed to listen to icmp scheme events")?; - let smolnetd_ = Rc::clone(&smolnetd); + event_queue.subscribe(netcfg_fd.raw(), EventSource::NetcfgScheme, EventFlags::READ) + .context("failed to listen to netcfg scheme events")?; - event_queue - .add(tcp_fd, move |_| { - smolnetd_.borrow_mut().on_tcp_scheme_event() - }) - .map_err(|e| Error::from_io_error(e, "failed to listen to tcp events"))?; + let mut smolnetd = Smolnetd::new( + network_fd, + hardware_addr, + ip_fd, + udp_fd, + tcp_fd, + icmp_fd, + time_fd, + netcfg_fd, + ); - let smolnetd_ = Rc::clone(&smolnetd); + libredox::call::setrens(0, 0) + .context("smolnetd: failed to enter null namespace")?; - event_queue - .add(icmp_fd, move |_| { - smolnetd_.borrow_mut().on_icmp_scheme_event() - }) - .map_err(|e| Error::from_io_error(e, "failed to listen to icmp events"))?; + let all = { + use EventSource::*; + [Network, Time, IpScheme, UdpScheme, IcmpScheme, NetcfgScheme].map(Ok) + }; - let smolnetd_ = Rc::clone(&smolnetd); - - event_queue - .add(time_fd, move |_| smolnetd_.borrow_mut().on_time_event()) - .map_err(|e| Error::from_io_error(e, "failed to listen to time events"))?; - - event_queue - .add(netcfg_fd, move |_| { - smolnetd.borrow_mut().on_netcfg_scheme_event() - }) - .map_err(|e| Error::from_io_error(e, "failed to listen to netcfg events"))?; - - event_queue.trigger_all(event::Event { - fd: 0, - flags: EventFlags::empty(), - })?; - - event_queue.run() + for event_res in all.into_iter().chain(event_queue.map(|r| r.map(|e| e.user_data))) { + match event_res? { + EventSource::Network => smolnetd.on_network_scheme_event()?, + EventSource::Time => smolnetd.on_time_event()?, + EventSource::IpScheme => smolnetd.on_ip_scheme_event()?, + EventSource::UdpScheme => smolnetd.on_udp_scheme_event()?, + EventSource::TcpScheme => smolnetd.on_tcp_scheme_event()?, + EventSource::IcmpScheme => smolnetd.on_icmp_scheme_event()?, + EventSource::NetcfgScheme => smolnetd.on_netcfg_scheme_event()?, + } + } + Ok(()) } fn main() { diff --git a/src/smolnetd/scheme/mod.rs b/src/smolnetd/scheme/mod.rs index 2efffc0eea..32795bcefc 100644 --- a/src/smolnetd/scheme/mod.rs +++ b/src/smolnetd/scheme/mod.rs @@ -4,6 +4,7 @@ use crate::link::{loopback::LoopbackDevice, DeviceList}; use crate::router::route_table::{RouteTable, Rule}; use crate::router::Router; use crate::scheme::smoltcp::iface::SocketSet as SmoltcpSocketSet; +use libredox::Fd; use netutils::getcfg; use smoltcp; use smoltcp::iface::{Config, Interface as SmoltcpInterface}; @@ -16,6 +17,7 @@ use std::cell::RefCell; use std::fs::File; use std::io::{Read, Write}; use std::mem::size_of; +use std::os::fd::{FromRawFd, RawFd}; use std::rc::Rc; use std::str::FromStr; use syscall; @@ -63,14 +65,14 @@ impl Smolnetd { pub const MAX_CHECK_TIMEOUT: Duration = Duration::from_millis(500); pub fn new( - network_file: File, + network_file: Fd, hardware_addr: EthernetAddress, - ip_file: File, - udp_file: File, - tcp_file: File, - icmp_file: File, - time_file: File, - netcfg_file: File, + ip_file: Fd, + udp_file: Fd, + tcp_file: Fd, + icmp_file: Fd, + time_file: Fd, + netcfg_file: Fd, ) -> Smolnetd { let protocol_addrs = vec![ IpCidr::new(IpAddress::v4(127, 0, 0, 1), 8), @@ -108,7 +110,7 @@ impl Smolnetd { let mut eth0 = EthernetLink::new( "eth0", - network_file, + unsafe { File::from_raw_fd(network_file.into_raw() as RawFd) }, ); eth0.set_mac_address(hardware_addr); @@ -120,79 +122,79 @@ impl Smolnetd { router_device: network_device, socket_set: Rc::clone(&socket_set), timer: ::std::time::Instant::now(), - time_file, + time_file: unsafe { File::from_raw_fd(time_file.into_raw() as RawFd) }, ip_scheme: IpScheme::new( Rc::clone(&iface), Rc::clone(&route_table), Rc::clone(&socket_set), - ip_file, + unsafe { File::from_raw_fd(ip_file.into_raw() as RawFd) }, ), udp_scheme: UdpScheme::new( Rc::clone(&iface), Rc::clone(&route_table), Rc::clone(&socket_set), - udp_file, + unsafe { File::from_raw_fd(udp_file.into_raw() as RawFd) }, ), tcp_scheme: TcpScheme::new( Rc::clone(&iface), Rc::clone(&route_table), Rc::clone(&socket_set), - tcp_file, + unsafe { File::from_raw_fd(tcp_file.into_raw() as RawFd) }, ), icmp_scheme: IcmpScheme::new( Rc::clone(&iface), Rc::clone(&route_table), Rc::clone(&socket_set), - icmp_file, + unsafe { File::from_raw_fd(icmp_file.into_raw() as RawFd) }, ), netcfg_scheme: NetCfgScheme::new( Rc::clone(&iface), - netcfg_file, + unsafe { File::from_raw_fd(netcfg_file.into_raw() as RawFd) }, Rc::clone(&route_table), Rc::clone(&devices), ), } } - pub fn on_network_scheme_event(&mut self) -> Result> { + pub fn on_network_scheme_event(&mut self) -> Result<()> { self.poll()?; - Ok(None) + Ok(()) } - pub fn on_ip_scheme_event(&mut self) -> Result> { + pub fn on_ip_scheme_event(&mut self) -> Result<()> { self.ip_scheme.on_scheme_event()?; let _ = self.poll()?; - Ok(None) + Ok(()) } - pub fn on_udp_scheme_event(&mut self) -> Result> { + pub fn on_udp_scheme_event(&mut self) -> Result<()> { self.udp_scheme.on_scheme_event()?; let _ = self.poll()?; - Ok(None) + Ok(()) } - pub fn on_tcp_scheme_event(&mut self) -> Result> { + pub fn on_tcp_scheme_event(&mut self) -> Result<()> { self.tcp_scheme.on_scheme_event()?; let _ = self.poll()?; - Ok(None) + Ok(()) } - pub fn on_icmp_scheme_event(&mut self) -> Result> { + pub fn on_icmp_scheme_event(&mut self) -> Result<()> { self.icmp_scheme.on_scheme_event()?; let _ = self.poll()?; - Ok(None) + Ok(()) } - pub fn on_time_event(&mut self) -> Result> { + pub fn on_time_event(&mut self) -> Result<()> { let timeout = self.poll()?; self.schedule_time_event(timeout)?; //TODO: Fix network scheme to ensure events are not missed self.on_network_scheme_event() } - pub fn on_netcfg_scheme_event(&mut self) -> Result> { + pub fn on_netcfg_scheme_event(&mut self) -> Result<()> { self.netcfg_scheme.on_scheme_event()?; - Ok(None) + Ok(()) } fn schedule_time_event(&mut self, timeout: Duration) -> Result<()> { diff --git a/src/smolnetd/scheme/socket.rs b/src/smolnetd/scheme/socket.rs index 45c64cfeeb..ec47f167cc 100644 --- a/src/smolnetd/scheme/socket.rs +++ b/src/smolnetd/scheme/socket.rs @@ -10,7 +10,8 @@ use std::ops::DerefMut; use std::rc::Rc; use std::str; -use syscall; +use libredox::flag::CLOCK_MONOTONIC; +use syscall::{self, KSMSG_CANCEL}; use syscall::data::TimeSpec; use syscall::flag::{EVENT_READ, EVENT_WRITE}; use syscall::{ @@ -286,6 +287,10 @@ where } } } + if packet.a == KSMSG_CANCEL { + println!("smolnetd: todo: handle cancellation"); + continue; + } if let Some(a) = self.handle(&mut packet) { packet.a = a; self.scheme_file.write_all(&packet)?; @@ -372,15 +377,14 @@ where }?; let mut timeout = match packet.a { - syscall::SYS_WRITE => Ok(write_timeout), - syscall::SYS_READ => Ok(read_timeout), - _ => Ok(None), - }?; + syscall::SYS_WRITE => write_timeout, + syscall::SYS_READ => read_timeout, + _ => None, + }; if let Some(ref mut timeout) = timeout { - let mut cur_time = TimeSpec::default(); - syscall::clock_gettime(syscall::CLOCK_MONOTONIC, &mut cur_time)?; - *timeout = add_time(timeout, &cur_time) + let cur_time = libredox::call::clock_gettime(CLOCK_MONOTONIC)?; + *timeout = add_time(timeout, &TimeSpec { tv_sec: cur_time.tv_sec, tv_nsec: cur_time.tv_nsec as i32 }) } Ok(timeout)