diff --git a/bin/daemon.rs b/bin/daemon.rs index 0ef8c0874653a836e3140574ccf7e68e6d06098e..6f77c53c4e213443a68a4b195f1ce918736037b5 100644 --- a/bin/daemon.rs +++ b/bin/daemon.rs @@ -108,7 +108,7 @@ pub fn db_remove_link(path: &String) { }; } -fn run_child(cmd: &str, args: &Vec) -> i32 { +pub fn run_child(cmd: &str, args: &Vec) -> i32 { log::info!("run child: {}, {}", cmd, args.join(" ").to_string()); let mut child = match Command::new(cmd).args(args).stdout(Stdio::piped()).spawn() { Ok(child) => child, diff --git a/bin/main.rs b/bin/main.rs index dc846acfa64bbe3c9359a806eb4be859ada04add..61aecfc52a2ca10324bee77eecbe9fd7874a5b73 100644 --- a/bin/main.rs +++ b/bin/main.rs @@ -12,6 +12,7 @@ mod daemon; mod coredump_monitor; +use crate::daemon::run_child; use crate::daemon::daemon_loop; use crate::coredump_monitor::coredump_monitor_loop; @@ -23,39 +24,61 @@ use std::thread; const APP_NAME: &str = "sysboostd"; +fn test_kmod() -> i32 { + let mut args: Vec = Vec::new(); + args.push("-c".to_string()); + args.push("lsmod | grep binfmt_rto".to_string()); + let ret = run_child("/usr/bin/bash", &args); + if ret == 0 { + println!("binfmt_rto.ko is ready"); + } else { + println!("binfmt_rto.ko is not ready"); + } + return ret; +} + fn main() { let args: Vec = env::args().collect(); - let argc = args.len(); - let mut mode = "default"; - - if argc != 1 { - // arg0 is program name, parameter is from arg1 - let cur_arg = 1; + let mut is_debug = false; + let mut is_daemon = false; - if args[cur_arg] == "-debug" { - mode = "debug"; - } else if args[cur_arg] == "-daemon" { - mode = "daemon"; + // arg0 is program name, parameter is from arg1 + for i in 1..args.len() { + match args[i].as_str() { + "--debug" => { + is_debug = true; + } + "--daemon" => { + is_daemon = true; + } + "--test-kmod" => { + std::process::exit(test_kmod()); + } + _ => { + println!("parameter is wrong"); + std::process::exit(-1); + } } } - if mode == "debug" { + if is_debug { logger::init_log_to_console(APP_NAME, log::LevelFilter::Debug); } else { logger::init_log(APP_NAME, log::LevelFilter::Info, "syslog", None); } log::info!("{} running", APP_NAME); - if mode == "daemon" { + if is_daemon { let daemonize = Daemonize::new(); match daemonize.start() { Ok(_) => log::info!("On Daemon"), Err(e) => { log::error!("Error, {}", e); - return; + std::process::exit(-1); } } } + // start up coredump monitor let _coredump_monitor_handle = thread::spawn(||{ coredump_monitor_loop(); diff --git a/sysboost.service b/sysboost.service index e2d607ed0eefc88c2101e19fd12a30d29a14ee54..a6dcc74dda4b44bbd466bf76e709535757d21ab9 100644 --- a/sysboost.service +++ b/sysboost.service @@ -5,7 +5,7 @@ After=sysboost.service [Service] Type=forking -ExecStart=/usr/bin/sysboostd -daemon +ExecStart=/usr/bin/sysboostd --daemon Restart=always [Install] diff --git a/tests/bash/Makefile b/tests/bash/Makefile index ac1c8a0cea70fb8b62cca28d4c7c17fb50160cc5..f9c266d9db20b093540cea2ba991bb5a46581c6c 100644 --- a/tests/bash/Makefile +++ b/tests/bash/Makefile @@ -1,6 +1,7 @@ # SPDX-License-Identifier: MulanPSL-2.0 -ROOT_DIR=../../ -BUILD_DIR=$(ROOT_DIR)build +ROOT_DIR=../.. +SYSBOOSTD=$(ROOT_DIR)/target/debug/sysboostd +BUILD_DIR=$(ROOT_DIR)/build SYSBOOST=$(BUILD_DIR)/src/sysboost RELOCATION_DIR=/usr/lib/relocation @@ -42,6 +43,7 @@ ifeq ($(MODE), --static-nold) bash: clear make -C $(ROOT_DIR) + $(SYSBOOSTD) --test-kmod @echo ===rto=== $(SYSBOOST) $(MODE) $(BASH) $(LIBTINFO) $(LIBC) readelf -W -a $(BASH).rto > bash.rto.elf