blob: 5849ddab2c0ef2f61c3fc1e04f65691613dc31b0 [file] [log] [blame]
Rob Landley856489b2006-04-18 20:57:28 +00001/* vi: set sw=4 ts=4: */
2/*
3 * cksum - calculate the CRC32 checksum of a file
4 *
5 * Copyright (C) 2006 by Rob Sullivan, with ideas from code by Walter Harms
6 *
7 * Licensed under GPLv2 or later, see file LICENSE in this tarball for details. */
8
Rob Landley856489b2006-04-18 20:57:28 +00009#include "busybox.h"
10
11int cksum_main(int argc, char **argv) {
12
Rob Landleyd921b2e2006-08-03 15:41:12 +000013 uint32_t *crc32_table = crc32_filltable(1);
Rob Landley856489b2006-04-18 20:57:28 +000014
15 FILE *fp;
16 uint32_t crc;
17 long length, filesize;
18 int bytes_read;
19 char *cp;
20 RESERVE_CONFIG_BUFFER(buf, BUFSIZ);
21 int inp_stdin = (argc == optind) ? 1 : 0;
22
23 do {
24 fp = bb_wfopen_input((inp_stdin) ? bb_msg_standard_input : *++argv);
25
26 crc = 0;
27 length = 0;
28
29 while ((bytes_read = fread(buf, 1, BUFSIZ, fp)) > 0) {
30 cp = buf;
31 length += bytes_read;
32 while (bytes_read--)
33 crc = (crc << 8) ^ crc32_table[((crc >> 24) ^ (*cp++)) & 0xffL];
34 }
35
36 filesize = length;
37
38 for (; length; length >>= 8)
39 crc = (crc << 8) ^ crc32_table[((crc >> 24) ^ length) & 0xffL];
40 crc ^= 0xffffffffL;
41
42 if (inp_stdin) {
43 printf("%"PRIu32" %li\n", crc, filesize);
44 break;
45 }
46
47 printf("%"PRIu32" %li %s\n", crc, filesize, *argv);
48 fclose(fp);
49 } while (*(argv+1));
50
51 return EXIT_SUCCESS;
52}