From e3f805ccc35be010b9476847dccc3f1d0f8011c5 Mon Sep 17 00:00:00 2001 From: Lauri Kasanen Date: Mon, 4 Jul 2011 01:49:59 +0200 Subject: [PATCH] md5/shaNsum: make -c support a list of files function old new delta md5_sha1_sum_main 455 473 +18 Signed-off-by: Lauri Kasanen Signed-off-by: Denys Vlasenko --- coreutils/md5_sha1_sum.c | 126 ++++++++++++++++++--------------------- 1 file changed, 58 insertions(+), 68 deletions(-) diff --git a/coreutils/md5_sha1_sum.c b/coreutils/md5_sha1_sum.c index 53fd4d1a8..2cb6dd43c 100644 --- a/coreutils/md5_sha1_sum.c +++ b/coreutils/md5_sha1_sum.c @@ -7,12 +7,11 @@ */ //usage:#define md5sum_trivial_usage -//usage: "[FILE]..." -//usage: IF_FEATURE_MD5_SHA1_SUM_CHECK("\n or: md5sum -c [-sw] [FILE]") +//usage: IF_FEATURE_MD5_SHA1_SUM_CHECK("[-c[sw]] ")"[FILE]..." //usage:#define md5sum_full_usage "\n\n" //usage: "Print" IF_FEATURE_MD5_SHA1_SUM_CHECK(" or check") " MD5 checksums" //usage: IF_FEATURE_MD5_SHA1_SUM_CHECK( "\n" -//usage: "\n -c Check sums against given list" +//usage: "\n -c Check sums against list in FILEs" //usage: "\n -s Don't output anything, status code shows success" //usage: "\n -w Warn about improperly formatted checksum lines" //usage: ) @@ -28,34 +27,31 @@ //usage: "^D\n" //usage: //usage:#define sha1sum_trivial_usage -//usage: "[FILE]..." -//usage: IF_FEATURE_MD5_SHA1_SUM_CHECK("\n or: sha1sum -c [-sw] [FILE]") +//usage: IF_FEATURE_MD5_SHA1_SUM_CHECK("[-c[sw]] ")"[FILE]..." //usage:#define sha1sum_full_usage "\n\n" //usage: "Print" IF_FEATURE_MD5_SHA1_SUM_CHECK(" or check") " SHA1 checksums" //usage: IF_FEATURE_MD5_SHA1_SUM_CHECK( "\n" -//usage: "\n -c Check sums against given list" +//usage: "\n -c Check sums against list in FILEs" //usage: "\n -s Don't output anything, status code shows success" //usage: "\n -w Warn about improperly formatted checksum lines" //usage: ) //usage: //usage:#define sha256sum_trivial_usage -//usage: "[FILE]..." -//usage: IF_FEATURE_MD5_SHA1_SUM_CHECK("\n or: sha256sum -c [-sw] [FILE]") +//usage: IF_FEATURE_MD5_SHA1_SUM_CHECK("[-c[sw]] ")"[FILE]..." //usage:#define sha256sum_full_usage "\n\n" //usage: "Print" IF_FEATURE_MD5_SHA1_SUM_CHECK(" or check") " SHA256 checksums" //usage: IF_FEATURE_MD5_SHA1_SUM_CHECK( "\n" -//usage: "\n -c Check sums against given list" +//usage: "\n -c Check sums against list in FILEs" //usage: "\n -s Don't output anything, status code shows success" //usage: "\n -w Warn about improperly formatted checksum lines" //usage: ) //usage: //usage:#define sha512sum_trivial_usage -//usage: "[FILE]..." -//usage: IF_FEATURE_MD5_SHA1_SUM_CHECK("\n or: sha512sum -c [-sw] [FILE]") +//usage: IF_FEATURE_MD5_SHA1_SUM_CHECK("[-c[sw]] ")"[FILE]..." //usage:#define sha512sum_full_usage "\n\n" //usage: "Print" IF_FEATURE_MD5_SHA1_SUM_CHECK(" or check") " SHA512 checksums" //usage: IF_FEATURE_MD5_SHA1_SUM_CHECK( "\n" -//usage: "\n -c Check sums against given list" +//usage: "\n -c Check sums against list in FILEs" //usage: "\n -s Don't output anything, status code shows success" //usage: "\n -w Warn about improperly formatted checksum lines" //usage: ) @@ -95,7 +91,7 @@ static uint8_t *hash_file(const char *filename) sha1_ctx_t sha1; md5_ctx_t md5; } context; - uint8_t *hash_value = NULL; + uint8_t *hash_value; void FAST_FUNC (*update)(void*, const void*, size_t); void FAST_FUNC (*final)(void*, void*); char hash_algo; @@ -137,6 +133,7 @@ static uint8_t *hash_file(const char *filename) while ((count = safe_read(src_fd, in_buf, 4096)) > 0) { update(&context, in_buf, count); } + hash_value = NULL; if (count == 0) { final(&context, in_buf); hash_value = hash_bin_to_hex(in_buf, hash_len); @@ -178,66 +175,58 @@ int md5_sha1_sum_main(int argc UNUSED_PARAM, char **argv) } } - if (ENABLE_FEATURE_MD5_SHA1_SUM_CHECK && (flags & FLAG_CHECK)) { - FILE *pre_computed_stream; - int count_total = 0; - int count_failed = 0; - char *line; + do { + if (ENABLE_FEATURE_MD5_SHA1_SUM_CHECK && (flags & FLAG_CHECK)) { + FILE *pre_computed_stream; + char *line; + int count_total = 0; + int count_failed = 0; - if (argv[1]) { - bb_error_msg_and_die("only one argument may be specified with -c"); - } - - pre_computed_stream = xfopen_stdin(argv[0]); + pre_computed_stream = xfopen_stdin(*argv); - while ((line = xmalloc_fgetline(pre_computed_stream)) != NULL) { - uint8_t *hash_value; - char *filename_ptr; + while ((line = xmalloc_fgetline(pre_computed_stream)) != NULL) { + uint8_t *hash_value; + char *filename_ptr; - count_total++; - filename_ptr = strstr(line, " "); - /* handle format for binary checksums */ - if (filename_ptr == NULL) { - filename_ptr = strstr(line, " *"); - } - if (filename_ptr == NULL) { - if (flags & FLAG_WARN) { - bb_error_msg("invalid format"); + count_total++; + filename_ptr = strstr(line, " "); + /* handle format for binary checksums */ + if (filename_ptr == NULL) { + filename_ptr = strstr(line, " *"); } - count_failed++; - return_value = EXIT_FAILURE; + if (filename_ptr == NULL) { + if (flags & FLAG_WARN) { + bb_error_msg("invalid format"); + } + count_failed++; + return_value = EXIT_FAILURE; + free(line); + continue; + } + *filename_ptr = '\0'; + filename_ptr += 2; + + hash_value = hash_file(filename_ptr); + + if (hash_value && (strcmp((char*)hash_value, line) == 0)) { + if (!(flags & FLAG_SILENT)) + printf("%s: OK\n", filename_ptr); + } else { + if (!(flags & FLAG_SILENT)) + printf("%s: FAILED\n", filename_ptr); + count_failed++; + return_value = EXIT_FAILURE; + } + /* possible free(NULL) */ + free(hash_value); free(line); - continue; } - *filename_ptr = '\0'; - filename_ptr += 2; - - hash_value = hash_file(filename_ptr); - - if (hash_value && (strcmp((char*)hash_value, line) == 0)) { - if (!(flags & FLAG_SILENT)) - printf("%s: OK\n", filename_ptr); - } else { - if (!(flags & FLAG_SILENT)) - printf("%s: FAILED\n", filename_ptr); - count_failed++; - return_value = EXIT_FAILURE; + if (count_failed && !(flags & FLAG_SILENT)) { + bb_error_msg("WARNING: %d of %d computed checksums did NOT match", + count_failed, count_total); } - /* possible free(NULL) */ - free(hash_value); - free(line); - } - if (count_failed && !(flags & FLAG_SILENT)) { - bb_error_msg("WARNING: %d of %d computed checksums did NOT match", - count_failed, count_total); - } - /* - if (fclose_if_not_stdin(pre_computed_stream) == EOF) { - bb_perror_msg_and_die("can't close file %s", file_ptr); - } - */ - } else { - do { + fclose_if_not_stdin(pre_computed_stream); + } else { uint8_t *hash_value = hash_file(*argv); if (hash_value == NULL) { return_value = EXIT_FAILURE; @@ -245,7 +234,8 @@ int md5_sha1_sum_main(int argc UNUSED_PARAM, char **argv) printf("%s %s\n", hash_value, *argv); free(hash_value); } - } while (*++argv); - } + } + } while (*++argv); + return return_value; } -- 2.25.1