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

Reply via email to