diff --git a/Cargo.lock b/Cargo.lock index f7120d5..acb8106 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -100,6 +100,12 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" +[[package]] +name = "cfg_aliases" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" + [[package]] name = "clap" version = "4.5.38" @@ -184,6 +190,16 @@ dependencies = [ "cfg-if", ] +[[package]] +name = "ctrlc" +version = "3.4.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46f93780a459b7d656ef7f071fe699c4d3d2cb201c4b24d085b6ddc505276e73" +dependencies = [ + "nix", + "windows-sys 0.59.0", +] + [[package]] name = "deranged" version = "0.4.0" @@ -530,6 +546,18 @@ dependencies = [ "adler2", ] +[[package]] +name = "nix" +version = "0.30.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74523f3a35e05aba87a1d978330aef40f67b0304ac79c1c00b294c9830543db6" +dependencies = [ + "bitflags", + "cfg-if", + "cfg_aliases", + "libc", +] + [[package]] name = "num-conv" version = "0.1.0" @@ -749,6 +777,7 @@ name = "shrupl" version = "0.1.0" dependencies = [ "clap", + "ctrlc", "dirs-next", "env_logger", "log", diff --git a/Cargo.toml b/Cargo.toml index b424a76..5b14233 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -6,6 +6,7 @@ description = "ShrUpl is a tool to upload files to a Sharry Instance through a p [dependencies] clap = { version = "4.5.38", features = ["derive"] } +ctrlc = { version = "3.4.7", features = ["termination"] } dirs-next = "2.0.0" env_logger = "0.11.8" log = "0.4.27" diff --git a/src/main.rs b/src/main.rs index eb52dbe..31b7d67 100644 --- a/src/main.rs +++ b/src/main.rs @@ -2,6 +2,11 @@ mod appstate; mod cli; mod sharry; +use std::sync::{ + Arc, + atomic::{AtomicBool, Ordering}, +}; + use clap::Parser; use log::{error, info}; use ureq::Agent; @@ -10,6 +15,12 @@ use appstate::AppState; use cli::Cli; fn main() { + let running = Arc::new(AtomicBool::new(true)); + let r = running.clone(); + + ctrlc::set_handler(move || r.store(false, Ordering::SeqCst)) + .expect("Error setting Ctrl-C handler"); + env_logger::init(); let args = Cli::parse(); @@ -45,8 +56,13 @@ fn main() { } state.save().unwrap(); - } - info!("uploads done"); + if !running.load(Ordering::SeqCst) { + info!("terminating ..."); + std::process::exit(0); + } + } + + info!("uploads done"); state.clear().unwrap(); }