blob: 987f5f32c76824fffd23df28282b67ddc362f7c3 [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
Denis Vlasenkob6adbf12007-05-26 19:00:18 +00009#include "libbb.h"
Rob Landley856489b2006-04-18 20:57:28 +000010
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
Denis Vlasenko74324c82007-06-04 10:16:52 +000030#define read_buf bb_common_bufsiz1
31 while ((bytes_read = fread(read_buf, 1, BUFSIZ, fp)) > 0) {
32 cp = read_buf;
Rob Landley856489b2006-04-18 20:57:28 +000033 length += bytes_read;
34 while (bytes_read--)
35 crc = (crc << 8) ^ crc32_table[((crc >> 24) ^ (*cp++)) & 0xffL];
36 }
Bernhard Reutner-Fischer73561cc2006-08-28 23:31:54 +000037
Rob Landley856489b2006-04-18 20:57:28 +000038 filesize = length;
Bernhard Reutner-Fischer73561cc2006-08-28 23:31:54 +000039
Rob Landley856489b2006-04-18 20:57:28 +000040 for (; length; length >>= 8)
41 crc = (crc << 8) ^ crc32_table[((crc >> 24) ^ length) & 0xffL];
42 crc ^= 0xffffffffL;
43
44 if (inp_stdin) {
Denis Vlasenkof0ed3762006-10-26 23:21:47 +000045 printf("%" PRIu32 " %li\n", crc, filesize);
Rob Landley856489b2006-04-18 20:57:28 +000046 break;
47 }
Bernhard Reutner-Fischer73561cc2006-08-28 23:31:54 +000048
Denis Vlasenkof0ed3762006-10-26 23:21:47 +000049 printf("%" PRIu32 " %li %s\n", crc, filesize, *argv);
Rob Landley856489b2006-04-18 20:57:28 +000050 fclose(fp);
Bernhard Reutner-Fischer73561cc2006-08-28 23:31:54 +000051 } while (*(argv + 1));
52
Denis Vlasenkof0ed3762006-10-26 23:21:47 +000053 fflush_stdout_and_exit(EXIT_SUCCESS);
Rob Landley856489b2006-04-18 20:57:28 +000054}