Skip to content

Commit

Permalink
cksum: fix error handling
Browse files Browse the repository at this point in the history
  • Loading branch information
Luv-Ray committed Oct 20, 2024
1 parent 9a6f552 commit cf8be22
Show file tree
Hide file tree
Showing 2 changed files with 58 additions and 12 deletions.
27 changes: 15 additions & 12 deletions src/uucore/src/lib/features/checksum.rs
Original file line number Diff line number Diff line change
Expand Up @@ -154,7 +154,7 @@ pub fn create_sha3(bits: Option<usize>) -> UResult<HashAlgorithm> {
}

#[allow(clippy::comparison_chain)]
fn cksum_output(res: &ChecksumResult, ignore_missing: bool, status: bool) {
fn cksum_output(res: &ChecksumResult, status: bool) {
if res.bad_format == 1 {
show_warning_caps!("{} line is improperly formatted", res.bad_format);
} else if res.bad_format > 1 {
Expand All @@ -168,12 +168,10 @@ fn cksum_output(res: &ChecksumResult, ignore_missing: bool, status: bool) {
show_warning_caps!("{} computed checksums did NOT match", res.failed_cksum);
}
}
if !ignore_missing {
if res.failed_open_file == 1 {
show_warning_caps!("{} listed file could not be read", res.failed_open_file);
} else if res.failed_open_file > 1 {
show_warning_caps!("{} listed files could not be read", res.failed_open_file);
}
if res.failed_open_file == 1 {
show_warning_caps!("{} listed file could not be read", res.failed_open_file);
} else if res.failed_open_file > 1 {
show_warning_caps!("{} listed files could not be read", res.failed_open_file);
}
}

Expand Down Expand Up @@ -364,10 +362,16 @@ fn get_file_to_check(
if filename == "-" {
Some(Box::new(stdin())) // Use stdin if "-" is specified in the checksum file
} else {
let mut failed_open = || {
println!("{filename}: FAILED open or read");
res.failed_open_file += 1;
};
match File::open(filename) {
Ok(f) => {
if f.metadata().ok()?.is_dir() {
show!(USimpleError::new(1, format!("{filename}: Is a directory")));
// also regarded as a failed open
failed_open();
None
} else {
Some(Box::new(f))
Expand All @@ -377,9 +381,8 @@ fn get_file_to_check(
if !ignore_missing {
// yes, we have both stderr and stdout here
show!(err.map_err_context(|| filename.to_string()));
println!("{filename}: FAILED open or read");
failed_open();
}
res.failed_open_file += 1;
// we could not open the file but we want to continue
None
}
Expand Down Expand Up @@ -612,6 +615,9 @@ where
return Ok(());
}

// if any incorrectly formatted line, show it
cksum_output(&res, status);

if ignore_missing && correct_format == 0 {
// we have only bad format
// and we had ignore-missing
Expand All @@ -633,9 +639,6 @@ where
if (res.failed_cksum > 0 || res.failed_open_file > 0) && !ignore_missing {
set_exit_code(1);
}

// if any incorrectly formatted line, show it
cksum_output(&res, ignore_missing, status);
}

Ok(())
Expand Down
43 changes: 43 additions & 0 deletions tests/by-util/test_cksum.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1344,3 +1344,46 @@ fn test_check_comment_leading_space() {
.stdout_contains("foo: OK")
.stderr_contains("WARNING: 1 line is improperly formatted");
}

#[test]
fn test_check_error_handling() {
// check `cksum`'s behavior when encountering directories or non existing files

let scene = TestScenario::new(util_name!());
let at = &scene.fixtures;

at.write(
"CHECKSUM",
"SHA1 (dir) = ffffffffffffffffffffffffffffffffffffffff\n\
SHA1 (not-file) = ffffffffffffffffffffffffffffffffffffffff\n",
);
at.mkdir("dir");

scene
.ucmd()
.arg("--check")
.arg("CHECKSUM")
.fails()
.stdout_contains(
"dir: FAILED open or read\n\
not-file: FAILED open or read",
)
.stderr_contains(
"cksum: dir: Is a directory\n\
cksum: not-file: No such file or directory\n\
cksum: WARNING: 2 listed files could not be read",
);

// check with `--ignore-missing`
scene
.ucmd()
.arg("--check")
.arg("CHECKSUM")
.arg("--ignore-missing")
.fails()
.stdout_contains("dir: FAILED open or read")
.stderr_contains(
"cksum: dir: Is a directory\n\
cksum: WARNING: 1 listed file could not be read",
);
}

0 comments on commit cf8be22

Please sign in to comment.