From 3e0d9274653bf4e4445724342ff4dc62dc0db94c Mon Sep 17 00:00:00 2001 From: Michael Mikovsky <77305074+Astatin3@users.noreply.github.com> Date: Thu, 6 Nov 2025 00:01:46 -0700 Subject: [PATCH] Add manager --- unshell-logger/Cargo.lock | 16 ---- unshell-logger/Cargo.toml | 7 -- unshell-module-load/Cargo.lock | 9 +-- unshell-module-load/Cargo.toml | 2 +- unshell-module-load/src/main.rs | 74 ++++++------------- unshell-module-load/src/manager.rs | 31 ++++++++ unshell-module-test/Cargo.lock | 9 +-- unshell-module-test/Cargo.toml | 2 +- unshell-module-test/src/lib.rs | 11 ++- unshell-modules/Cargo.lock | 7 ++ unshell-modules/Cargo.toml | 1 + unshell-modules/src/callable.rs | 32 -------- unshell-modules/src/lib.rs | 46 +++++------- .../lib.rs => unshell-modules/src/logger.rs | 0 unshell-modules/src/module.rs | 46 ++++++++++++ 15 files changed, 137 insertions(+), 156 deletions(-) delete mode 100644 unshell-logger/Cargo.lock delete mode 100644 unshell-logger/Cargo.toml create mode 100644 unshell-module-load/src/manager.rs delete mode 100644 unshell-modules/src/callable.rs rename unshell-logger/src/lib.rs => unshell-modules/src/logger.rs (100%) create mode 100644 unshell-modules/src/module.rs diff --git a/unshell-logger/Cargo.lock b/unshell-logger/Cargo.lock deleted file mode 100644 index d697be3..0000000 --- a/unshell-logger/Cargo.lock +++ /dev/null @@ -1,16 +0,0 @@ -# This file is automatically @generated by Cargo. -# It is not intended for manual editing. -version = 4 - -[[package]] -name = "log" -version = "0.4.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34080505efa8e45a4b816c349525ebe327ceaa8559756f0356cba97ef3bf7432" - -[[package]] -name = "unshell-logger" -version = "0.1.0" -dependencies = [ - "log", -] diff --git a/unshell-logger/Cargo.toml b/unshell-logger/Cargo.toml deleted file mode 100644 index bf9af90..0000000 --- a/unshell-logger/Cargo.toml +++ /dev/null @@ -1,7 +0,0 @@ -[package] -name = "unshell-logger" -version = "0.1.0" -edition = "2024" - -[dependencies] -log = "0.4.28" diff --git a/unshell-module-load/Cargo.lock b/unshell-module-load/Cargo.lock index c86803b..17c89bd 100644 --- a/unshell-module-load/Cargo.lock +++ b/unshell-module-load/Cargo.lock @@ -129,13 +129,6 @@ dependencies = [ "winapi-util", ] -[[package]] -name = "unshell-logger" -version = "0.1.0" -dependencies = [ - "log", -] - [[package]] name = "unshell-module-load" version = "0.1.0" @@ -143,7 +136,6 @@ dependencies = [ "libloading", "log", "pretty_env_logger", - "unshell-logger", "unshell-modules", ] @@ -152,6 +144,7 @@ name = "unshell-modules" version = "0.1.0" dependencies = [ "libloading", + "log", ] [[package]] diff --git a/unshell-module-load/Cargo.toml b/unshell-module-load/Cargo.toml index 5ffa2fe..33b15a6 100644 --- a/unshell-module-load/Cargo.toml +++ b/unshell-module-load/Cargo.toml @@ -9,7 +9,7 @@ edition = "2024" libloading = "0.8.9" log = "0.4.28" pretty_env_logger = "0.5.0" -unshell-logger = {path = "../unshell-logger"} +# unshell-logger = {path = "../unshell-logger"} unshell-modules = {path = "../unshell-modules"} [profile.release] diff --git a/unshell-module-load/src/main.rs b/unshell-module-load/src/main.rs index c628f9c..c8ced95 100644 --- a/unshell-module-load/src/main.rs +++ b/unshell-module-load/src/main.rs @@ -1,10 +1,15 @@ +// #![no] + #[macro_use] extern crate log; -use libloading::{Library, Symbol}; -use log::{info, warn}; -use unshell_logger::SetupLogger; -use unshell_modules::module_interface; +mod manager; + +use std::sync::{Arc, Mutex}; + +use unshell_modules::{Module, ModuleError, module_interface}; + +use crate::manager::Manager; module_interface! { Interface { @@ -14,50 +19,7 @@ module_interface! { } } -#[allow(dead_code)] -#[derive(Debug)] -enum ModuleError { - LibLoadingError(libloading::Error), - LinkError(String), -} - -struct Module { - name: String, - lib: Library, -} - -impl Module { - pub fn new(path: &str) -> Result { - let lib = unsafe { Library::new(&path) }.map_err(|e| ModuleError::LibLoadingError(e))?; - - Ok(Self { - name: path.to_owned(), - lib, - }) - } - pub fn get_symbol(&self, symbol: &[u8]) -> Result, ModuleError> { - let symbol = unsafe { self.lib.get::(symbol) } - .map_err(|e| ModuleError::LinkError(format!("Failed to load symbol: {}", e)))?; - - Ok(symbol) - } - pub fn init_logger(&self) { - if let Ok(setup_logger) = self.get_symbol::(b"setup_logger") { - setup_logger(log::logger(), log::max_level()).unwrap(); - } else { - warn!("setup_logger not found"); - } - } - pub fn get_interface(&self) -> Result { - if let Ok(interface_function) = self.get_symbol:: T>(b"interface") { - Ok(interface_function()) - } else { - Err(ModuleError::LinkError(format!( - "Interface function not found!" - ))) - } - } -} +// const modules: Arc>> = Arc::new(Mutex::new(Vec::new())); fn main() { pretty_env_logger::init(); @@ -65,13 +27,19 @@ fn main() { info!("Initalized"); match || -> Result<(), ModuleError> { - let module = - Module::new("../unshell-module-test/target/release/libunshell_module_test.so")?; - module.init_logger(); + let args = std::env::args(); - let interface = module.get_interface::()?; + let mut modules = Vec::new(); + for arg in args.skip(1) { + modules.push(Module::new(&arg)?) + } + let _manager = Manager::new(modules); - interface.test1(); + // for i in 1..args.len() {} + + // let interface = module.get_interface::()?; + + // interface.test1(); Ok(()) }() { diff --git a/unshell-module-load/src/manager.rs b/unshell-module-load/src/manager.rs new file mode 100644 index 0000000..e52a6fc --- /dev/null +++ b/unshell-module-load/src/manager.rs @@ -0,0 +1,31 @@ +use unshell_modules::{ManagerInterface, Module}; + +pub struct Manager { + modules: Vec, +} + +impl Manager { + pub fn new(modules: Vec) -> Self { + let this = Self { modules }; + + let interface = this.get_interface(); + + for module in &this.modules { + if let Ok(init) = module.get_symbol::(b"init") { + init(interface.clone()); + } else { + warn!("init not found"); + } + } + + this + } + + pub fn get_interface(&self) -> ManagerInterface { + ManagerInterface::from_raw(Self::test123) + } + + pub extern "C" fn test123() { + info!("Manager Test Sucsessfull!"); + } +} diff --git a/unshell-module-test/Cargo.lock b/unshell-module-test/Cargo.lock index fc0fdea..9f9cc98 100644 --- a/unshell-module-test/Cargo.lock +++ b/unshell-module-test/Cargo.lock @@ -24,19 +24,11 @@ version = "0.4.28" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "34080505efa8e45a4b816c349525ebe327ceaa8559756f0356cba97ef3bf7432" -[[package]] -name = "unshell-logger" -version = "0.1.0" -dependencies = [ - "log", -] - [[package]] name = "unshell-module-test" version = "0.1.0" dependencies = [ "log", - "unshell-logger", "unshell-modules", ] @@ -45,6 +37,7 @@ name = "unshell-modules" version = "0.1.0" dependencies = [ "libloading", + "log", ] [[package]] diff --git a/unshell-module-test/Cargo.toml b/unshell-module-test/Cargo.toml index db023b1..1938959 100644 --- a/unshell-module-test/Cargo.toml +++ b/unshell-module-test/Cargo.toml @@ -19,6 +19,6 @@ debug = false [dependencies] log = "0.4.28" -unshell-logger = {path = "../unshell-logger"} +# unshell-logger = {path = "../unshell-logger"} unshell-modules = {path = "../unshell-modules"} # log = "0.4.28" diff --git a/unshell-module-test/src/lib.rs b/unshell-module-test/src/lib.rs index 0ddb790..3b1788f 100644 --- a/unshell-module-test/src/lib.rs +++ b/unshell-module-test/src/lib.rs @@ -2,8 +2,11 @@ #[macro_use] extern crate log; -pub use unshell_logger::setup_logger; -use unshell_modules::module_interface; +use std::thread::{self, Thread}; + +// pub use unshell_logger::setup_logger; +pub use unshell_modules::setup_logger; +use unshell_modules::{ManagerInterface, module_interface}; extern "C" fn test1() { warn!("Test1 called"); @@ -29,6 +32,6 @@ pub fn interface() -> Interface { } #[unsafe(no_mangle)] -pub fn testfunc() { - info!("testfunc called"); +pub fn init(interface: ManagerInterface) { + thread::spawn(|| {}); } diff --git a/unshell-modules/Cargo.lock b/unshell-modules/Cargo.lock index 8e701a3..b5085a9 100644 --- a/unshell-modules/Cargo.lock +++ b/unshell-modules/Cargo.lock @@ -18,11 +18,18 @@ dependencies = [ "windows-link", ] +[[package]] +name = "log" +version = "0.4.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34080505efa8e45a4b816c349525ebe327ceaa8559756f0356cba97ef3bf7432" + [[package]] name = "unshell-modules" version = "0.1.0" dependencies = [ "libloading", + "log", ] [[package]] diff --git a/unshell-modules/Cargo.toml b/unshell-modules/Cargo.toml index b124559..d22673a 100644 --- a/unshell-modules/Cargo.toml +++ b/unshell-modules/Cargo.toml @@ -9,3 +9,4 @@ default = ["exec"] [dependencies] libloading = {version = "0.8.9", optional = true} +log = "0.4.28" diff --git a/unshell-modules/src/callable.rs b/unshell-modules/src/callable.rs deleted file mode 100644 index de4ebd4..0000000 --- a/unshell-modules/src/callable.rs +++ /dev/null @@ -1,32 +0,0 @@ -// enum CallableArg { -// Void, -// String, -// Int32, -// Uint32, -// } - -// enum CallableArgFilled { -// String(String), -// Int32(i32), -// Uint32(u32), -// } - -// struct Callable { -// name: String, -// args: Vec, -// return_type: CallableArg, -// } - -// impl Callable { -// fn new(name: String, args: Vec) -> Self { -// Callable { name, args } -// } -// fn call(&self, args: Vec, lib: &libloading::Library) -> Result<(), String> { -// unsafe { -// //TODO: Call the function with the given arguments -// let func = lib.get::< (Find function type) >(self.name.as_bytes()); -// unsafe { func() }; -// } -// Ok(()) -// } -// } diff --git a/unshell-modules/src/lib.rs b/unshell-modules/src/lib.rs index 5db8284..75086f6 100644 --- a/unshell-modules/src/lib.rs +++ b/unshell-modules/src/lib.rs @@ -1,3 +1,18 @@ +#[macro_use] +extern crate log; + +mod logger; +mod module; + +pub use logger::setup_logger; +pub use module::Module; + +#[derive(Debug)] +pub enum ModuleError { + LibLoadingError(libloading::Error), + LinkError(String), +} + #[macro_export] macro_rules! module_interface { ($interface_name:ident { $(fn $fn_name:ident($($arg:ident : $ty:ty),* $(,)?) $(-> $ret:ty)?);* $(;)? }) => { @@ -34,30 +49,9 @@ macro_rules! module_interface { } }; } -// mod callable; -// pub enum Error { -// LibLoadingError(libloading::Error), -// } - -// #[cfg(feature = "exec")] -// pub struct Module { -// lib: libloading::Library, -// } - -// impl Module { -// pub fn new(path: &str) -> Result { -// let lib = -// unsafe { libloading::Library::new(path) }.map_err(|e| Error::LibLoadingError(e))?; -// Ok(Module { lib }) -// } -// pub fn functions(&self) { -// // self.lib. - -// // self.lib.get(name).map_err(|e| Error::LibLoadingError(e)) -// } -// } - -// pub use callable::Callable; -// pub use callable::Function; -// pub use callable::wrap; +module_interface! { + ManagerInterface { + fn test123(); + } +} diff --git a/unshell-logger/src/lib.rs b/unshell-modules/src/logger.rs similarity index 100% rename from unshell-logger/src/lib.rs rename to unshell-modules/src/logger.rs diff --git a/unshell-modules/src/module.rs b/unshell-modules/src/module.rs new file mode 100644 index 0000000..617fe20 --- /dev/null +++ b/unshell-modules/src/module.rs @@ -0,0 +1,46 @@ +use libloading::{Library, Symbol}; + +use crate::{ModuleError, logger::SetupLogger}; + +pub struct Module { + // name: String, + lib: Library, +} + +impl Module { + pub fn new(path: &str) -> Result { + let lib = unsafe { Library::new(&path) }.map_err(|e| ModuleError::LibLoadingError(e))?; + + let this = Self { + // name: path.to_owned(), + lib, + }; + + if let Ok(setup_logger) = this.get_symbol::(b"setup_logger") { + setup_logger(log::logger(), log::max_level()).unwrap(); + } else { + warn!("setup_logger not found"); + } + + Ok(this) + } + pub fn get_symbol(&self, symbol: &[u8]) -> Result, ModuleError> { + let symbol = unsafe { self.lib.get::(symbol) } + .map_err(|e| ModuleError::LinkError(format!("Failed to load symbol: {}", e)))?; + + Ok(symbol) + } + pub fn get_interface(&self) -> Result { + if let Ok(interface_function) = self.get_symbol:: T>(b"interface") { + Ok(interface_function()) + } else { + Err(ModuleError::LinkError(format!( + "Interface function not found!" + ))) + } + } +} + +// extern "C" fn test1234() { +// info!("Test1234!"); +// }