xref: /aosp_15_r20/external/e2fsprogs/tests/progs/crcsum.c (revision 6a54128f25917bfc36a8a6e9d722c04a0b4641b6)
1*6a54128fSAndroid Build Coastguard Worker /*
2*6a54128fSAndroid Build Coastguard Worker  * crcsum.c
3*6a54128fSAndroid Build Coastguard Worker  *
4*6a54128fSAndroid Build Coastguard Worker  * Copyright (C) 2013 Theodore Ts'o.
5*6a54128fSAndroid Build Coastguard Worker  *
6*6a54128fSAndroid Build Coastguard Worker  * %Begin-Header%
7*6a54128fSAndroid Build Coastguard Worker  * This file may be redistributed under the terms of the GNU Public
8*6a54128fSAndroid Build Coastguard Worker  * License.
9*6a54128fSAndroid Build Coastguard Worker  * %End-Header%
10*6a54128fSAndroid Build Coastguard Worker  */
11*6a54128fSAndroid Build Coastguard Worker 
12*6a54128fSAndroid Build Coastguard Worker #include "config.h"
13*6a54128fSAndroid Build Coastguard Worker #include <stdio.h>
14*6a54128fSAndroid Build Coastguard Worker #include <stdlib.h>
15*6a54128fSAndroid Build Coastguard Worker #include <stdint.h>
16*6a54128fSAndroid Build Coastguard Worker #include <string.h>
17*6a54128fSAndroid Build Coastguard Worker #include <unistd.h>
18*6a54128fSAndroid Build Coastguard Worker #ifdef HAVE_GETOPT_H
19*6a54128fSAndroid Build Coastguard Worker #include <getopt.h>
20*6a54128fSAndroid Build Coastguard Worker #endif
21*6a54128fSAndroid Build Coastguard Worker #include <fcntl.h>
22*6a54128fSAndroid Build Coastguard Worker 
23*6a54128fSAndroid Build Coastguard Worker #include "et/com_err.h"
24*6a54128fSAndroid Build Coastguard Worker #include "ss/ss.h"
25*6a54128fSAndroid Build Coastguard Worker #include "ext2fs/ext2fs.h"
26*6a54128fSAndroid Build Coastguard Worker 
27*6a54128fSAndroid Build Coastguard Worker 
main(int argc,char ** argv)28*6a54128fSAndroid Build Coastguard Worker int main(int argc, char **argv)
29*6a54128fSAndroid Build Coastguard Worker {
30*6a54128fSAndroid Build Coastguard Worker 	int		c;
31*6a54128fSAndroid Build Coastguard Worker 	uint32_t	crc = ~0;
32*6a54128fSAndroid Build Coastguard Worker 	uint32_t	(*csum_func)(uint32_t crc, unsigned char const *p,
33*6a54128fSAndroid Build Coastguard Worker 				     size_t len);
34*6a54128fSAndroid Build Coastguard Worker 	FILE		*f;
35*6a54128fSAndroid Build Coastguard Worker 
36*6a54128fSAndroid Build Coastguard Worker 	csum_func = ext2fs_crc32c_le;
37*6a54128fSAndroid Build Coastguard Worker 
38*6a54128fSAndroid Build Coastguard Worker 	while ((c = getopt (argc, argv, "h")) != EOF) {
39*6a54128fSAndroid Build Coastguard Worker 		switch (c) {
40*6a54128fSAndroid Build Coastguard Worker 		case 'h':
41*6a54128fSAndroid Build Coastguard Worker 		default:
42*6a54128fSAndroid Build Coastguard Worker 			com_err(argv[0], 0, "Usage: crcsum [file]\n");
43*6a54128fSAndroid Build Coastguard Worker 			return 1;
44*6a54128fSAndroid Build Coastguard Worker 		}
45*6a54128fSAndroid Build Coastguard Worker 	}
46*6a54128fSAndroid Build Coastguard Worker 
47*6a54128fSAndroid Build Coastguard Worker 	if (optind == argc)
48*6a54128fSAndroid Build Coastguard Worker 		f = stdin;
49*6a54128fSAndroid Build Coastguard Worker 	else {
50*6a54128fSAndroid Build Coastguard Worker 		f = fopen(argv[optind], "r");
51*6a54128fSAndroid Build Coastguard Worker 		if (!f) {
52*6a54128fSAndroid Build Coastguard Worker 			com_err(argv[0], errno, "while trying to open %s\n",
53*6a54128fSAndroid Build Coastguard Worker 				argv[optind]);
54*6a54128fSAndroid Build Coastguard Worker 			exit(1);
55*6a54128fSAndroid Build Coastguard Worker 		}
56*6a54128fSAndroid Build Coastguard Worker 	}
57*6a54128fSAndroid Build Coastguard Worker 
58*6a54128fSAndroid Build Coastguard Worker 	while (!feof(f)) {
59*6a54128fSAndroid Build Coastguard Worker 		unsigned char buf[4096];
60*6a54128fSAndroid Build Coastguard Worker 		int cnt = fread(buf, 1, sizeof(buf), f);
61*6a54128fSAndroid Build Coastguard Worker 
62*6a54128fSAndroid Build Coastguard Worker 		if (cnt)
63*6a54128fSAndroid Build Coastguard Worker 			crc = csum_func(crc, buf, cnt);
64*6a54128fSAndroid Build Coastguard Worker 	}
65*6a54128fSAndroid Build Coastguard Worker 	printf("%u\n", crc);
66*6a54128fSAndroid Build Coastguard Worker 	return 0;
67*6a54128fSAndroid Build Coastguard Worker }
68