commit c6c2136a9f30f431fb503b6e8d8b077f27681da8 Author: pjht Date: Sun Nov 3 10:59:30 2024 -0600 Initial commit diff --git a/.cargo/config.toml b/.cargo/config.toml new file mode 100644 index 0000000..bec4b7a --- /dev/null +++ b/.cargo/config.toml @@ -0,0 +1,5 @@ +[build] +target = "x86_64-unknown-mikros" + +[install] +root = "../os_build/sysroot" diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..d913617 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +target + diff --git a/Cargo.lock b/Cargo.lock new file mode 100644 index 0000000..0b3e83a --- /dev/null +++ b/Cargo.lock @@ -0,0 +1,342 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "atomic-polyfill" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8cf2bce30dfe09ef0bfaef228b9d414faaf7e563035494d7fe092dba54b300f4" +dependencies = [ + "critical-section", +] + +[[package]] +name = "autocfg" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" + +[[package]] +name = "bitflags" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de" + +[[package]] +name = "byteorder" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "cobs" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67ba02a97a2bd10f4b59b25c7973101c79642302776489e030cd13cdab09ed15" + +[[package]] +name = "critical-section" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f64009896348fc5af4222e9cf7d7d82a95a256c634ebcf61c53e4ea461422242" + +[[package]] +name = "embedded-io" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef1a6892d9eef45c8fa6b9e0086428a2cca8491aca8f787c534a3d6d0bcb3ced" + +[[package]] +name = "embedded-io" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "edd0f118536f44f5ccd48bcb8b111bdc3de888b58c74639dfb034a357d0f206d" + +[[package]] +name = "hash32" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0c35f58762feb77d74ebe43bdbc3210f09be9fe6742234d573bacc26ed92b67" +dependencies = [ + "byteorder", +] + +[[package]] +name = "heapless" +version = "0.7.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cdc6457c0eb62c71aac4bc17216026d8410337c4126773b9c5daba343f17964f" +dependencies = [ + "atomic-polyfill", + "hash32", + "rustc_version", + "serde", + "spin", + "stable_deref_trait", +] + +[[package]] +name = "libc" +version = "0.2.159" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "561d97a539a36e26a9a5fad1ea11a3039a67714694aaa379433e580854bc3dc5" + +[[package]] +name = "lock_api" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" +dependencies = [ + "autocfg", + "scopeguard", +] + +[[package]] +name = "parking_lot" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" +dependencies = [ + "lock_api", + "parking_lot_core", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall", + "smallvec", + "windows-targets", +] + +[[package]] +name = "postcard" +version = "1.0.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f7f0a8d620d71c457dd1d47df76bb18960378da56af4527aaa10f515eee732e" +dependencies = [ + "cobs", + "embedded-io 0.4.0", + "embedded-io 0.6.1", + "heapless", + "serde", +] + +[[package]] +name = "proc-macro2" +version = "1.0.86" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e719e8df665df0d1c8fbfd238015744736151d4445ec0836b8e628aae103b77" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "proc_man" +version = "0.1.0" +dependencies = [ + "parking_lot", + "proc_man_rpc", + "syslog_rpc", +] + +[[package]] +name = "proc_man_rpc" +version = "0.1.0" +dependencies = [ + "parking_lot", + "postcard", + "proc_man_structs", +] + +[[package]] +name = "proc_man_structs" +version = "0.1.0" +dependencies = [ + "serde", +] + +[[package]] +name = "quote" +version = "1.0.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5b9d34b8991d19d98081b46eacdd8eb58c6f2b201139f7c5f643cc155a633af" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "redox_syscall" +version = "0.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b6dfecf2c74bce2466cabf93f6664d6998a69eb21e39f4207930065b27b771f" +dependencies = [ + "bitflags", +] + +[[package]] +name = "rustc_version" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" +dependencies = [ + "semver", +] + +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + +[[package]] +name = "semver" +version = "1.0.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61697e0a1c7e512e84a621326239844a24d8207b4669b41bc18b32ea5cbf988b" + +[[package]] +name = "serde" +version = "1.0.210" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.210" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "smallvec" +version = "1.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" + +[[package]] +name = "spin" +version = "0.9.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" +dependencies = [ + "lock_api", +] + +[[package]] +name = "stable_deref_trait" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" + +[[package]] +name = "syn" +version = "2.0.79" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89132cd0bf050864e1d38dc3bbc07a0eb8e7530af26344d3d2bbbef83499f590" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syslog_rpc" +version = "0.1.0" +dependencies = [ + "parking_lot", + "postcard", + "syslog_structs", +] + +[[package]] +name = "syslog_structs" +version = "0.1.0" +dependencies = [ + "serde", +] + +[[package]] +name = "unicode-ident" +version = "1.0.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e91b56cd4cadaeb79bbf1a5645f6b4f8dc5bde8834ad5894a8db35fda9efa1fe" + +[[package]] +name = "windows-targets" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" +dependencies = [ + "windows_aarch64_gnullvm", + "windows_aarch64_msvc", + "windows_i686_gnu", + "windows_i686_gnullvm", + "windows_i686_msvc", + "windows_x86_64_gnu", + "windows_x86_64_gnullvm", + "windows_x86_64_msvc", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" + +[[package]] +name = "windows_i686_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" + +[[package]] +name = "windows_i686_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 0000000..7f08dc1 --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,14 @@ +[package] +name = "proc_man" +version = "0.1.0" +edition = "2021" + +[dependencies] +parking_lot = "0.12.3" +proc_man_rpc = { version = "0.1.0", path = "proc_man_rpc" } +syslog_rpc = { version = "0.1.0", path = "../syslog/syslog_rpc" } + + +[patch.crates-io] +serde = { path = "../serde/serde" } +serde_derive = { path = "../serde/serde_derive" } diff --git a/proc_man_rpc/Cargo.lock b/proc_man_rpc/Cargo.lock new file mode 100644 index 0000000..1713c64 --- /dev/null +++ b/proc_man_rpc/Cargo.lock @@ -0,0 +1,317 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "atomic-polyfill" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8cf2bce30dfe09ef0bfaef228b9d414faaf7e563035494d7fe092dba54b300f4" +dependencies = [ + "critical-section", +] + +[[package]] +name = "autocfg" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" + +[[package]] +name = "bitflags" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de" + +[[package]] +name = "byteorder" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "cobs" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67ba02a97a2bd10f4b59b25c7973101c79642302776489e030cd13cdab09ed15" + +[[package]] +name = "critical-section" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f64009896348fc5af4222e9cf7d7d82a95a256c634ebcf61c53e4ea461422242" + +[[package]] +name = "embedded-io" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef1a6892d9eef45c8fa6b9e0086428a2cca8491aca8f787c534a3d6d0bcb3ced" + +[[package]] +name = "embedded-io" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "edd0f118536f44f5ccd48bcb8b111bdc3de888b58c74639dfb034a357d0f206d" + +[[package]] +name = "hash32" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0c35f58762feb77d74ebe43bdbc3210f09be9fe6742234d573bacc26ed92b67" +dependencies = [ + "byteorder", +] + +[[package]] +name = "heapless" +version = "0.7.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cdc6457c0eb62c71aac4bc17216026d8410337c4126773b9c5daba343f17964f" +dependencies = [ + "atomic-polyfill", + "hash32", + "rustc_version", + "serde", + "spin", + "stable_deref_trait", +] + +[[package]] +name = "libc" +version = "0.2.159" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "561d97a539a36e26a9a5fad1ea11a3039a67714694aaa379433e580854bc3dc5" + +[[package]] +name = "lock_api" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" +dependencies = [ + "autocfg", + "scopeguard", +] + +[[package]] +name = "parking_lot" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" +dependencies = [ + "lock_api", + "parking_lot_core", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall", + "smallvec", + "windows-targets", +] + +[[package]] +name = "postcard" +version = "1.0.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f7f0a8d620d71c457dd1d47df76bb18960378da56af4527aaa10f515eee732e" +dependencies = [ + "cobs", + "embedded-io 0.4.0", + "embedded-io 0.6.1", + "heapless", + "serde", +] + +[[package]] +name = "proc-macro2" +version = "1.0.86" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e719e8df665df0d1c8fbfd238015744736151d4445ec0836b8e628aae103b77" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "proc_man_rpc" +version = "0.1.0" +dependencies = [ + "parking_lot", + "postcard", + "proc_man_structs", +] + +[[package]] +name = "proc_man_structs" +version = "0.1.0" +dependencies = [ + "serde", +] + +[[package]] +name = "quote" +version = "1.0.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5b9d34b8991d19d98081b46eacdd8eb58c6f2b201139f7c5f643cc155a633af" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "redox_syscall" +version = "0.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b6dfecf2c74bce2466cabf93f6664d6998a69eb21e39f4207930065b27b771f" +dependencies = [ + "bitflags", +] + +[[package]] +name = "rustc_version" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" +dependencies = [ + "semver", +] + +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + +[[package]] +name = "semver" +version = "1.0.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61697e0a1c7e512e84a621326239844a24d8207b4669b41bc18b32ea5cbf988b" + +[[package]] +name = "serde" +version = "1.0.210" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.210" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "smallvec" +version = "1.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" + +[[package]] +name = "spin" +version = "0.9.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" +dependencies = [ + "lock_api", +] + +[[package]] +name = "stable_deref_trait" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" + +[[package]] +name = "syn" +version = "2.0.79" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89132cd0bf050864e1d38dc3bbc07a0eb8e7530af26344d3d2bbbef83499f590" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "unicode-ident" +version = "1.0.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e91b56cd4cadaeb79bbf1a5645f6b4f8dc5bde8834ad5894a8db35fda9efa1fe" + +[[package]] +name = "windows-targets" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" +dependencies = [ + "windows_aarch64_gnullvm", + "windows_aarch64_msvc", + "windows_i686_gnu", + "windows_i686_gnullvm", + "windows_i686_msvc", + "windows_x86_64_gnu", + "windows_x86_64_gnullvm", + "windows_x86_64_msvc", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" + +[[package]] +name = "windows_i686_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" + +[[package]] +name = "windows_i686_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" diff --git a/proc_man_rpc/Cargo.toml b/proc_man_rpc/Cargo.toml new file mode 100644 index 0000000..9e677ab --- /dev/null +++ b/proc_man_rpc/Cargo.toml @@ -0,0 +1,14 @@ +[package] +name = "proc_man_rpc" +version = "0.1.0" +edition = "2021" + +[dependencies] +parking_lot = "0.12.3" +postcard = { version = "1.0.10", features = ["use-std"] } +proc_man_structs = { version = "0.1.0", path = "../proc_man_structs" } + + +[patch.crates-io] +serde = { path = "../../serde/serde" } +serde_derive = { path = "../../serde/serde_derive" } diff --git a/proc_man_rpc/src/lib.rs b/proc_man_rpc/src/lib.rs new file mode 100644 index 0000000..6356321 --- /dev/null +++ b/proc_man_rpc/src/lib.rs @@ -0,0 +1,129 @@ +#![allow(clippy::result_unit_err)] + +use std::os::mikros::{ + ipc::rpc::{self, IncomingCall}, + Errno, +}; + +pub use proc_man_structs::WaitResult; + +use parking_lot::RwLock; + +static SERVER: RwLock>> = RwLock::new(None); + +const PROTO: u16 = 8; + +pub trait Server: Send + Sync { + fn new_proc(&self, pid: u64, parent: Option) -> Result<(), Errno>; + fn set_stdio(&self, pid: u64, stdio: [Option<(u64, u64)>; 3]) -> Result<(), Errno>; + fn get_stdio(&self, from: u64) -> [Option<(u64, u64)>; 3]; + fn set_cli_args(&self, pid: u64, args: Vec) -> Result<(), Errno>; + fn get_cli_args(&self, from: u64) -> Vec; + fn exit(&self, from: u64, code: u8); + fn wait(&self, from: u64, pid: u64, block: bool) -> Result; +} + +#[derive(Copy, Clone)] +pub struct Client(u64); + +impl Client { + pub fn new(pid: u64) -> Self { + Self(pid) + } + + pub fn new_proc(&self, pid: u64, parent: Option) -> Result<(), Errno> { + postcard::from_bytes( + &rpc::send_call(self.0, PROTO, 7, &postcard::to_stdvec(&(pid, parent)).unwrap()).get_return(), + ) + .unwrap() + } + + pub fn set_stdio(&self, pid: u64, stdio: [Option<(u64, u64)>; 3]) -> Result<(), Errno> { + postcard::from_bytes( + &rpc::send_call(self.0, PROTO, 0, &postcard::to_stdvec(&(pid, stdio)).unwrap()).get_return(), + ) + .unwrap() + } + + pub fn get_stdio(&self) -> [Option<(u64, u64)>; 3] { + postcard::from_bytes( + &rpc::send_call(self.0, PROTO, 1, &[]).get_return(), + ) + .unwrap() + } + + pub fn set_cli_args(&self, pid: u64, args: Vec) -> Result<(), Errno> { + postcard::from_bytes( + &rpc::send_call(self.0, PROTO, 2, &postcard::to_stdvec(&(pid, args)).unwrap()).get_return(), + ) + .unwrap() + } + + pub fn get_cli_args(&self) -> Vec { + postcard::from_bytes( + &rpc::send_call(self.0, PROTO, 3, &[]).get_return(), + ) + .unwrap() + } + + pub fn exit(&self, code: u8) { + postcard::from_bytes( + &rpc::send_call(self.0, PROTO, 4, &postcard::to_stdvec(&code).unwrap()).get_return(), + ) + .unwrap() + } + + pub fn wait(&self, pid: u64, block: bool) -> Result { + postcard::from_bytes( + &rpc::send_call(self.0, PROTO, 5, &postcard::to_stdvec(&(pid, block)).unwrap()).get_return(), + ) + .unwrap() + } +} + +pub fn register_server(server: Box) { + *SERVER.write() = Some(server); + rpc::register_callback(PROTO, callback); +} + +pub fn unregister_server() { + rpc::unregister_callback(PROTO); + *SERVER.write() = None; +} + +fn callback(call: IncomingCall) { + let server_lock = SERVER.read(); + let server = server_lock.as_ref().unwrap(); + if call.func == 0 { + let (pid, stdio )= postcard::from_bytes(call.args()).unwrap(); + let ret = postcard::to_stdvec(&server.set_stdio(pid, stdio)).unwrap(); + call.send_return(&ret); + } else if call.func == 1 { + let ret = postcard::to_stdvec(&server.get_stdio(call.from)).unwrap(); + call.send_return(&ret); + } else if call.func == 2 { + let (pid, args )= postcard::from_bytes(call.args()).unwrap(); + let ret = postcard::to_stdvec(&server.set_cli_args(pid, args)).unwrap(); + call.send_return(&ret); + } else if call.func == 3 { + let ret = postcard::to_stdvec(&server.get_cli_args(call.from)).unwrap(); + call.send_return(&ret); + } else if call.func == 4 { + let code = postcard::from_bytes(call.args()).unwrap(); + let ret = postcard::to_stdvec(&server.exit(call.from, code)).unwrap(); + call.send_return(&ret); + } else if call.func == 5 { + let (pid, block) = postcard::from_bytes(call.args()).unwrap(); + let ret = postcard::to_stdvec(&server.wait(call.from, pid, block)).unwrap(); + call.send_return(&ret); + } else if call.func == 6 { + let (pid, parent) = postcard::from_bytes(call.args()).unwrap(); + let _ = server.new_proc(pid, parent); + //let ret = postcard::to_stdvec(&server.new_proc(pid, parent)).unwrap(); + //call.send_return(&ret); + } else if call.func == 7 { + let (pid, parent) = postcard::from_bytes(call.args()).unwrap(); + let ret = postcard::to_stdvec(&server.new_proc(pid, parent)).unwrap(); + call.send_return(&ret); + } +} diff --git a/proc_man_structs/Cargo.lock b/proc_man_structs/Cargo.lock new file mode 100644 index 0000000..af7e52d --- /dev/null +++ b/proc_man_structs/Cargo.lock @@ -0,0 +1,61 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "proc-macro2" +version = "1.0.86" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e719e8df665df0d1c8fbfd238015744736151d4445ec0836b8e628aae103b77" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "proc_man_structs" +version = "0.1.0" +dependencies = [ + "serde", +] + +[[package]] +name = "quote" +version = "1.0.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5b9d34b8991d19d98081b46eacdd8eb58c6f2b201139f7c5f643cc155a633af" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "serde" +version = "1.0.210" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.210" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "syn" +version = "2.0.79" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89132cd0bf050864e1d38dc3bbc07a0eb8e7530af26344d3d2bbbef83499f590" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "unicode-ident" +version = "1.0.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e91b56cd4cadaeb79bbf1a5645f6b4f8dc5bde8834ad5894a8db35fda9efa1fe" diff --git a/proc_man_structs/Cargo.toml b/proc_man_structs/Cargo.toml new file mode 100644 index 0000000..cf5a5b8 --- /dev/null +++ b/proc_man_structs/Cargo.toml @@ -0,0 +1,11 @@ +[package] +name = "proc_man_structs" +version = "0.1.0" +edition = "2021" + +[dependencies] +serde = { path = "../../serde/serde", features = ["derive"] } + +[patch.crates-io] +serde = { path = "../../serde/serde" } +serde_derive = { path = "../../serde/serde_derive" } diff --git a/proc_man_structs/src/lib.rs b/proc_man_structs/src/lib.rs new file mode 100644 index 0000000..ce79948 --- /dev/null +++ b/proc_man_structs/src/lib.rs @@ -0,0 +1,7 @@ +use serde::{Deserialize, Serialize}; + +#[derive(Serialize, Deserialize)] +pub struct WaitResult { + pub pid: u64, + pub exit_code: u8, +} diff --git a/rust-toolchain.toml b/rust-toolchain.toml new file mode 100644 index 0000000..a5535e3 --- /dev/null +++ b/rust-toolchain.toml @@ -0,0 +1,2 @@ +[toolchain] +channel = "dev-x86_64-unknown-mikros" diff --git a/src/main.rs b/src/main.rs new file mode 100644 index 0000000..a708e60 --- /dev/null +++ b/src/main.rs @@ -0,0 +1,126 @@ +use std::{collections::HashMap, os::mikros::{self, ipc, syscalls, Errno}}; + +use parking_lot::RwLock; + +#[derive(Clone, Copy)] +enum ProcessStatus { + Running, + Exited(u8), +} + +struct Process { + stdio: [Option<(u64, u64)>; 3], + cli_args: Vec, + status: ProcessStatus, + parent: Option, + children: Vec, +} + +struct Serv { + processes: RwLock>, +} + +impl proc_man_rpc::Server for Serv { + fn new_proc(&self, pid: u64, parent: Option) -> Result<(), Errno> { + let syslog_pid = syscalls::try_get_registered(2).unwrap(); + let syslog_client = syslog_rpc::Client::new(syslog_pid); + syslog_client.send_text_message("proc_man", format!("Process {pid} created with parent {parent:?}")).unwrap(); + self.processes.write().insert(pid, Process { + stdio: [None; 3], + cli_args: Vec::new(), + status: ProcessStatus::Running, + parent, + children: Vec::new(), + }); + if let Some(parent) = parent { + self.processes.write().get_mut(&parent).unwrap().children.push(pid); + }; + Ok(()) + } + + fn set_stdio(&self, pid: u64, stdio: [Option<(u64, u64)>; 3]) -> Result<(), Errno> { + self.processes.write().get_mut(&pid).ok_or(Errno::ESRCH)?.stdio = stdio; + Ok(()) + } + + fn get_stdio(&self, from: u64) -> [Option<(u64, u64)>; 3] { + self.processes.read().get(&from).map_or([None; 3], |proc| proc.stdio) + } + + fn set_cli_args(&self, pid: u64, args: Vec) -> Result<(), Errno> { + self.processes.write().get_mut(&pid).ok_or(Errno::ESRCH)?.cli_args = args; + Ok(()) + } + + fn get_cli_args(&self, from: u64) -> Vec { + self.processes.read().get(&from).map_or(Vec::new(), |proc| proc.cli_args.clone()) + } + + fn exit(&self, from: u64, code: u8) { + if let Some(proc) = self.processes.write().get_mut(&from) { + proc.status = ProcessStatus::Exited(code); + } + } + + fn wait(&self, from: u64, pid: u64, block: bool) -> Result { + let processes = self.processes.read(); + let proc = processes.get(&from).ok_or(Errno::ESRCH)?; + if pid != 0 && !proc.children.contains(&pid) { + return Err(Errno::ECHILD); + } + std::mem::drop(processes); + if pid == 0 { + loop { + let processes = self.processes.read(); + let proc = processes.get(&from).ok_or(Errno::ESRCH)?; + for &pid in &proc.children { + let proc_status = self.processes.read().get(&pid).unwrap().status; + if let ProcessStatus::Exited(code) = proc_status { + self.processes.write().remove(&pid); + syscalls::clear_exited(pid).unwrap(); + self.processes.write().get_mut(&from).unwrap().children.retain(|&child| child != pid); + return Ok(proc_man_rpc::WaitResult { pid, exit_code: code }); + }; + } + std::mem::drop(processes); + if !block { + return Err(Errno::EAGAIN); + } + ipc::process_messages(); + } + } else { + loop { + let proc_status = self.processes.read().get(&pid).unwrap().status; + if let ProcessStatus::Exited(code) = proc_status { + self.processes.write().remove(&pid); + syscalls::clear_exited(pid).unwrap(); + self.processes.write().get_mut(&from).unwrap().children.retain(|&child| child != pid); + return Ok(proc_man_rpc::WaitResult { pid, exit_code: code }); + }; + if !block { + return Err(Errno::EAGAIN); + } + ipc::process_messages(); + } + } + } + +} + +fn main() { + let syslog_pid = loop { + if let Some(pid) = syscalls::try_get_registered(2) { + break pid; + } + }; + let syslog_client = syslog_rpc::Client::new(syslog_pid); + let serv = Serv { + processes: RwLock::new(HashMap::new()), + }; + proc_man_rpc::register_server(Box::new(serv)); + syscalls::register(3); + syslog_client.send_text_message("proc_man", "Process manager initialized").unwrap(); + loop { + ipc::process_messages(); + } +}