@@ -241,16 +241,16 @@ impl Display for FileChecksumResult {
241241/// name might contain non-utf-8 characters.
242242fn write_file_report < W : Write > (
243243 mut w : W ,
244- filename : & [ u8 ] ,
244+ filename : & OsStr ,
245245 result : FileChecksumResult ,
246- prefix : & str ,
247246 verbose : ChecksumVerbose ,
248- ) {
247+ ) -> io :: Result < ( ) > {
249248 if result. can_display ( verbose) {
250- let _ = write ! ( w , "{prefix}" ) ;
251- let _ = w . write_all ( filename ) ;
252- let _ = writeln ! ( w, ": {result}" ) ;
249+ let filename = locale_aware_escape_name ( filename , QuotingStyle :: SHELL_ESCAPE ) ;
250+ // Here, .to_string_lossy() is lossless thanks to the escaping.
251+ writeln ! ( w, "{} : {result}" , filename . to_string_lossy ( ) ) ? ;
253252 }
253+ Ok ( ( ) )
254254}
255255
256256#[ derive( Debug , PartialEq , Eq , Clone , Copy ) ]
@@ -543,17 +543,14 @@ fn get_file_to_check(
543543 filename : & OsStr ,
544544 opts : ChecksumValidateOptions ,
545545) -> Result < Box < dyn Read > , LineCheckError > {
546- let filename_bytes = os_str_as_bytes ( filename) . map_err ( |e| LineCheckError :: UError ( e. into ( ) ) ) ?;
547-
548546 if filename == "-" {
549547 Ok ( Box :: new ( stdin ( ) ) ) // Use stdin if "-" is specified in the checksum file
550548 } else {
551549 let failed_open = || {
552- write_file_report (
550+ let _ = write_file_report (
553551 io:: stdout ( ) ,
554- filename_bytes ,
552+ filename ,
555553 FileChecksumResult :: CantOpen ,
556- "" ,
557554 opts. verbose ,
558555 ) ;
559556 } ;
@@ -686,7 +683,7 @@ fn compute_and_check_digest_from_file(
686683 algo : SizedAlgoKind ,
687684 opts : ChecksumValidateOptions ,
688685) -> Result < ( ) , LineCheckError > {
689- let ( filename_to_check_unescaped, prefix ) = unescape_filename ( filename) ;
686+ let ( filename_to_check_unescaped, _prefix ) = unescape_filename ( filename) ;
690687 let real_filename_to_check = os_str_from_bytes ( & filename_to_check_unescaped) ?;
691688
692689 // Open the input file
@@ -708,11 +705,10 @@ fn compute_and_check_digest_from_file(
708705 . to_string( )
709706 } ) ) ;
710707
711- write_file_report (
708+ let _ = write_file_report (
712709 io:: stdout ( ) ,
713- filename ,
710+ & real_filename_to_check ,
714711 FileChecksumResult :: CantOpen ,
715- prefix,
716712 opts. verbose ,
717713 ) ;
718714 return Err ( LineCheckError :: CantOpenFile ) ;
@@ -725,11 +721,10 @@ fn compute_and_check_digest_from_file(
725721 DigestOutput :: Crc ( n) => n. to_be_bytes ( ) == expected_checksum,
726722 DigestOutput :: U16 ( n) => n. to_be_bytes ( ) == expected_checksum,
727723 } ;
728- write_file_report (
724+ let _ = write_file_report (
729725 io:: stdout ( ) ,
730- filename ,
726+ & real_filename_to_check ,
731727 FileChecksumResult :: from_bool ( checksum_correct) ,
732- prefix,
733728 opts. verbose ,
734729 ) ;
735730
@@ -1278,37 +1273,33 @@ mod tests {
12781273 fn test_write_file_report ( ) {
12791274 let opts = ChecksumValidateOptions :: default ( ) ;
12801275
1281- let cases: & [ ( & [ u8 ] , FileChecksumResult , & str , & [ u8 ] ) ] = & [
1282- ( b"filename" , FileChecksumResult :: Ok , "" , b"filename: OK\n " ) ,
1276+ let cases: & [ ( OsString , FileChecksumResult , & [ u8 ] ) ] = & [
1277+ (
1278+ OsString :: from ( "filename" ) ,
1279+ FileChecksumResult :: Ok ,
1280+ b"filename: OK\n " ,
1281+ ) ,
12831282 (
1284- b "filename",
1283+ OsString :: from ( "filename" ) ,
12851284 FileChecksumResult :: Failed ,
1286- "" ,
12871285 b"filename: FAILED\n " ,
12881286 ) ,
12891287 (
1290- b "filename",
1288+ OsString :: from ( "filename" ) ,
12911289 FileChecksumResult :: CantOpen ,
1292- "" ,
12931290 b"filename: FAILED open or read\n " ,
12941291 ) ,
12951292 (
1296- b"filename" ,
1297- FileChecksumResult :: Ok ,
1298- "prefix" ,
1299- b"prefixfilename: OK\n " ,
1300- ) ,
1301- (
1302- b"funky\xff name" ,
1293+ #[ allow( clippy:: unwrap_used, reason = "deterministic unwrap does not fail" ) ]
1294+ os_str_from_bytes ( b"funky\xff name" ) . unwrap ( ) . to_os_string ( ) ,
13031295 FileChecksumResult :: Ok ,
1304- "" ,
1305- b"funky\xff name: OK\n " ,
1296+ b"'funky'$'\\ 377''name': OK\n " ,
13061297 ) ,
13071298 ] ;
13081299
1309- for ( filename, result, prefix , expected) in cases {
1300+ for ( filename, result, expected) in cases {
13101301 let mut buffer: Vec < u8 > = vec ! [ ] ;
1311- write_file_report ( & mut buffer, filename, * result, prefix , opts. verbose ) ;
1302+ let _ = write_file_report ( & mut buffer, filename, * result, opts. verbose ) ;
13121303 assert_eq ! ( & buffer, expected) ;
13131304 }
13141305 }
0 commit comments