diff --git a/01_phase_rust_src/sv/Cargo.toml b/01_phase_rust_src/sv/Cargo.toml index 950a8e0..43f8a44 100644 --- a/01_phase_rust_src/sv/Cargo.toml +++ b/01_phase_rust_src/sv/Cargo.toml @@ -1,8 +1,9 @@ [package] name = "sv" -version = "0.1.0" -edition = "2021" +version = "0.2.0" +edition = "2024" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] +tokio = { version = "1.37.0", features = ["full"] } diff --git a/01_phase_rust_src/sv/src/status_obj.rs b/01_phase_rust_src/sv/src/status_obj.rs index 14a10ae..8ca8c69 100644 --- a/01_phase_rust_src/sv/src/status_obj.rs +++ b/01_phase_rust_src/sv/src/status_obj.rs @@ -8,7 +8,6 @@ use std::io::prelude::*; use std::time::SystemTime; - pub struct StatusObj { svname: String, // Service name svpath: String, // Service path @@ -35,15 +34,18 @@ impl StatusObj { println!("fail: {}: unable to change to service directory: file does not exist", sv); return None } - let ok_option = Path::new("supervise/ok"); - if ! ok_option.exists() { - println!("warning: {}: unable to open supervise/ok: file does not exist", sv); + + // Check if supervise/control and supervise/ok exists, and if runsv running. + let control_exists = misc::check_fifo(sv.clone(), "supervise/ok"); + if control_exists == false { + return None; + } + let control_exists = misc::check_fifo(sv.clone(), "supervise/control"); + if control_exists == false { return None; } - // TODO: check if there is a process reading the pipes. supervise/control and supervise/ok - // piste : https://docs.rs/tokio/latest/tokio/net/unix/pipe/struct.OpenOptions.html let status_option = fs::OpenOptions::new().read(true).open("supervise/status"); let mut status = match status_option { Ok(file) => file, @@ -180,4 +182,3 @@ impl StatusObj { } } - diff --git a/01_phase_rust_src/sv/src/status_obj/misc.rs b/01_phase_rust_src/sv/src/status_obj/misc.rs index 896e2d5..85dbd6c 100644 --- a/01_phase_rust_src/sv/src/status_obj/misc.rs +++ b/01_phase_rust_src/sv/src/status_obj/misc.rs @@ -1,4 +1,9 @@ +use std::io::ErrorKind; + +use tokio::net::unix::pipe; +use tokio::runtime::Runtime; + pub fn make_pause_run(pr_int: u8) -> bool { if pr_int == 0 { return false // run @@ -72,3 +77,26 @@ pub fn return_u8_in_u64(table: Vec) -> u64 { return r } +pub fn check_fifo(sv: String, path: &str) -> bool { + // Check if fifo is available. If yes, return true. + // If no, return false. + let rt = Runtime::new().unwrap(); + let _guard = rt.enter(); + + let sender = pipe::OpenOptions::new().open_sender(path); + match sender { + Ok(..) => {}, + Err(e) => match e.kind() { + ErrorKind::NotFound => { + println!("warning: {sv}: unable to open {path}: file does not exist"); + return false; + }, + _ => { + println!("fail: {sv}: runsv not running"); + return false; + } + }, + }; + + return true +}