aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLauri Kasanen <curaga@operamail.com>2011-07-04 01:49:59 +0200
committerDenys Vlasenko <vda.linux@googlemail.com>2011-07-04 01:49:59 +0200
commite3f805ccc35be010b9476847dccc3f1d0f8011c5 (patch)
treedf502f3f9097d265f44752a4ccd91e2a51835276
parent066f39956641300c1e5c6bfe6c11a115cea3e2cf (diff)
downloadbusybox-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.c126
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}