diff options
author | Lauri Kasanen <curaga@operamail.com> | 2011-07-04 01:49:59 +0200 |
---|---|---|
committer | Denys Vlasenko <vda.linux@googlemail.com> | 2011-07-04 01:49:59 +0200 |
commit | e3f805ccc35be010b9476847dccc3f1d0f8011c5 (patch) | |
tree | df502f3f9097d265f44752a4ccd91e2a51835276 | |
parent | 066f39956641300c1e5c6bfe6c11a115cea3e2cf (diff) | |
download | busybox-w32-e3f805ccc35be010b9476847dccc3f1d0f8011c5.tar.gz busybox-w32-e3f805ccc35be010b9476847dccc3f1d0f8011c5.tar.bz2 busybox-w32-e3f805ccc35be010b9476847dccc3f1d0f8011c5.zip |
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 <curaga@operamail.com>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
-rw-r--r-- | coreutils/md5_sha1_sum.c | 126 |
1 files 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 @@ | |||
7 | */ | 7 | */ |
8 | 8 | ||
9 | //usage:#define md5sum_trivial_usage | 9 | //usage:#define md5sum_trivial_usage |
10 | //usage: "[FILE]..." | 10 | //usage: IF_FEATURE_MD5_SHA1_SUM_CHECK("[-c[sw]] ")"[FILE]..." |
11 | //usage: IF_FEATURE_MD5_SHA1_SUM_CHECK("\n or: md5sum -c [-sw] [FILE]") | ||
12 | //usage:#define md5sum_full_usage "\n\n" | 11 | //usage:#define md5sum_full_usage "\n\n" |
13 | //usage: "Print" IF_FEATURE_MD5_SHA1_SUM_CHECK(" or check") " MD5 checksums" | 12 | //usage: "Print" IF_FEATURE_MD5_SHA1_SUM_CHECK(" or check") " MD5 checksums" |
14 | //usage: IF_FEATURE_MD5_SHA1_SUM_CHECK( "\n" | 13 | //usage: IF_FEATURE_MD5_SHA1_SUM_CHECK( "\n" |
15 | //usage: "\n -c Check sums against given list" | 14 | //usage: "\n -c Check sums against list in FILEs" |
16 | //usage: "\n -s Don't output anything, status code shows success" | 15 | //usage: "\n -s Don't output anything, status code shows success" |
17 | //usage: "\n -w Warn about improperly formatted checksum lines" | 16 | //usage: "\n -w Warn about improperly formatted checksum lines" |
18 | //usage: ) | 17 | //usage: ) |
@@ -28,34 +27,31 @@ | |||
28 | //usage: "^D\n" | 27 | //usage: "^D\n" |
29 | //usage: | 28 | //usage: |
30 | //usage:#define sha1sum_trivial_usage | 29 | //usage:#define sha1sum_trivial_usage |
31 | //usage: "[FILE]..." | 30 | //usage: IF_FEATURE_MD5_SHA1_SUM_CHECK("[-c[sw]] ")"[FILE]..." |
32 | //usage: IF_FEATURE_MD5_SHA1_SUM_CHECK("\n or: sha1sum -c [-sw] [FILE]") | ||
33 | //usage:#define sha1sum_full_usage "\n\n" | 31 | //usage:#define sha1sum_full_usage "\n\n" |
34 | //usage: "Print" IF_FEATURE_MD5_SHA1_SUM_CHECK(" or check") " SHA1 checksums" | 32 | //usage: "Print" IF_FEATURE_MD5_SHA1_SUM_CHECK(" or check") " SHA1 checksums" |
35 | //usage: IF_FEATURE_MD5_SHA1_SUM_CHECK( "\n" | 33 | //usage: IF_FEATURE_MD5_SHA1_SUM_CHECK( "\n" |
36 | //usage: "\n -c Check sums against given list" | 34 | //usage: "\n -c Check sums against list in FILEs" |
37 | //usage: "\n -s Don't output anything, status code shows success" | 35 | //usage: "\n -s Don't output anything, status code shows success" |
38 | //usage: "\n -w Warn about improperly formatted checksum lines" | 36 | //usage: "\n -w Warn about improperly formatted checksum lines" |
39 | //usage: ) | 37 | //usage: ) |
40 | //usage: | 38 | //usage: |
41 | //usage:#define sha256sum_trivial_usage | 39 | //usage:#define sha256sum_trivial_usage |
42 | //usage: "[FILE]..." | 40 | //usage: IF_FEATURE_MD5_SHA1_SUM_CHECK("[-c[sw]] ")"[FILE]..." |
43 | //usage: IF_FEATURE_MD5_SHA1_SUM_CHECK("\n or: sha256sum -c [-sw] [FILE]") | ||
44 | //usage:#define sha256sum_full_usage "\n\n" | 41 | //usage:#define sha256sum_full_usage "\n\n" |
45 | //usage: "Print" IF_FEATURE_MD5_SHA1_SUM_CHECK(" or check") " SHA256 checksums" | 42 | //usage: "Print" IF_FEATURE_MD5_SHA1_SUM_CHECK(" or check") " SHA256 checksums" |
46 | //usage: IF_FEATURE_MD5_SHA1_SUM_CHECK( "\n" | 43 | //usage: IF_FEATURE_MD5_SHA1_SUM_CHECK( "\n" |
47 | //usage: "\n -c Check sums against given list" | 44 | //usage: "\n -c Check sums against list in FILEs" |
48 | //usage: "\n -s Don't output anything, status code shows success" | 45 | //usage: "\n -s Don't output anything, status code shows success" |
49 | //usage: "\n -w Warn about improperly formatted checksum lines" | 46 | //usage: "\n -w Warn about improperly formatted checksum lines" |
50 | //usage: ) | 47 | //usage: ) |
51 | //usage: | 48 | //usage: |
52 | //usage:#define sha512sum_trivial_usage | 49 | //usage:#define sha512sum_trivial_usage |
53 | //usage: "[FILE]..." | 50 | //usage: IF_FEATURE_MD5_SHA1_SUM_CHECK("[-c[sw]] ")"[FILE]..." |
54 | //usage: IF_FEATURE_MD5_SHA1_SUM_CHECK("\n or: sha512sum -c [-sw] [FILE]") | ||
55 | //usage:#define sha512sum_full_usage "\n\n" | 51 | //usage:#define sha512sum_full_usage "\n\n" |
56 | //usage: "Print" IF_FEATURE_MD5_SHA1_SUM_CHECK(" or check") " SHA512 checksums" | 52 | //usage: "Print" IF_FEATURE_MD5_SHA1_SUM_CHECK(" or check") " SHA512 checksums" |
57 | //usage: IF_FEATURE_MD5_SHA1_SUM_CHECK( "\n" | 53 | //usage: IF_FEATURE_MD5_SHA1_SUM_CHECK( "\n" |
58 | //usage: "\n -c Check sums against given list" | 54 | //usage: "\n -c Check sums against list in FILEs" |
59 | //usage: "\n -s Don't output anything, status code shows success" | 55 | //usage: "\n -s Don't output anything, status code shows success" |
60 | //usage: "\n -w Warn about improperly formatted checksum lines" | 56 | //usage: "\n -w Warn about improperly formatted checksum lines" |
61 | //usage: ) | 57 | //usage: ) |
@@ -95,7 +91,7 @@ static uint8_t *hash_file(const char *filename) | |||
95 | sha1_ctx_t sha1; | 91 | sha1_ctx_t sha1; |
96 | md5_ctx_t md5; | 92 | md5_ctx_t md5; |
97 | } context; | 93 | } context; |
98 | uint8_t *hash_value = NULL; | 94 | uint8_t *hash_value; |
99 | void FAST_FUNC (*update)(void*, const void*, size_t); | 95 | void FAST_FUNC (*update)(void*, const void*, size_t); |
100 | void FAST_FUNC (*final)(void*, void*); | 96 | void FAST_FUNC (*final)(void*, void*); |
101 | char hash_algo; | 97 | char hash_algo; |
@@ -137,6 +133,7 @@ static uint8_t *hash_file(const char *filename) | |||
137 | while ((count = safe_read(src_fd, in_buf, 4096)) > 0) { | 133 | while ((count = safe_read(src_fd, in_buf, 4096)) > 0) { |
138 | update(&context, in_buf, count); | 134 | update(&context, in_buf, count); |
139 | } | 135 | } |
136 | hash_value = NULL; | ||
140 | if (count == 0) { | 137 | if (count == 0) { |
141 | final(&context, in_buf); | 138 | final(&context, in_buf); |
142 | hash_value = hash_bin_to_hex(in_buf, hash_len); | 139 | 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) | |||
178 | } | 175 | } |
179 | } | 176 | } |
180 | 177 | ||
181 | if (ENABLE_FEATURE_MD5_SHA1_SUM_CHECK && (flags & FLAG_CHECK)) { | 178 | do { |
182 | FILE *pre_computed_stream; | 179 | if (ENABLE_FEATURE_MD5_SHA1_SUM_CHECK && (flags & FLAG_CHECK)) { |
183 | int count_total = 0; | 180 | FILE *pre_computed_stream; |
184 | int count_failed = 0; | 181 | char *line; |
185 | char *line; | 182 | int count_total = 0; |
183 | int count_failed = 0; | ||
186 | 184 | ||
187 | if (argv[1]) { | 185 | pre_computed_stream = xfopen_stdin(*argv); |
188 | bb_error_msg_and_die("only one argument may be specified with -c"); | ||
189 | } | ||
190 | |||
191 | pre_computed_stream = xfopen_stdin(argv[0]); | ||
192 | 186 | ||
193 | while ((line = xmalloc_fgetline(pre_computed_stream)) != NULL) { | 187 | while ((line = xmalloc_fgetline(pre_computed_stream)) != NULL) { |
194 | uint8_t *hash_value; | 188 | uint8_t *hash_value; |
195 | char *filename_ptr; | 189 | char *filename_ptr; |
196 | 190 | ||
197 | count_total++; | 191 | count_total++; |
198 | filename_ptr = strstr(line, " "); | 192 | filename_ptr = strstr(line, " "); |
199 | /* handle format for binary checksums */ | 193 | /* handle format for binary checksums */ |
200 | if (filename_ptr == NULL) { | 194 | if (filename_ptr == NULL) { |
201 | filename_ptr = strstr(line, " *"); | 195 | filename_ptr = strstr(line, " *"); |
202 | } | ||
203 | if (filename_ptr == NULL) { | ||
204 | if (flags & FLAG_WARN) { | ||
205 | bb_error_msg("invalid format"); | ||
206 | } | 196 | } |
207 | count_failed++; | 197 | if (filename_ptr == NULL) { |
208 | return_value = EXIT_FAILURE; | 198 | if (flags & FLAG_WARN) { |
199 | bb_error_msg("invalid format"); | ||
200 | } | ||
201 | count_failed++; | ||
202 | return_value = EXIT_FAILURE; | ||
203 | free(line); | ||
204 | continue; | ||
205 | } | ||
206 | *filename_ptr = '\0'; | ||
207 | filename_ptr += 2; | ||
208 | |||
209 | hash_value = hash_file(filename_ptr); | ||
210 | |||
211 | if (hash_value && (strcmp((char*)hash_value, line) == 0)) { | ||
212 | if (!(flags & FLAG_SILENT)) | ||
213 | printf("%s: OK\n", filename_ptr); | ||
214 | } else { | ||
215 | if (!(flags & FLAG_SILENT)) | ||
216 | printf("%s: FAILED\n", filename_ptr); | ||
217 | count_failed++; | ||
218 | return_value = EXIT_FAILURE; | ||
219 | } | ||
220 | /* possible free(NULL) */ | ||
221 | free(hash_value); | ||
209 | free(line); | 222 | free(line); |
210 | continue; | ||
211 | } | 223 | } |
212 | *filename_ptr = '\0'; | 224 | if (count_failed && !(flags & FLAG_SILENT)) { |
213 | filename_ptr += 2; | 225 | bb_error_msg("WARNING: %d of %d computed checksums did NOT match", |
214 | 226 | count_failed, count_total); | |
215 | hash_value = hash_file(filename_ptr); | ||
216 | |||
217 | if (hash_value && (strcmp((char*)hash_value, line) == 0)) { | ||
218 | if (!(flags & FLAG_SILENT)) | ||
219 | printf("%s: OK\n", filename_ptr); | ||
220 | } else { | ||
221 | if (!(flags & FLAG_SILENT)) | ||
222 | printf("%s: FAILED\n", filename_ptr); | ||
223 | count_failed++; | ||
224 | return_value = EXIT_FAILURE; | ||
225 | } | 227 | } |
226 | /* possible free(NULL) */ | 228 | fclose_if_not_stdin(pre_computed_stream); |
227 | free(hash_value); | 229 | } else { |
228 | free(line); | ||
229 | } | ||
230 | if (count_failed && !(flags & FLAG_SILENT)) { | ||
231 | bb_error_msg("WARNING: %d of %d computed checksums did NOT match", | ||
232 | count_failed, count_total); | ||
233 | } | ||
234 | /* | ||
235 | if (fclose_if_not_stdin(pre_computed_stream) == EOF) { | ||
236 | bb_perror_msg_and_die("can't close file %s", file_ptr); | ||
237 | } | ||
238 | */ | ||
239 | } else { | ||
240 | do { | ||
241 | uint8_t *hash_value = hash_file(*argv); | 230 | uint8_t *hash_value = hash_file(*argv); |
242 | if (hash_value == NULL) { | 231 | if (hash_value == NULL) { |
243 | return_value = EXIT_FAILURE; | 232 | return_value = EXIT_FAILURE; |
@@ -245,7 +234,8 @@ int md5_sha1_sum_main(int argc UNUSED_PARAM, char **argv) | |||
245 | printf("%s %s\n", hash_value, *argv); | 234 | printf("%s %s\n", hash_value, *argv); |
246 | free(hash_value); | 235 | free(hash_value); |
247 | } | 236 | } |
248 | } while (*++argv); | 237 | } |
249 | } | 238 | } while (*++argv); |
239 | |||
250 | return return_value; | 240 | return return_value; |
251 | } | 241 | } |