Solve the freeze in case no runsv to listen to fifo.
This commit is contained in:
parent
3b44aa3a07
commit
b971ae1c6c
3 changed files with 39 additions and 9 deletions
|
@ -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"] }
|
||||
|
|
|
@ -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 {
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -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<u8>) -> 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
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue