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"
17 /* This is a NOEXEC applet. Be very careful! */
19 int cksum_main(int argc
, char **argv
) MAIN_EXTERNALLY_VISIBLE
;
20 int cksum_main(int argc UNUSED_PARAM
, char **argv
)
22 uint32_t *crc32_table
= crc32_filltable(NULL
, 1);
24 off_t length
, filesize
;
26 int exit_code
= EXIT_SUCCESS
;
29 getopt32(argv
, ""); /* coreutils 6.9 compat */
36 int fd
= open_or_warn_stdin(*argv
? *argv
: bb_msg_standard_input
);
39 exit_code
= EXIT_FAILURE
;
45 #define read_buf bb_common_bufsiz1
46 while ((bytes_read
= safe_read(fd
, read_buf
, sizeof(read_buf
))) > 0) {
48 crc
= crc32_block_endian1(crc
, read_buf
, bytes_read
, crc32_table
);
55 crc
= (crc
<< 8) ^ crc32_table
[(uint8_t)(crc
>> 24) ^ (uint8_t)length
];
56 /* must ensure that shift is unsigned! */
57 if (sizeof(length
) <= sizeof(unsigned))
58 length
= (unsigned)length
>> 8;
59 else if (sizeof(length
) <= sizeof(unsigned long))
60 length
= (unsigned long)length
>> 8;
62 length
= (unsigned long long)length
>> 8;
66 printf((*argv
? "%"PRIu32
" %"OFF_FMT
"i %s\n" : "%"PRIu32
" %"OFF_FMT
"i\n"),
67 crc
, filesize
, *argv
);
68 } while (*argv
&& *++argv
);
70 fflush_stdout_and_exit(exit_code
);