use std::io::{self, Write}; use std::thread; use std::time::Duration; fn main() { if let Err(err) = try_main() { eprintln!("{err}"); std::process::exit(1); } } fn try_main() -> io::Result<()> { let mut sleep_seconds = 0; let mut fail = false; let mut suicide = false; let mut args = std::env::args().skip(1).peekable(); while let Some(arg) = args.peek() { match arg.as_str() { "-f" => fail = true, "-s" => suicide = true, _ => break, } args.next(); } if let Some(arg) = args.next() { sleep_seconds = arg.parse().unwrap_or_else(|_| { eprintln!("error: invalid number of seconds"); std::process::exit(1); }); } thread::sleep(Duration::from_secs(sleep_seconds)); if fail { return Err(io::ErrorKind::Other.into()); } if suicide { #[cfg(unix)] unsafe { let pid = signals::getpid(); if pid > 0 { signals::kill(pid, 9); } } } Ok(()) } #[cfg(unix)] mod signals { use std::os::raw::c_int; extern "C" { pub fn kill(pid: c_int, sig: c_int) -> c_int; pub fn getpid() -> c_int; } }