@@ -2,6 +2,7 @@ use clap::Parser;
22use std:: env;
33use std:: error:: Error ;
44use std:: process;
5+ use tokio:: signal:: unix:: SignalKind ;
56use zbus:: fdo:: ObjectManager ;
67use 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