@@ -105,6 +105,17 @@ fn main() {
105105 let options = build_cli ( ) . get_matches ( ) ;
106106 let config = get_config ( ) ;
107107
108+ let errors = RuntimeErrors :: default ( ) ;
109+ let error_listen_for_ctrlc = Arc :: new ( Mutex :: new ( errors) ) ;
110+ let errors_for_rayon = error_listen_for_ctrlc. clone ( ) ;
111+ let errors_final = error_listen_for_ctrlc. clone ( ) ;
112+
113+ ctrlc:: set_handler ( move || {
114+ error_listen_for_ctrlc. lock ( ) . unwrap ( ) . abort = true ;
115+ println ! ( "\n Aborting" ) ;
116+ } )
117+ . expect ( "Error setting Ctrl-C handler" ) ;
118+
108119 let target_dirs = match options. get_many :: < String > ( "params" ) {
109120 Some ( values) => values. map ( |v| v. as_str ( ) ) . collect :: < Vec < & str > > ( ) ,
110121 None => vec ! [ "." ] ,
@@ -197,7 +208,7 @@ fn main() {
197208 ignore_hidden,
198209 follow_links,
199210 progress_data : indicator. data . clone ( ) ,
200- errors : Arc :: new ( Mutex :: new ( RuntimeErrors :: default ( ) ) ) ,
211+ errors : errors_for_rayon ,
201212 } ;
202213 let stack_size = config. get_custom_stack_size ( & options) ;
203214 init_rayon ( & stack_size) ;
@@ -222,6 +233,10 @@ fn main() {
222233 // Must have stopped indicator before we print to stderr
223234 indicator. stop ( ) ;
224235
236+ if errors_final. lock ( ) . unwrap ( ) . abort {
237+ return ;
238+ }
239+
225240 let final_errors = walk_data. errors . lock ( ) . unwrap ( ) ;
226241 let failed_permissions = final_errors. no_permissions ;
227242 if !final_errors. file_not_found . is_empty ( ) {
0 commit comments