summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoel Rosdahl <joel@rosdahl.net>2022-07-30 12:58:12 +0200
committerJoel Rosdahl <joel@rosdahl.net>2022-08-20 14:12:56 +0200
commit711c418b18a8e2005b7ec015fa7dc0ca253f4112 (patch)
tree3005c83d10c9ed4fa75b43e31d10866648febcb0
parent7242372e734597a006b70ebf3d1c7dca212b4920 (diff)
downloadccache-711c418b18a8e2005b7ec015fa7dc0ca253f4112.tar.gz
fix: Handle --hash-file/--checksum-file error properly
(cherry picked from commit 97076dcfe287413f2c48cf6c3bd03ddb6ee2e420)
-rw-r--r--src/core/mainoptions.cpp25
1 files changed, 16 insertions, 9 deletions
diff --git a/src/core/mainoptions.cpp b/src/core/mainoptions.cpp
index 33e73fef..e9d32328 100644
--- a/src/core/mainoptions.cpp
+++ b/src/core/mainoptions.cpp
@@ -415,11 +415,16 @@ process_main_options(int argc, const char* const* argv)
case CHECKSUM_FILE: {
util::XXH3_128 checksum;
Fd fd(arg == "-" ? STDIN_FILENO : open(arg.c_str(), O_RDONLY));
- Util::read_fd(*fd, [&checksum](const void* data, size_t size) {
- checksum.update(data, size);
- });
- const auto digest = checksum.digest();
- PRINT(stdout, "{}\n", Util::format_base16(digest.bytes(), digest.size()));
+ if (fd) {
+ Util::read_fd(*fd, [&checksum](const void* data, size_t size) {
+ checksum.update(data, size);
+ });
+ const auto digest = checksum.digest();
+ PRINT(
+ stdout, "{}\n", Util::format_base16(digest.bytes(), digest.size()));
+ } else {
+ PRINT(stderr, "Error: Failed to checksum {}\n", arg);
+ }
break;
}
@@ -449,12 +454,14 @@ process_main_options(int argc, const char* const* argv)
case HASH_FILE: {
Hash hash;
- if (arg == "-") {
- hash.hash_fd(STDIN_FILENO);
+ const bool ok =
+ arg == "-" ? hash.hash_fd(STDIN_FILENO) : hash.hash_file(arg);
+ if (ok) {
+ PRINT(stdout, "{}\n", hash.digest().to_string());
} else {
- hash.hash_file(arg);
+ PRINT(stderr, "Error: Failed to hash {}\n", arg);
+ return EXIT_FAILURE;
}
- PRINT(stdout, "{}\n", hash.digest().to_string());
break;
}