Mercurial > hg > toybox
annotate toys/cksum.c @ 338:a4c26369ec43
Accidentally changed cksum behavior with the -P flag, toggle its meaning.
author | Rob Landley <rob@landley.net> |
---|---|
date | Mon, 05 Jan 2009 01:47:48 -0600 |
parents | aaafa1ceaa91 |
children | 0cc0c0e879d1 |
rev | line source |
---|---|
333 | 1 /* vi: set sw=4 ts=4: |
2 * | |
3 * cksum.c - produce crc32 checksum value for each input | |
4 * | |
5 * Copyright 2008 Rob Landley <rob@landley.net> | |
6 * | |
7 * See http://www.opengroup.org/onlinepubs/009695399/utilities/cksum.html | |
8 | |
337
aaafa1ceaa91
Add -N, -I, -L, and -P options to cksum.
Rob Landley <rob@landley.net>
parents:
336
diff
changeset
|
9 USE_CKSUM(NEWTOY(cksum, "IPLN", TOYFLAG_BIN)) |
333 | 10 |
11 config CKSUM | |
12 bool "cksum" | |
13 default y | |
14 help | |
337
aaafa1ceaa91
Add -N, -I, -L, and -P options to cksum.
Rob Landley <rob@landley.net>
parents:
336
diff
changeset
|
15 usage: cksum [-FL] [file...] |
336 | 16 |
333 | 17 For each file, output crc32 checksum value, length and name of file. |
18 If no files listed, copy from stdin. Filename "-" is a synonym for stdin. | |
336 | 19 |
337
aaafa1ceaa91
Add -N, -I, -L, and -P options to cksum.
Rob Landley <rob@landley.net>
parents:
336
diff
changeset
|
20 -L Little endian (defaults to big endian) |
338
a4c26369ec43
Accidentally changed cksum behavior with the -P flag, toggle its meaning.
Rob Landley <rob@landley.net>
parents:
337
diff
changeset
|
21 -P Pre-inversion |
337
aaafa1ceaa91
Add -N, -I, -L, and -P options to cksum.
Rob Landley <rob@landley.net>
parents:
336
diff
changeset
|
22 -I Skip post-inversion |
aaafa1ceaa91
Add -N, -I, -L, and -P options to cksum.
Rob Landley <rob@landley.net>
parents:
336
diff
changeset
|
23 -N No length |
333 | 24 */ |
25 | |
26 #include "toys.h" | |
27 | |
28 DEFINE_GLOBALS( | |
29 unsigned crc_table[256]; | |
30 ) | |
31 | |
32 #define TT this.cksum | |
33 | |
337
aaafa1ceaa91
Add -N, -I, -L, and -P options to cksum.
Rob Landley <rob@landley.net>
parents:
336
diff
changeset
|
34 static unsigned cksum_be(unsigned crc, unsigned char c) |
333 | 35 { |
36 return (crc<<8)^TT.crc_table[(crc>>24)^c]; | |
37 } | |
38 | |
337
aaafa1ceaa91
Add -N, -I, -L, and -P options to cksum.
Rob Landley <rob@landley.net>
parents:
336
diff
changeset
|
39 static unsigned cksum_le(unsigned crc, unsigned char c) |
aaafa1ceaa91
Add -N, -I, -L, and -P options to cksum.
Rob Landley <rob@landley.net>
parents:
336
diff
changeset
|
40 { |
aaafa1ceaa91
Add -N, -I, -L, and -P options to cksum.
Rob Landley <rob@landley.net>
parents:
336
diff
changeset
|
41 return TT.crc_table[(crc^c)&0xff] ^ (crc>>8); |
aaafa1ceaa91
Add -N, -I, -L, and -P options to cksum.
Rob Landley <rob@landley.net>
parents:
336
diff
changeset
|
42 } |
aaafa1ceaa91
Add -N, -I, -L, and -P options to cksum.
Rob Landley <rob@landley.net>
parents:
336
diff
changeset
|
43 |
333 | 44 static void do_cksum(int fd, char *name) |
45 { | |
338
a4c26369ec43
Accidentally changed cksum behavior with the -P flag, toggle its meaning.
Rob Landley <rob@landley.net>
parents:
337
diff
changeset
|
46 unsigned crc = (toys.optflags&4) ? 0xffffffff : 0; |
333 | 47 uint64_t llen = 0, llen2; |
337
aaafa1ceaa91
Add -N, -I, -L, and -P options to cksum.
Rob Landley <rob@landley.net>
parents:
336
diff
changeset
|
48 unsigned (*cksum)(unsigned crc, unsigned char c); |
333 | 49 |
337
aaafa1ceaa91
Add -N, -I, -L, and -P options to cksum.
Rob Landley <rob@landley.net>
parents:
336
diff
changeset
|
50 |
aaafa1ceaa91
Add -N, -I, -L, and -P options to cksum.
Rob Landley <rob@landley.net>
parents:
336
diff
changeset
|
51 cksum = (toys.optflags&2) ? cksum_le : cksum_be; |
333 | 52 // CRC the data |
53 | |
54 for (;;) { | |
55 int len, i; | |
56 | |
57 len = read(fd, toybuf, sizeof(toybuf)); | |
58 if (len<0) { | |
59 perror_msg("%s",name); | |
60 toys.exitval = EXIT_FAILURE; | |
61 } | |
62 if (len<1) break; | |
63 | |
64 llen += len; | |
65 for (i=0; i<len; i++) crc=cksum(crc, toybuf[i]); | |
66 } | |
67 | |
68 // CRC the length | |
69 | |
70 llen2 = llen; | |
337
aaafa1ceaa91
Add -N, -I, -L, and -P options to cksum.
Rob Landley <rob@landley.net>
parents:
336
diff
changeset
|
71 if (!(toys.optflags&1)) { |
aaafa1ceaa91
Add -N, -I, -L, and -P options to cksum.
Rob Landley <rob@landley.net>
parents:
336
diff
changeset
|
72 while (llen) { |
aaafa1ceaa91
Add -N, -I, -L, and -P options to cksum.
Rob Landley <rob@landley.net>
parents:
336
diff
changeset
|
73 crc = cksum(crc, llen); |
aaafa1ceaa91
Add -N, -I, -L, and -P options to cksum.
Rob Landley <rob@landley.net>
parents:
336
diff
changeset
|
74 llen >>= 8; |
aaafa1ceaa91
Add -N, -I, -L, and -P options to cksum.
Rob Landley <rob@landley.net>
parents:
336
diff
changeset
|
75 } |
333 | 76 } |
77 | |
337
aaafa1ceaa91
Add -N, -I, -L, and -P options to cksum.
Rob Landley <rob@landley.net>
parents:
336
diff
changeset
|
78 printf("%u %"PRIu64, (toys.optflags&8) ? crc : ~crc, llen2); |
333 | 79 if (strcmp("-", name)) printf(" %s", name); |
80 xputc('\n'); | |
81 } | |
82 | |
83 void cksum_main(void) | |
84 { | |
337
aaafa1ceaa91
Add -N, -I, -L, and -P options to cksum.
Rob Landley <rob@landley.net>
parents:
336
diff
changeset
|
85 crc_init(TT.crc_table, toys.optflags&2); |
333 | 86 loopfiles(toys.optargs, do_cksum); |
87 } |