diff --git a/src/uu/hashsum/src/hashsum.rs b/src/uu/hashsum/src/hashsum.rs index e2e904343..828436595 100644 --- a/src/uu/hashsum/src/hashsum.rs +++ b/src/uu/hashsum/src/hashsum.rs @@ -498,7 +498,8 @@ where I: Iterator, { let mut bad_format = 0; - let mut failed = 0; + let mut failed_cksum = 0; + let mut failed_open_file = 0; let binary_marker = if options.binary { "*" } else { " " }; for filename in files { let filename = Path::new(filename); @@ -574,8 +575,19 @@ where } }, }; - let f = File::open(ck_filename) - .map_err_context(|| "failed to open file".to_string())?; + let f = match File::open(ck_filename) { + Err(_) => { + failed_open_file += 1; + println!( + "{}: {}: No such file or directory", + uucore::util_name(), + ck_filename + ); + println!("{}: FAILED open or read", ck_filename); + continue; + } + Ok(file) => file, + }; let mut ckf = BufReader::new(Box::new(f) as Box); let real_sum = digest_reader( &mut options.digest, @@ -602,7 +614,7 @@ where if !options.status { println!("{}: FAILED", ck_filename); } - failed += 1; + failed_cksum += 1; } } } else { @@ -628,8 +640,15 @@ where Ordering::Greater => show_warning!("{} lines are improperly formatted", bad_format), _ => {} }; - if failed > 0 { - show_warning!("{} computed checksum did NOT match", failed); + if failed_cksum > 0 { + show_warning!("{} computed checksum did NOT match", failed_cksum); + } + match failed_open_file.cmp(&1) { + Ordering::Equal => show_warning!("{} listed file could not be read", failed_open_file), + Ordering::Greater => { + show_warning!("{} listed files could not be read", failed_open_file); + } + _ => {} } } diff --git a/tests/by-util/test_hashsum.rs b/tests/by-util/test_hashsum.rs index 5fdc6e648..dea958bef 100644 --- a/tests/by-util/test_hashsum.rs +++ b/tests/by-util/test_hashsum.rs @@ -117,6 +117,26 @@ fn test_check_sha1() { .stderr_is(""); } +#[test] +fn test_check_file_not_found_warning() { + let scene = TestScenario::new(util_name!()); + let at = &scene.fixtures; + + at.write("testf", "foobar\n"); + at.write( + "testf.sha1", + "988881adc9fc3655077dc2d4d757d480b5ea0e11 testf\n", + ); + at.remove("testf"); + scene + .ccmd("sha1sum") + .arg("-c") + .arg(at.subdir.join("testf.sha1")) + .succeeds() + .stdout_is("sha1sum: testf: No such file or directory\ntestf: FAILED open or read\n") + .stderr_is("sha1sum: warning: 1 listed file could not be read"); +} + #[test] fn test_invalid_arg() { new_ucmd!().arg("--definitely-invalid").fails().code_is(1);