diff --git a/Cargo.lock b/Cargo.lock index 48b0fdf..5c8f806 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -24,6 +24,15 @@ dependencies = [ "winapi 0.3.9", ] +[[package]] +name = "async-ctrlc" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "907279f6e91a51c8ec7cac24711e8308f21da7c10c7700ca2f7e125694ed2df1" +dependencies = [ + "ctrlc", +] + [[package]] name = "atty" version = "0.2.14" @@ -43,9 +52,9 @@ checksum = "cdb031dd78e28731d87d56cc8ffef4a8f36ca26c38fe2de700543e627f8a464a" [[package]] name = "backtrace" -version = "0.3.56" +version = "0.3.57" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d117600f438b1707d4e4ae15d3595657288f8235a0eb593e80ecc98ab34e1bc" +checksum = "78ed203b9ba68b242c62b3fb7480f589dd49829be1edb3fe8fc8b4ffda2dcb8d" dependencies = [ "addr2line", "cfg-if", @@ -88,6 +97,12 @@ version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4964518bd3b4a8190e832886cdc0da9794f12e8e6c1613a9e90ff331c4c8724b" +[[package]] +name = "cc" +version = "1.0.67" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3c69b077ad434294d3ce9f1f6143a2a4b89a8a2d54ef813d85003a4fd1137fd" + [[package]] name = "cfg-if" version = "1.0.0" @@ -131,6 +146,16 @@ dependencies = [ "cfg-if", ] +[[package]] +name = "ctrlc" +version = "3.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "232295399409a8b7ae41276757b5a1cc21032848d42bff2352261f958b3ca29a" +dependencies = [ + "nix", + "winapi 0.3.9", +] + [[package]] name = "darwin-libproc" version = "0.2.0" @@ -290,9 +315,9 @@ checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" [[package]] name = "libc" -version = "0.2.93" +version = "0.2.94" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9385f66bf6105b241aa65a61cb923ef20efc665cb9f9bb50ac2f0c4b7f378d41" +checksum = "18794a8ad5b29321f790b55d93dfba91e125cb1a9edbd4f8e3150acc771c1a5e" [[package]] name = "lock_api" @@ -350,6 +375,18 @@ dependencies = [ "winapi 0.3.9", ] +[[package]] +name = "nix" +version = "0.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa9b4819da1bc61c0ea48b63b7bc8604064dd43013e7cc325df098d49cd7c18a" +dependencies = [ + "bitflags", + "cc", + "cfg-if", + "libc", +] + [[package]] name = "ntapi" version = "0.3.6" @@ -629,6 +666,7 @@ checksum = "fe0f37c9e8f3c5a4a66ad655a93c74daac4ad00c441533bf5c6e7990bb42604e" name = "spraycc" version = "0.9.0" dependencies = [ + "async-ctrlc", "bincode", "byteorder", "bytes", @@ -658,9 +696,9 @@ checksum = "8ea5119cdb4c55b55d432abb513a0429384878c15dde60cc77b1c99de1a95a6a" [[package]] name = "syn" -version = "1.0.69" +version = "1.0.70" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48fe99c6bd8b1cc636890bcc071842de909d902c81ac7dab53ba33c421ab8ffb" +checksum = "b9505f307c872bab8eb46f77ae357c8eba1fdacead58ee5a850116b1d7f82883" dependencies = [ "proc-macro2", "quote", diff --git a/Cargo.toml b/Cargo.toml index fcfa619..088692a 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -5,6 +5,7 @@ authors = ["Jason McCampbell "] edition = "2018" [dependencies] +async-ctrlc = "^1.2" bincode = "1" byteorder = "1" bytes = "^1" diff --git a/src/server.rs b/src/server.rs index 0234b1a..da6d3fe 100644 --- a/src/server.rs +++ b/src/server.rs @@ -1,3 +1,4 @@ +extern crate async_ctrlc; extern crate get_if_addrs; extern crate priority_queue; extern crate rand; @@ -459,6 +460,9 @@ pub async fn run(max_cpus: Option, alt_start_cmd: bool, both_queues: bool let watchdog = tokio::time::sleep(Duration::from_secs(5)); tokio::pin!(watchdog); + // Future waiting for ctrl-C signal. Can this realistically fail and need better error handling? + let mut ctrlc = async_ctrlc::CtrlC::new().expect("Error installing ctrl-C handler, aborting"); + // Server state includes the user configuration from .spraycc, plus overrides let mut server_state = ServerState::new(callme, user_key, max_cpus, alt_start_cmd, both_queues, verbose); let user_private_key = server_state.user_private_key; @@ -495,6 +499,10 @@ pub async fn run(max_cpus: Option, alt_start_cmd: bool, both_queues: bool server_state.bytes_this_period = ByteUnit::Byte(0); watchdog.as_mut().reset(Instant::now() + Duration::from_secs(5)); } + _ = &mut ctrlc => { + println!("SprayCC: ctrl-C received, shutting down"); + break; + } } if server_state.ok_to_shutdown() {