Skip to content

Commit c8ff60a

Browse files
committed
fix: add device unhiding on SIGINT and SIGTERM
1 parent 02f84df commit c8ff60a

File tree

1 file changed

+36
-44
lines changed

1 file changed

+36
-44
lines changed

src/main.rs

Lines changed: 36 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ use clap::Parser;
22
use std::env;
33
use std::error::Error;
44
use std::process;
5+
use tokio::signal::unix::SignalKind;
56
use zbus::fdo::ObjectManager;
67
use zbus::Connection;
78

@@ -60,57 +61,48 @@ async fn main() -> Result<(), Box<dyn Error>> {
6061
.at(object_manager_path, object_manager)
6162
.await?;
6263

64+
// Request the named bus
65+
if let Err(err) = connection.request_name(BUS_NAME).await {
66+
log::error!("Error requesting dbus name: {err}");
67+
process::exit(-1);
68+
}
69+
6370
// Create an InputManager instance
6471
let mut input_manager = Manager::new(connection.clone());
6572

66-
let (ctrl_c_result, input_man_result, request_name_result) = tokio::join!(
67-
// Setup CTRL+C handler
68-
tokio::spawn(async move {
69-
tokio::signal::ctrl_c().await.unwrap();
70-
log::info!("Un-hiding all devices");
71-
if let Err(e) = unhide_all().await {
72-
log::error!("Unable to un-hide devices: {:?}", e);
73-
}
74-
log::info!("Shutting down");
75-
process::exit(0);
76-
}),
77-
// Start the input manager and listen on DBus
78-
input_manager.run(),
79-
// Request the named bus
80-
connection.request_name(BUS_NAME)
81-
);
73+
// Setup signal handlers
74+
let mut sig_term = tokio::signal::unix::signal(SignalKind::terminate())?;
75+
let mut sig_int = tokio::signal::unix::signal(SignalKind::interrupt())?;
8276

83-
match ctrl_c_result {
84-
Ok(_) => {
85-
log::info!("The input manager task has exited");
86-
}
87-
Err(err) => {
88-
log::error!("Error in joining ctrl+C watcher: {err}");
89-
return Err(Box::new(err) as Box<dyn Error>);
77+
// Start the main run loop
78+
let mut exit_code = 0;
79+
tokio::select! {
80+
// Start the input manager and listen on DBus
81+
result = input_manager.run() => {
82+
if let Err(err) = result {
83+
log::error!("Error running input manager: {err}");
84+
exit_code = -1;
85+
}
86+
},
87+
// Setup CTRL+C handler
88+
_ = tokio::signal::ctrl_c() => {
89+
log::info!("Received CTRL+C. Shutting down.");
90+
},
91+
// Setup SIGINT handler
92+
_ = sig_int.recv() => {
93+
log::info!("Received SIGINT. Shutting down.");
94+
},
95+
// Setup SIGTERM handler
96+
_ = sig_term.recv() => {
97+
log::info!("Received SIGTERM. Shutting down.");
9098
}
9199
}
92100

93-
match request_name_result {
94-
Ok(_) => {
95-
log::info!("The input manager task has exited");
96-
}
97-
Err(err) => {
98-
log::error!("Error in joining dbus request name operation: {err}");
99-
return Err(Box::new(err));
100-
}
101-
};
102-
103-
match input_man_result {
104-
Ok(_) => {
105-
log::info!("The input manager task has exited");
106-
}
107-
Err(err) => {
108-
log::error!("Error in joining ctrl+C watcher: {err}");
109-
return Err(err);
110-
}
111-
};
101+
// Unhide all devices on shutdown
102+
if let Err(e) = unhide_all().await {
103+
log::error!("Unable to un-hide devices: {:?}", e);
104+
}
112105

113106
log::info!("InputPlumber stopped");
114-
115-
Ok(())
107+
process::exit(exit_code);
116108
}

0 commit comments

Comments
 (0)