diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/md5sum.c | 20 |
1 files changed, 12 insertions, 8 deletions
diff --git a/src/md5sum.c b/src/md5sum.c index 5a39a4f05..6e85cb150 100644 --- a/src/md5sum.c +++ b/src/md5sum.c @@ -463,15 +463,19 @@ print_filename (char const *file, bool escape) text because it was a terminal. Put the checksum in *BIN_RESULT, which must be properly aligned. + Put true in *MISSING if the file can't be opened due to ENOENT. Return true if successful. */ static bool -digest_file (const char *filename, int *binary, unsigned char *bin_result) +digest_file (const char *filename, int *binary, unsigned char *bin_result, + bool *missing) { FILE *fp; int err; bool is_stdin = STREQ (filename, "-"); + *missing = false; + if (is_stdin) { have_read_stdin = true; @@ -491,7 +495,7 @@ digest_file (const char *filename, int *binary, unsigned char *bin_result) { if (ignore_missing && errno == ENOENT) { - *bin_result = '\0'; + *missing = true; return true; } error (0, errno, "%s", quotef (filename)); @@ -604,14 +608,14 @@ digest_check (const char *checkfile_name) '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' }; bool ok; + bool missing; /* Only escape in the edge case producing multiple lines, to ease automatic processing of status output. */ bool needs_escape = ! status_only && strchr (filename, '\n'); properly_formatted_lines = true; - *bin_buffer = '\1'; /* flag set to 0 for ignored missing files. */ - ok = digest_file (filename, &binary, bin_buffer); + ok = digest_file (filename, &binary, bin_buffer, &missing); if (!ok) { @@ -624,10 +628,9 @@ digest_check (const char *checkfile_name) printf (": %s\n", _("FAILED open or read")); } } - else if (ignore_missing && ! *bin_buffer) + else if (ignore_missing && missing) { - /* Treat an empty buffer as meaning a missing file, - which is ignored with --ignore-missing. */ + /* Ignore missing files with --ignore-missing. */ ; } else @@ -878,8 +881,9 @@ main (int argc, char **argv) else { int file_is_binary = binary; + bool missing; - if (! digest_file (file, &file_is_binary, bin_buffer)) + if (! digest_file (file, &file_is_binary, bin_buffer, &missing)) ok = false; else { |