md5/shaNsum: make -c support a list of files
No binary (build failed)
—
(log yok)
| @@ -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; | |
| } | |