1*cf5a6c84SAndroid Build Coastguard Worker /* cksum.c - produce crc32 checksum value for each input
2*cf5a6c84SAndroid Build Coastguard Worker *
3*cf5a6c84SAndroid Build Coastguard Worker * Copyright 2008 Rob Landley <[email protected]>
4*cf5a6c84SAndroid Build Coastguard Worker *
5*cf5a6c84SAndroid Build Coastguard Worker * See http://opengroup.org/onlinepubs/9699919799/utilities/cksum.html
6*cf5a6c84SAndroid Build Coastguard Worker
7*cf5a6c84SAndroid Build Coastguard Worker USE_CKSUM(NEWTOY(cksum, "HIPLN", TOYFLAG_BIN))
8*cf5a6c84SAndroid Build Coastguard Worker USE_CRC32(NEWTOY(crc32, 0, TOYFLAG_BIN))
9*cf5a6c84SAndroid Build Coastguard Worker
10*cf5a6c84SAndroid Build Coastguard Worker config CKSUM
11*cf5a6c84SAndroid Build Coastguard Worker bool "cksum"
12*cf5a6c84SAndroid Build Coastguard Worker default y
13*cf5a6c84SAndroid Build Coastguard Worker help
14*cf5a6c84SAndroid Build Coastguard Worker usage: cksum [-HIPLN] [FILE...]
15*cf5a6c84SAndroid Build Coastguard Worker
16*cf5a6c84SAndroid Build Coastguard Worker For each file, output crc32 checksum value, length and name of file.
17*cf5a6c84SAndroid Build Coastguard Worker If no files listed, copy from stdin. Filename "-" is a synonym for stdin.
18*cf5a6c84SAndroid Build Coastguard Worker
19*cf5a6c84SAndroid Build Coastguard Worker -H Hexadecimal checksum (defaults to decimal)
20*cf5a6c84SAndroid Build Coastguard Worker -I Skip post-inversion
21*cf5a6c84SAndroid Build Coastguard Worker -P Pre-inversion
22*cf5a6c84SAndroid Build Coastguard Worker -L Little endian (defaults to big endian)
23*cf5a6c84SAndroid Build Coastguard Worker -N Do not include length in CRC calculation (or output)
24*cf5a6c84SAndroid Build Coastguard Worker
25*cf5a6c84SAndroid Build Coastguard Worker config CRC32
26*cf5a6c84SAndroid Build Coastguard Worker bool "crc32"
27*cf5a6c84SAndroid Build Coastguard Worker default y
28*cf5a6c84SAndroid Build Coastguard Worker help
29*cf5a6c84SAndroid Build Coastguard Worker usage: crc32 [file...]
30*cf5a6c84SAndroid Build Coastguard Worker
31*cf5a6c84SAndroid Build Coastguard Worker Output crc32 checksum for each file.
32*cf5a6c84SAndroid Build Coastguard Worker */
33*cf5a6c84SAndroid Build Coastguard Worker
34*cf5a6c84SAndroid Build Coastguard Worker #define FOR_cksum
35*cf5a6c84SAndroid Build Coastguard Worker #define FORCE_FLAGS
36*cf5a6c84SAndroid Build Coastguard Worker #include "toys.h"
37*cf5a6c84SAndroid Build Coastguard Worker
do_cksum(int fd,char * name)38*cf5a6c84SAndroid Build Coastguard Worker static void do_cksum(int fd, char *name)
39*cf5a6c84SAndroid Build Coastguard Worker {
40*cf5a6c84SAndroid Build Coastguard Worker unsigned crc_table[256], crc = FLAG(P) ? ~0 : 0;
41*cf5a6c84SAndroid Build Coastguard Worker unsigned long long llen = 0, llen2 = 0;
42*cf5a6c84SAndroid Build Coastguard Worker int len, i, done = 0;
43*cf5a6c84SAndroid Build Coastguard Worker
44*cf5a6c84SAndroid Build Coastguard Worker // Init table, loop through data
45*cf5a6c84SAndroid Build Coastguard Worker crc_init(crc_table, FLAG(L));
46*cf5a6c84SAndroid Build Coastguard Worker for (;;) {
47*cf5a6c84SAndroid Build Coastguard Worker len = read(fd, toybuf, sizeof(toybuf));
48*cf5a6c84SAndroid Build Coastguard Worker if (len<0) perror_msg_raw(name);
49*cf5a6c84SAndroid Build Coastguard Worker if (len<1) {
50*cf5a6c84SAndroid Build Coastguard Worker // CRC the length at end
51*cf5a6c84SAndroid Build Coastguard Worker if (FLAG(N)) break;
52*cf5a6c84SAndroid Build Coastguard Worker for (llen2 = llen, len = 0; llen2; llen2 >>= 8) toybuf[len++] = llen2;
53*cf5a6c84SAndroid Build Coastguard Worker done++;
54*cf5a6c84SAndroid Build Coastguard Worker } else llen += len;
55*cf5a6c84SAndroid Build Coastguard Worker for (i = 0; i<len; i++)
56*cf5a6c84SAndroid Build Coastguard Worker crc = FLAG(L) ? crc_table[(crc^toybuf[i])&0xff] ^ (crc>>8)
57*cf5a6c84SAndroid Build Coastguard Worker : (crc<<8) ^ crc_table[(crc>>24)^toybuf[i]];
58*cf5a6c84SAndroid Build Coastguard Worker if (done) break;
59*cf5a6c84SAndroid Build Coastguard Worker }
60*cf5a6c84SAndroid Build Coastguard Worker
61*cf5a6c84SAndroid Build Coastguard Worker printf(FLAG(H) ? "%08x" : "%u", FLAG(I) ? crc : ~crc);
62*cf5a6c84SAndroid Build Coastguard Worker if (!FLAG(N)) printf(" %llu", llen);
63*cf5a6c84SAndroid Build Coastguard Worker if (toys.optc) printf(" %s", name);
64*cf5a6c84SAndroid Build Coastguard Worker xputc('\n');
65*cf5a6c84SAndroid Build Coastguard Worker }
66*cf5a6c84SAndroid Build Coastguard Worker
cksum_main(void)67*cf5a6c84SAndroid Build Coastguard Worker void cksum_main(void)
68*cf5a6c84SAndroid Build Coastguard Worker {
69*cf5a6c84SAndroid Build Coastguard Worker loopfiles(toys.optargs, do_cksum);
70*cf5a6c84SAndroid Build Coastguard Worker }
71*cf5a6c84SAndroid Build Coastguard Worker
crc32_main(void)72*cf5a6c84SAndroid Build Coastguard Worker void crc32_main(void)
73*cf5a6c84SAndroid Build Coastguard Worker {
74*cf5a6c84SAndroid Build Coastguard Worker toys.optflags |= FLAG_H|FLAG_N|FLAG_P|FLAG_L;
75*cf5a6c84SAndroid Build Coastguard Worker if (toys.optc) toys.optc--;
76*cf5a6c84SAndroid Build Coastguard Worker cksum_main();
77*cf5a6c84SAndroid Build Coastguard Worker }
78