xref: /aosp_15_r20/external/toybox/toys/posix/cksum.c (revision cf5a6c84e2b8763fc1a7db14496fd4742913b199)
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