blob: 66a255c4e4dc50094829f427ce26d6d870017c59 [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 Vlasenko9213a9e2006-09-17 16:28:10 +000014
Rob Landleyd921b2e2006-08-03 15:41:12 +000015 uint32_t *crc32_table = crc32_filltable(1);
Rob Landley856489b2006-04-18 20:57:28 +000016
17 FILE *fp;
18 uint32_t crc;
19 long length, filesize;
20 int bytes_read;
21 char *cp;
Bernhard Reutner-Fischer73561cc2006-08-28 23:31:54 +000022
Rob Landley856489b2006-04-18 20:57:28 +000023 int inp_stdin = (argc == optind) ? 1 : 0;
Bernhard Reutner-Fischer73561cc2006-08-28 23:31:54 +000024
Rob Landley856489b2006-04-18 20:57:28 +000025 do {
Denis Vlasenkoddec5af2006-10-26 23:25:17 +000026 fp = fopen_or_warn_stdin((inp_stdin) ? bb_msg_standard_input : *++argv);
Bernhard Reutner-Fischer73561cc2006-08-28 23:31:54 +000027
Rob Landley856489b2006-04-18 20:57:28 +000028 crc = 0;
29 length = 0;
Bernhard Reutner-Fischer73561cc2006-08-28 23:31:54 +000030
31 while ((bytes_read = fread(bb_common_bufsiz1, 1, BUFSIZ, fp)) > 0) {
32 cp = bb_common_bufsiz1;
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}