blob: 70febdf3ad2250d8665f3f14e8a47a5e2981cab3 [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
Bernhard Reutner-Fischer73561cc2006-08-28 23:31:54 +00006 *
Rob Landley856489b2006-04-18 20:57:28 +00007 * 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
Denis Vlasenko06af2162007-02-03 17:28:39 +000011int cksum_main(int argc, char **argv);
Bernhard Reutner-Fischer73561cc2006-08-28 23:31:54 +000012int cksum_main(int argc, char **argv)
13{
Denis Vlasenkoc6758a02007-04-10 21:40:19 +000014 uint32_t *crc32_table = crc32_filltable(NULL, 1);
Rob Landley856489b2006-04-18 20:57:28 +000015
16 FILE *fp;
17 uint32_t crc;
18 long length, filesize;
19 int bytes_read;
20 char *cp;
Bernhard Reutner-Fischer73561cc2006-08-28 23:31:54 +000021
Rob Landley856489b2006-04-18 20:57:28 +000022 int inp_stdin = (argc == optind) ? 1 : 0;
Bernhard Reutner-Fischer73561cc2006-08-28 23:31:54 +000023
Rob Landley856489b2006-04-18 20:57:28 +000024 do {
Denis Vlasenkoddec5af2006-10-26 23:25:17 +000025 fp = fopen_or_warn_stdin((inp_stdin) ? bb_msg_standard_input : *++argv);
Bernhard Reutner-Fischer73561cc2006-08-28 23:31:54 +000026
Rob Landley856489b2006-04-18 20:57:28 +000027 crc = 0;
28 length = 0;
Bernhard Reutner-Fischer73561cc2006-08-28 23:31:54 +000029
30 while ((bytes_read = fread(bb_common_bufsiz1, 1, BUFSIZ, fp)) > 0) {
31 cp = bb_common_bufsiz1;
Rob Landley856489b2006-04-18 20:57:28 +000032 length += bytes_read;
33 while (bytes_read--)
34 crc = (crc << 8) ^ crc32_table[((crc >> 24) ^ (*cp++)) & 0xffL];
35 }
Bernhard Reutner-Fischer73561cc2006-08-28 23:31:54 +000036
Rob Landley856489b2006-04-18 20:57:28 +000037 filesize = length;
Bernhard Reutner-Fischer73561cc2006-08-28 23:31:54 +000038
Rob Landley856489b2006-04-18 20:57:28 +000039 for (; length; length >>= 8)
40 crc = (crc << 8) ^ crc32_table[((crc >> 24) ^ length) & 0xffL];
41 crc ^= 0xffffffffL;
42
43 if (inp_stdin) {
Denis Vlasenkof0ed3762006-10-26 23:21:47 +000044 printf("%" PRIu32 " %li\n", crc, filesize);
Rob Landley856489b2006-04-18 20:57:28 +000045 break;
46 }
Bernhard Reutner-Fischer73561cc2006-08-28 23:31:54 +000047
Denis Vlasenkof0ed3762006-10-26 23:21:47 +000048 printf("%" PRIu32 " %li %s\n", crc, filesize, *argv);
Rob Landley856489b2006-04-18 20:57:28 +000049 fclose(fp);
Bernhard Reutner-Fischer73561cc2006-08-28 23:31:54 +000050 } while (*(argv + 1));
51
Denis Vlasenkof0ed3762006-10-26 23:21:47 +000052 fflush_stdout_and_exit(EXIT_SUCCESS);
Rob Landley856489b2006-04-18 20:57:28 +000053}