From 8f33945633c1a83a56dae943c5606f6e5e4b7169 Mon Sep 17 00:00:00 2001 From: Michael Mikovsky <77305074+Astatin3@users.noreply.github.com> Date: Sat, 8 Nov 2025 10:30:21 -0700 Subject: [PATCH] Rename test module, kinda get connection working. --- unshell-cli/Cargo.lock | 167 ++++++++++++++++++ unshell-cli/Cargo.toml | 7 + unshell-cli/build.sh | 6 + unshell-cli/src/main.rs | 40 +++++ unshell-module-test/Cargo.lock | 47 ----- unshell-module-test/src/lib.rs | 74 -------- unshell-modules/src/manager.rs | 7 +- .../Cargo.lock | 18 +- .../Cargo.toml | 2 +- .../src/main.rs | 4 +- .../.cargo/config.toml | 0 unshell-test-module/Cargo.lock | 160 +++++++++++++++++ .../Cargo.toml | 17 +- .../build.sh | 2 +- .../src/client/client_runtime.rs | 79 +++++++++ unshell-test-module/src/client/mod.rs | 38 ++++ unshell-test-module/src/lib.rs | 36 ++++ unshell-test-module/src/server/mod.rs | 3 + .../src/server/server_runtime.rs | 105 +++++++++++ 19 files changed, 669 insertions(+), 143 deletions(-) create mode 100644 unshell-cli/Cargo.lock create mode 100644 unshell-cli/Cargo.toml create mode 100755 unshell-cli/build.sh create mode 100644 unshell-cli/src/main.rs delete mode 100644 unshell-module-test/Cargo.lock delete mode 100644 unshell-module-test/src/lib.rs rename {unshell-module-load => unshell-payload}/Cargo.lock (99%) rename {unshell-module-load => unshell-payload}/Cargo.toml (94%) rename {unshell-module-load => unshell-payload}/src/main.rs (89%) rename {unshell-module-test => unshell-test-module}/.cargo/config.toml (100%) create mode 100644 unshell-test-module/Cargo.lock rename {unshell-module-test => unshell-test-module}/Cargo.toml (55%) rename {unshell-module-test => unshell-test-module}/build.sh (89%) create mode 100644 unshell-test-module/src/client/client_runtime.rs create mode 100644 unshell-test-module/src/client/mod.rs create mode 100644 unshell-test-module/src/lib.rs create mode 100644 unshell-test-module/src/server/mod.rs create mode 100644 unshell-test-module/src/server/server_runtime.rs diff --git a/unshell-cli/Cargo.lock b/unshell-cli/Cargo.lock new file mode 100644 index 0000000..872aa97 --- /dev/null +++ b/unshell-cli/Cargo.lock @@ -0,0 +1,167 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "bincode" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "36eaf5d7b090263e8150820482d5d93cd964a81e4019913c972f4edcc6edb740" +dependencies = [ + "bincode_derive", + "serde", + "unty", +] + +[[package]] +name = "bincode_derive" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf95709a440f45e986983918d0e8a1f30a9b1df04918fc828670606804ac3c09" +dependencies = [ + "virtue", +] + +[[package]] +name = "cfg-if" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" + +[[package]] +name = "crossbeam-channel" +version = "0.5.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82b8f8f868b36967f9606790d1903570de9ceaf870a7bf9fbbd3016d636a2cb2" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" + +[[package]] +name = "libloading" +version = "0.8.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7c4b02199fee7c5d21a5ae7d8cfa79a6ef5bb2fc834d6e9058e89c825efdc55" +dependencies = [ + "cfg-if", + "windows-link", +] + +[[package]] +name = "log" +version = "0.4.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34080505efa8e45a4b816c349525ebe327ceaa8559756f0356cba97ef3bf7432" + +[[package]] +name = "proc-macro2" +version = "1.0.103" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ee95bc4ef87b8d5ba32e8b7714ccc834865276eab0aed5c9958d00ec45f49e8" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quote" +version = "1.0.42" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a338cc41d27e6cc6dce6cefc13a0729dfbb81c262b1f519331575dd80ef3067f" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "serde" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" +dependencies = [ + "serde_core", +] + +[[package]] +name = "serde_core" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "syn" +version = "2.0.109" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f17c7e013e88258aa9543dcbe81aca68a667a9ac37cd69c9fbc07858bfe0e2f" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "unicode-ident" +version = "1.0.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9312f7c4f6ff9069b165498234ce8be658059c6728633667c526e27dc2cf1df5" + +[[package]] +name = "unshell-cli" +version = "0.1.0" +dependencies = [ + "unshell-test-module", +] + +[[package]] +name = "unshell-modules" +version = "0.1.0" +dependencies = [ + "libloading", + "log", +] + +[[package]] +name = "unshell-test-module" +version = "0.1.0" +dependencies = [ + "bincode", + "crossbeam-channel", + "log", + "unshell-modules", +] + +[[package]] +name = "unty" +version = "0.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d49784317cd0d1ee7ec5c716dd598ec5b4483ea832a2dced265471cc0f690ae" + +[[package]] +name = "virtue" +version = "0.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "051eb1abcf10076295e815102942cc58f9d5e3b4560e46e53c21e8ff6f3af7b1" + +[[package]] +name = "windows-link" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" diff --git a/unshell-cli/Cargo.toml b/unshell-cli/Cargo.toml new file mode 100644 index 0000000..7237dbc --- /dev/null +++ b/unshell-cli/Cargo.toml @@ -0,0 +1,7 @@ +[package] +name = "unshell-cli" +version = "0.1.0" +edition = "2024" + +[dependencies] +unshell-test-module = {path = "../unshell-test-module"}#, default-features = false, features = ["server-component"]} diff --git a/unshell-cli/build.sh b/unshell-cli/build.sh new file mode 100755 index 0000000..9649c98 --- /dev/null +++ b/unshell-cli/build.sh @@ -0,0 +1,6 @@ +RUSTFLAGS="-Zlocation-detail=none -Zfmt-debug=none" cargo +nightly run \ + -Z build-std=std,panic_abort \ + -Z build-std-features="optimize_for_size" \ + --profile release $@ + +# upx ./target/release/libunshell_module_test.so diff --git a/unshell-cli/src/main.rs b/unshell-cli/src/main.rs new file mode 100644 index 0000000..bf9ee0f --- /dev/null +++ b/unshell-cli/src/main.rs @@ -0,0 +1,40 @@ +use std::io::{Write, stdin, stdout}; + +use unshell_test_module::Announcement; + +// use unshell_test_module::ListenerRuntime; + +// fn print_continue_prompt(str: &str) { +// printl +// } + +fn main() { + let mut serverruntime = unshell_test_module::ListenerRuntime::new(); + + loop { + print!("> "); + stdout().flush().expect("Failed to flush stdout"); + let mut input = String::new(); + stdin().read_line(&mut input).expect("Failed to read line"); + let args = input.trim().split(" ").collect::>(); + + match args[0] { + "" => {} + "test" => { + if let Some(arg) = args.get(1) { + println!("Test with argument: {}", arg); + serverruntime + .send(&Announcement::TestAnnouncement(arg.to_string())) + .unwrap(); + } else { + println!("Test without argument"); + } + } + _ => { + println!("Invalid Command: '{}'", args[0]); + } + } + + // println!("{:?}", args); + } +} diff --git a/unshell-module-test/Cargo.lock b/unshell-module-test/Cargo.lock deleted file mode 100644 index 9f9cc98..0000000 --- a/unshell-module-test/Cargo.lock +++ /dev/null @@ -1,47 +0,0 @@ -# This file is automatically @generated by Cargo. -# It is not intended for manual editing. -version = 4 - -[[package]] -name = "cfg-if" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" - -[[package]] -name = "libloading" -version = "0.8.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7c4b02199fee7c5d21a5ae7d8cfa79a6ef5bb2fc834d6e9058e89c825efdc55" -dependencies = [ - "cfg-if", - "windows-link", -] - -[[package]] -name = "log" -version = "0.4.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34080505efa8e45a4b816c349525ebe327ceaa8559756f0356cba97ef3bf7432" - -[[package]] -name = "unshell-module-test" -version = "0.1.0" -dependencies = [ - "log", - "unshell-modules", -] - -[[package]] -name = "unshell-modules" -version = "0.1.0" -dependencies = [ - "libloading", - "log", -] - -[[package]] -name = "windows-link" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" diff --git a/unshell-module-test/src/lib.rs b/unshell-module-test/src/lib.rs deleted file mode 100644 index 71b3c82..0000000 --- a/unshell-module-test/src/lib.rs +++ /dev/null @@ -1,74 +0,0 @@ -#![no_main] -#[macro_use] -extern crate log; - -use std::{ - sync::{Arc, Mutex}, - thread::{self, JoinHandle}, - time::Duration, -}; - -// pub use unshell_logger::setup_logger; -pub use unshell_modules::setup_logger; -use unshell_modules::{Manager, ModuleRuntime, module_interface}; - -extern "C" fn test1() { - warn!("Test1 called"); -} -extern "C" fn test2() { - warn!("Test2 called"); -} -extern "C" fn test3() { - warn!("Test3 called"); -} - -module_interface! { - Interface { - fn test1(); - fn test2(); - fn test3(); - } -} - -#[unsafe(no_mangle)] -pub fn interface() -> Interface { - Interface::from_raw(test1, test2, test3) -} - -struct RuntimeTest { - thread_handle: JoinHandle<()>, -} - -impl RuntimeTest { - pub fn new(manager: Arc>) -> RuntimeTest { - Self { - thread_handle: thread::spawn(move || { - thread::sleep(Duration::from_secs(2)); - - let manager_lock = manager.lock().unwrap(); - manager_lock.test1234(111.1111); - drop(manager_lock); - }), - } - } -} - -impl ModuleRuntime for RuntimeTest { - // fn init(&mut self) {} - - fn is_running(&self) -> bool { - !self.thread_handle.is_finished() - } - - fn kill(self: Box) { - if !self.thread_handle.is_finished() { - let _ = self.thread_handle.join(); - } - // drop(self); - } -} - -#[unsafe(no_mangle)] -pub fn init(manager: Arc>) -> Box { - Box::new(RuntimeTest::new(manager)) -} diff --git a/unshell-modules/src/manager.rs b/unshell-modules/src/manager.rs index fdeec44..317d69c 100644 --- a/unshell-modules/src/manager.rs +++ b/unshell-modules/src/manager.rs @@ -38,17 +38,14 @@ impl Manager { let runtime = init(this.clone()); + info!("Initialized {}", i); + runtimes.push(runtime); } Self::join(&mut runtimes); } - // /// Helper function to retrieve ManagerInterface type, for interfacing with ModuleManager accross FFI boundry. - // pub fn get_interface(&self) -> ManagerInterface { - // ManagerInterface::from_raw(Self::get_manager) - // } - /// Iterateratively loop through all runtimes, until all are finished executing pub fn join(runtimes: &mut Vec>) { // let mut len = runtimes.len().clone(); diff --git a/unshell-module-load/Cargo.lock b/unshell-payload/Cargo.lock similarity index 99% rename from unshell-module-load/Cargo.lock rename to unshell-payload/Cargo.lock index 8c1abd9..b83733b 100644 --- a/unshell-module-load/Cargo.lock +++ b/unshell-payload/Cargo.lock @@ -324,7 +324,15 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9312f7c4f6ff9069b165498234ce8be658059c6728633667c526e27dc2cf1df5" [[package]] -name = "unshell-module-load" +name = "unshell-modules" +version = "0.1.0" +dependencies = [ + "libloading", + "log", +] + +[[package]] +name = "unshell-payload" version = "0.1.0" dependencies = [ "env_logger 0.11.8", @@ -334,14 +342,6 @@ dependencies = [ "unshell-modules", ] -[[package]] -name = "unshell-modules" -version = "0.1.0" -dependencies = [ - "libloading", - "log", -] - [[package]] name = "utf8parse" version = "0.2.2" diff --git a/unshell-module-load/Cargo.toml b/unshell-payload/Cargo.toml similarity index 94% rename from unshell-module-load/Cargo.toml rename to unshell-payload/Cargo.toml index 41159ac..6936611 100644 --- a/unshell-module-load/Cargo.toml +++ b/unshell-payload/Cargo.toml @@ -1,7 +1,7 @@ # cargo-features = ["trim-paths"] [package] -name = "unshell-module-load" +name = "unshell-payload" version = "0.1.0" edition = "2024" diff --git a/unshell-module-load/src/main.rs b/unshell-payload/src/main.rs similarity index 89% rename from unshell-module-load/src/main.rs rename to unshell-payload/src/main.rs index b1574d4..b19000c 100644 --- a/unshell-module-load/src/main.rs +++ b/unshell-payload/src/main.rs @@ -3,8 +3,6 @@ use unshell_modules::{Manager, Module, ModuleError, module_interface}; #[macro_use] extern crate log; -// use unshell_modules::{Module, ModuleError, module_interface}; - module_interface! { Interface { fn test1(); @@ -17,7 +15,7 @@ fn main() { // Init the logger (This uses like 600MB of storage) pretty_env_logger::init(); - info!("Initalized"); + info!("Initialized"); match || -> Result<(), ModuleError> { let args = std::env::args(); diff --git a/unshell-module-test/.cargo/config.toml b/unshell-test-module/.cargo/config.toml similarity index 100% rename from unshell-module-test/.cargo/config.toml rename to unshell-test-module/.cargo/config.toml diff --git a/unshell-test-module/Cargo.lock b/unshell-test-module/Cargo.lock new file mode 100644 index 0000000..aa9bc06 --- /dev/null +++ b/unshell-test-module/Cargo.lock @@ -0,0 +1,160 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "bincode" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "36eaf5d7b090263e8150820482d5d93cd964a81e4019913c972f4edcc6edb740" +dependencies = [ + "bincode_derive", + "serde", + "unty", +] + +[[package]] +name = "bincode_derive" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf95709a440f45e986983918d0e8a1f30a9b1df04918fc828670606804ac3c09" +dependencies = [ + "virtue", +] + +[[package]] +name = "cfg-if" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" + +[[package]] +name = "crossbeam-channel" +version = "0.5.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82b8f8f868b36967f9606790d1903570de9ceaf870a7bf9fbbd3016d636a2cb2" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" + +[[package]] +name = "libloading" +version = "0.8.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7c4b02199fee7c5d21a5ae7d8cfa79a6ef5bb2fc834d6e9058e89c825efdc55" +dependencies = [ + "cfg-if", + "windows-link", +] + +[[package]] +name = "log" +version = "0.4.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34080505efa8e45a4b816c349525ebe327ceaa8559756f0356cba97ef3bf7432" + +[[package]] +name = "proc-macro2" +version = "1.0.103" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ee95bc4ef87b8d5ba32e8b7714ccc834865276eab0aed5c9958d00ec45f49e8" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quote" +version = "1.0.42" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a338cc41d27e6cc6dce6cefc13a0729dfbb81c262b1f519331575dd80ef3067f" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "serde" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" +dependencies = [ + "serde_core", +] + +[[package]] +name = "serde_core" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "syn" +version = "2.0.109" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f17c7e013e88258aa9543dcbe81aca68a667a9ac37cd69c9fbc07858bfe0e2f" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "unicode-ident" +version = "1.0.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9312f7c4f6ff9069b165498234ce8be658059c6728633667c526e27dc2cf1df5" + +[[package]] +name = "unshell-modules" +version = "0.1.0" +dependencies = [ + "libloading", + "log", +] + +[[package]] +name = "unshell-test-module" +version = "0.1.0" +dependencies = [ + "bincode", + "crossbeam-channel", + "log", + "unshell-modules", +] + +[[package]] +name = "unty" +version = "0.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d49784317cd0d1ee7ec5c716dd598ec5b4483ea832a2dced265471cc0f690ae" + +[[package]] +name = "virtue" +version = "0.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "051eb1abcf10076295e815102942cc58f9d5e3b4560e46e53c21e8ff6f3af7b1" + +[[package]] +name = "windows-link" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" diff --git a/unshell-module-test/Cargo.toml b/unshell-test-module/Cargo.toml similarity index 55% rename from unshell-module-test/Cargo.toml rename to unshell-test-module/Cargo.toml index 1938959..c6bdc5d 100644 --- a/unshell-module-test/Cargo.toml +++ b/unshell-test-module/Cargo.toml @@ -1,5 +1,7 @@ +cargo-features = ["trim-paths"] + [package] -name = "unshell-module-test" +name = "unshell-test-module" version = "0.1.0" edition = "2024" @@ -7,6 +9,12 @@ edition = "2024" [lib] crate-type = ["cdylib"] +[features] +default = ["client-component", "server-component"] +client-component = [] +server-component = [] +# server = [] + [profile.release] strip = true # Strip symbols from the binary # strip = "debuginfo" @@ -15,10 +23,13 @@ lto = true codegen-units = 1 panic = "abort" debug = false +trim-paths = "all" + +# crate-type = ["cdylib"] [dependencies] +bincode = "2.0.1" +crossbeam-channel = "0.5.15" log = "0.4.28" -# unshell-logger = {path = "../unshell-logger"} unshell-modules = {path = "../unshell-modules"} -# log = "0.4.28" diff --git a/unshell-module-test/build.sh b/unshell-test-module/build.sh similarity index 89% rename from unshell-module-test/build.sh rename to unshell-test-module/build.sh index 346e792..77f28ba 100755 --- a/unshell-module-test/build.sh +++ b/unshell-test-module/build.sh @@ -1,6 +1,6 @@ RUSTFLAGS="-Zlocation-detail=none -Zfmt-debug=none" cargo +nightly build \ -Z build-std=std,panic_abort \ -Z build-std-features="optimize_for_size" \ - --release + --profile release $@ # upx ./target/release/libunshell_module_test.so diff --git a/unshell-test-module/src/client/client_runtime.rs b/unshell-test-module/src/client/client_runtime.rs new file mode 100644 index 0000000..49e947d --- /dev/null +++ b/unshell-test-module/src/client/client_runtime.rs @@ -0,0 +1,79 @@ +use std::{ + io::Read, + net::TcpStream, + sync::{ + Arc, Mutex, + atomic::{AtomicBool, Ordering}, + }, + thread::{self, JoinHandle}, +}; + +use unshell_modules::{Manager, ModuleRuntime}; + +use crate::Announcement; + +pub struct RuntimeTest { + thread_handle: JoinHandle<()>, + join_signal: Arc, +} + +impl RuntimeTest { + pub fn new(_manager: Arc>) -> RuntimeTest { + let join_signal = Arc::new(AtomicBool::new(false)); + let join_clone = join_signal.clone(); + + Self { + thread_handle: thread::spawn(move || { + info!("Connecting to server..."); + let mut stream = TcpStream::connect("localhost:1234").unwrap(); + info!("Connectied"); + // let reader = BufReader::new(stream.try_clone().unwrap()); + // let mut writer = BufWriter::new(stream.try_clone().unwrap()); + + // let (a, b) = crossbeam_channel::unbounded(); + + // a. + + // if join_receiver.len() == 0 { + // join_receiver.recv().unwrap(); + // } + + while !join_clone.load(Ordering::Relaxed) { + let mut size_buf = [0u8; 4]; + stream.read_exact(&mut size_buf).unwrap(); + let size = u32::from_be_bytes(size_buf); + + let mut buf = vec![0u8; size as usize]; + + stream.read_exact(&mut buf).unwrap(); + + let a = Announcement::decode(&buf).unwrap(); + + match a { + Announcement::TestAnnouncement(s) => { + info!("Received test announcement: {}", s) + } + } + } + }), + join_signal, + } + } +} + +impl ModuleRuntime for RuntimeTest { + // fn init(&mut self) {} + + fn is_running(&self) -> bool { + // println!("Checking if running"); + !self.thread_handle.is_finished() + } + + fn kill(self: Box) { + if !self.thread_handle.is_finished() { + self.join_signal.store(true, Ordering::Relaxed); + let _ = self.thread_handle.join(); + } + // drop(self); + } +} diff --git a/unshell-test-module/src/client/mod.rs b/unshell-test-module/src/client/mod.rs new file mode 100644 index 0000000..c8dce3c --- /dev/null +++ b/unshell-test-module/src/client/mod.rs @@ -0,0 +1,38 @@ +mod client_runtime; + +use std::sync::{Arc, Mutex}; + +pub use unshell_modules::setup_logger; + +use unshell_modules::{Manager, ModuleRuntime, module_interface}; + +use crate::client::client_runtime::RuntimeTest; + +pub extern "C" fn test1() { + warn!("Test1 called"); +} +pub extern "C" fn test2() { + warn!("Test2 called"); +} +pub extern "C" fn test3() { + warn!("Test3 called"); +} + +module_interface! { + Interface { + fn test1(); + fn test2(); + fn test3(); + } +} + +#[unsafe(no_mangle)] +pub fn interface() -> Interface { + Interface::from_raw(test1, test2, test3) +} + +#[unsafe(no_mangle)] +pub fn init(manager: Arc>) -> Box { + info!("Initializing client module"); + Box::new(RuntimeTest::new(manager)) +} diff --git a/unshell-test-module/src/lib.rs b/unshell-test-module/src/lib.rs new file mode 100644 index 0000000..d061d6a --- /dev/null +++ b/unshell-test-module/src/lib.rs @@ -0,0 +1,36 @@ +#![no_main] +#[macro_use] +extern crate log; + +use bincode::{Decode, Encode}; + +#[cfg(feature = "client-component")] +mod client; +#[cfg(feature = "client-component")] +pub use client::*; + +#[cfg(feature = "server-component")] +mod server; +#[cfg(feature = "server-component")] +pub use server::ListenerRuntime; + +#[derive(Debug, Encode, Decode)] +pub enum Announcement { + TestAnnouncement(String), +} + +const BINCODE_CONFIG: bincode::config::Configuration = bincode::config::standard(); + +impl Announcement { + pub fn encode(&self) -> Vec { + bincode::encode_to_vec(self, BINCODE_CONFIG).unwrap() + } + + pub fn decode(bytes: &[u8]) -> Option { + if let Ok((decoded, _)) = bincode::decode_from_slice(&bytes[..], BINCODE_CONFIG) { + Some(decoded) + } else { + None + } + } +} diff --git a/unshell-test-module/src/server/mod.rs b/unshell-test-module/src/server/mod.rs new file mode 100644 index 0000000..f1aad13 --- /dev/null +++ b/unshell-test-module/src/server/mod.rs @@ -0,0 +1,3 @@ +mod server_runtime; + +pub use server_runtime::ListenerRuntime; diff --git a/unshell-test-module/src/server/server_runtime.rs b/unshell-test-module/src/server/server_runtime.rs new file mode 100644 index 0000000..9217ca4 --- /dev/null +++ b/unshell-test-module/src/server/server_runtime.rs @@ -0,0 +1,105 @@ +use std::{ + io::Write, + net::{TcpListener, TcpStream}, + sync::{Arc, Mutex}, + thread::{self, JoinHandle}, +}; + +use unshell_modules::ModuleRuntime; + +use crate::Announcement; + +pub struct ListenerRuntime { + thread_handle: JoinHandle<()>, + // listener: TcpListener, + streams: Arc>>, + // reader: BufReader, + // writer: BufWriter, +} + +impl ListenerRuntime { + pub fn new() -> ListenerRuntime { + info!("Starting listener runtime on 127.0.0.1:1234"); + let listener = TcpListener::bind("127.0.0.1:1234").unwrap(); + let streams = Arc::new(Mutex::new(Vec::new())); + + let streams_clone = streams.clone(); + + let thread_handle = thread::spawn(move || { + let streams = streams_clone.clone(); + for stream in listener.incoming() { + let stream = stream.unwrap(); + println!("New connection from {}", stream.peer_addr().unwrap()); + streams.lock().unwrap().push(stream); + + // thread::spawn(move || { + // let _ = handle_connection(&mut stream); + // info!("Connection from {} closed", stream.peer_addr().unwrap()); + // }); + } + }); + + // let reader = BufReader::new(stream.try_clone().unwrap()); + // let writer = BufWriter::new(stream.try_clone().unwrap()); + + Self { + thread_handle, + streams, + // stream, + // reader, + // writer, + // thread_handle: thread::spawn(move || { + + // for stream in listener.incoming() { + // let mut stream = stream.unwrap(); + + // thread::spawn(move || { + // let _ = handle_connection(&mut stream); + // info!("Connection from {} closed", stream.peer_addr().unwrap()); + // }); + // } + // // thread::sleep(Duration::from_secs(2)); + + // // let manager_lock = manager.lock().unwrap(); + // // manager_lock.test1234(111.1111); + // // drop(manager_lock); + // }), + } + } + + pub fn send(&mut self, announcement: &Announcement) -> Result<(), std::io::Error> { + let bytes = announcement.encode(); + + let mut streams = self.streams.lock().unwrap(); + + for stream in streams.iter_mut() { + stream.write_all(&u32::to_be_bytes(bytes.len() as u32))?; + stream.write_all(&bytes)?; + stream.flush()?; + } + + println!("Announcement {:?} sent", announcement); + + Ok(()) + + // self.stream + // .write_all(&u32::to_be_bytes(bytes.len() as u32))?; + // self.stream.write_all(&bytes)?; + // self.stream.flush()?; + } +} + +impl ModuleRuntime for ListenerRuntime { + // fn init(&mut self) {} + + fn is_running(&self) -> bool { + true + } + + fn kill(self: Box) { + if !self.thread_handle.is_finished() { + let _ = self.thread_handle.join(); + } + // drop(self); + } +}