From: Matt Cross <[email protected]> So that it matches the CRC32 algorithm used by u-boot.
Signed-off-by: Matt Cross <[email protected]> Signed-off-by: Joshua Judson Rosen <[email protected]> --- coreutils/cksum.c | 46 +++++++++++++++++++++++++++++----------------- 1 file changed, 29 insertions(+), 17 deletions(-) diff --git a/coreutils/cksum.c b/coreutils/cksum.c index ac0b0c3..b45233e 100644 --- a/coreutils/cksum.c +++ b/coreutils/cksum.c @@ -16,21 +16,25 @@ /* This is a NOEXEC applet. Be very careful! */ +#define OPTION_STRING "l" + +enum { + OPT_LITTLE_ENDIAN = (1 << 0), +}; + int cksum_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; int cksum_main(int argc UNUSED_PARAM, char **argv) { - uint32_t *crc32_table = crc32_filltable(NULL, 1); + uint32_t *crc32_table; uint32_t crc; off_t length, filesize; int bytes_read; int exit_code = EXIT_SUCCESS; -#if ENABLE_DESKTOP - getopt32(argv, ""); /* coreutils 6.9 compat */ + getopt32(argv, OPTION_STRING); argv += optind; -#else - argv++; -#endif + + crc32_table = crc32_filltable(NULL, (option_mask32 & OPT_LITTLE_ENDIAN) ? 0 : 1); do { int fd = open_or_warn_stdin(*argv ? *argv : bb_msg_standard_input); @@ -39,27 +43,35 @@ int cksum_main(int argc UNUSED_PARAM, char **argv) exit_code = EXIT_FAILURE; continue; } - crc = 0; + if (option_mask32 & OPT_LITTLE_ENDIAN) + crc = ~0; + else + crc = 0; length = 0; #define read_buf bb_common_bufsiz1 while ((bytes_read = safe_read(fd, read_buf, sizeof(read_buf))) > 0) { length += bytes_read; - crc = crc32_block_endian1(crc, read_buf, bytes_read, crc32_table); + if (option_mask32 & OPT_LITTLE_ENDIAN) + crc = crc32_block_endian0(crc, read_buf, bytes_read, crc32_table); + else + crc = crc32_block_endian1(crc, read_buf, bytes_read, crc32_table); } close(fd); filesize = length; - while (length) { - crc = (crc << 8) ^ crc32_table[(uint8_t)(crc >> 24) ^ (uint8_t)length]; - /* must ensure that shift is unsigned! */ - if (sizeof(length) <= sizeof(unsigned)) - length = (unsigned)length >> 8; - else if (sizeof(length) <= sizeof(unsigned long)) - length = (unsigned long)length >> 8; - else - length = (unsigned long long)length >> 8; + if (!(option_mask32 & OPT_LITTLE_ENDIAN)) { + while (length) { + crc = (crc << 8) ^ crc32_table[(uint8_t)(crc >> 24) ^ (uint8_t)length]; + /* must ensure that shift is unsigned! */ + if (sizeof(length) <= sizeof(unsigned)) + length = (unsigned)length >> 8; + else if (sizeof(length) <= sizeof(unsigned long)) + length = (unsigned long)length >> 8; + else + length = (unsigned long long)length >> 8; + } } crc = ~crc; -- 1.7.10.4 _______________________________________________ busybox mailing list [email protected] http://lists.busybox.net/mailman/listinfo/busybox
