1 /* vi: set sw=4 ts=4: */
3 * cksum - calculate the CRC32 checksum of a file
5 * Copyright (C) 2006 by Rob Sullivan, with ideas from code by Walter Harms
7 * Licensed under GPLv2 or later, see file LICENSE in this source tree.
10 //usage:#define cksum_trivial_usage
12 //usage:#define cksum_full_usage "\n\n"
13 //usage: "Calculate the CRC32 checksums of FILES"
16 #include "common_bufsiz.h"
18 /* This is a NOEXEC applet. Be very careful! */
20 int cksum_main(int argc
, char **argv
) MAIN_EXTERNALLY_VISIBLE
;
21 int cksum_main(int argc UNUSED_PARAM
, char **argv
)
23 uint32_t *crc32_table
= crc32_filltable(NULL
, 1);
25 off_t length
, filesize
;
27 int exit_code
= EXIT_SUCCESS
;
30 getopt32(argv
, ""); /* coreutils 6.9 compat */
36 setup_common_bufsiz();
38 int fd
= open_or_warn_stdin(*argv
? *argv
: bb_msg_standard_input
);
41 exit_code
= EXIT_FAILURE
;
47 #define read_buf bb_common_bufsiz1
48 while ((bytes_read
= safe_read(fd
, read_buf
, COMMON_BUFSIZE
)) > 0) {
50 crc
= crc32_block_endian1(crc
, read_buf
, bytes_read
, crc32_table
);
57 crc
= (crc
<< 8) ^ crc32_table
[(uint8_t)(crc
>> 24) ^ (uint8_t)length
];
58 /* must ensure that shift is unsigned! */
59 if (sizeof(length
) <= sizeof(unsigned))
60 length
= (unsigned)length
>> 8;
61 else if (sizeof(length
) <= sizeof(unsigned long))
62 length
= (unsigned long)length
>> 8;
64 length
= (unsigned long long)length
>> 8;
68 printf((*argv
? "%"PRIu32
" %"OFF_FMT
"i %s\n" : "%"PRIu32
" %"OFF_FMT
"i\n"),
69 crc
, filesize
, *argv
);
70 } while (*argv
&& *++argv
);
72 fflush_stdout_and_exit(exit_code
);