cksum: respect CONFIG_LFS=y. Adds 36 bytes in this case.

diff --git a/coreutils/cksum.c b/coreutils/cksum.c
index 5987184..546532c 100644
--- a/coreutils/cksum.c
+++ b/coreutils/cksum.c
@@ -13,7 +13,7 @@
 {
 	uint32_t *crc32_table = crc32_filltable(NULL, 1);
 	uint32_t crc;
-	long length, filesize;
+	off_t length, filesize;
 	int bytes_read;
 	uint8_t *cp;
 
@@ -44,11 +44,19 @@
 
 		filesize = length;
 
-		for (; length; length >>= 8)
-			crc = (crc << 8) ^ crc32_table[((crc >> 24) ^ length) & 0xff];
-		crc ^= 0xffffffffL;
+		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;
 
-		printf((*argv ? "%" PRIu32 " %li %s\n" : "%" PRIu32 " %li\n"),
+		printf((*argv ? "%"PRIu32" %"OFF_FMT"i %s\n" : "%"PRIu32" %"OFF_FMT"i\n"),
 				crc, filesize, *argv);
 	} while (*argv && *++argv);