summaryrefslogtreecommitdiffstats
path: root/commands/crc.c
diff options
context:
space:
mode:
authorSascha Hauer <s.hauer@pengutronix.de>2007-07-14 14:47:35 +0200
committerSascha Hauer <s.hauer@pengutronix.de>2007-07-14 14:47:35 +0200
commit7c809ab519b0bc0db12e242146ab8a5aaebf0324 (patch)
treed78faffadb615f2def58a43ad675326d18939268 /commands/crc.c
parent4b0ac7ecf7dd2a5c585df1f126699c4d90265ff6 (diff)
downloadbarebox-7c809ab519b0bc0db12e242146ab8a5aaebf0324.tar.gz
barebox-7c809ab519b0bc0db12e242146ab8a5aaebf0324.tar.xz
allow calculationg checksums of files
Diffstat (limited to 'commands/crc.c')
-rw-r--r--commands/crc.c159
1 files changed, 76 insertions, 83 deletions
diff --git a/commands/crc.c b/commands/crc.c
index d4e3590fcc..c45e193e0b 100644
--- a/commands/crc.c
+++ b/commands/crc.c
@@ -1,107 +1,100 @@
#include <common.h>
#include <command.h>
-
-#ifndef CONFIG_CRC32_VERIFY
-
-int do_mem_crc (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
+#include <fs.h>
+#include <getopt.h>
+#include <fcntl.h>
+#include <errno.h>
+#include <xfuncs.h>
+#include <malloc.h>
+#include <linux/ctype.h>
+
+int do_crc (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
{
- ulong addr, length;
- ulong crc;
- ulong *ptr;
+ ulong start = 0, size = ~0, total = 0, now;
+ ulong crc = 0, vcrc = 0;
+ char *filename = "/dev/mem";
+ char *buf;
+ int fd, opt, err = 0, filegiven = 0, verify = 0;
+
+ getopt_reset();
+
+ while((opt = getopt(argc, argv, "f:v:")) > 0) {
+ switch(opt) {
+ case 'f':
+ filename = optarg;
+ filegiven = 1;
+ break;
+ case 'v':
+ verify = 1;
+ vcrc = simple_strtoul(optarg, NULL, 0);
+ break;
+ }
+ }
- if (argc < 3) {
- printf ("Usage:\n%s\n", cmdtp->usage);
+ if (!filegiven && optind == argc) {
+ u_boot_cmd_usage(cmdtp);
return 1;
}
- addr = simple_strtoul (argv[1], NULL, 16);
+ if (optind < argc) {
+ if (parse_area_spec(argv[optind], &start, &size)) {
+ printf("could not parse area description: %s\n", argv[optind]);
+ return 1;
+ }
+ }
- length = simple_strtoul (argv[2], NULL, 16);
+ fd = open(filename, O_RDONLY);
+ if (fd < 0) {
+ printf("open %s: %s\n", filename, errno_str());
+ return 1;
+ }
- crc = crc32 (0, (const uchar *) addr, length);
+ if (lseek(fd, start, SEEK_SET) < 0) {
+ printf("file is smaller than start address\n");
+ err = 1;
+ goto out;
+ }
- printf ("CRC32 for %08lx ... %08lx ==> %08lx\n",
- addr, addr + length - 1, crc);
+ buf = xmalloc(4096);
- if (argc > 3) {
- ptr = (ulong *) simple_strtoul (argv[3], NULL, 16);
- *ptr = crc;
+ while (size) {
+ now = min((ulong)4096, size);
+ now = read(fd, buf, now);
+ if (!now)
+ break;
+ crc = crc32(crc, buf, now);
+ size -= now;
+ total += now;
}
- return 0;
-}
-
-#else /* CONFIG_CRC32_VERIFY */
+ printf ("CRC32 for %s 0x%08lx ... 0x%08lx ==> 0x%08lx",
+ filename, start, start + total - 1, crc);
-int do_mem_crc (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
-{
- ulong addr, length;
- ulong crc;
- ulong *ptr;
- ulong vcrc;
- int verify;
- int ac;
- char **av;
-
- if (argc < 3) {
- usage:
- printf ("Usage:\n%s\n", cmdtp->usage);
- return 1;
+ if (verify && crc != vcrc) {
+ printf(" != 0x%08x ** ERROR **", vcrc);
+ err = 1;
}
- av = argv + 1;
- ac = argc - 1;
- if (strcmp(*av, "-v") == 0) {
- verify = 1;
- av++;
- ac--;
- if (ac < 3)
- goto usage;
- } else
- verify = 0;
-
- addr = simple_strtoul(*av++, NULL, 16);
- length = simple_strtoul(*av++, NULL, 16);
-
- crc = crc32(0, (const uchar *) addr, length);
-
- if (!verify) {
- printf ("CRC32 for %08lx ... %08lx ==> %08lx\n",
- addr, addr + length - 1, crc);
- if (ac > 2) {
- ptr = (ulong *) simple_strtoul (*av++, NULL, 16);
- *ptr = crc;
- }
- } else {
- vcrc = simple_strtoul(*av++, NULL, 16);
- if (vcrc != crc) {
- printf ("CRC32 for %08lx ... %08lx ==> %08lx != %08lx ** ERROR **\n",
- addr, addr + length - 1, crc, vcrc);
- return 1;
- }
- }
+ printf("\n");
- return 0;
+ free(buf);
+out:
+ close(fd);
+ return err;
}
-#endif /* CONFIG_CRC32_VERIFY */
-#ifndef CONFIG_CRC32_VERIFY
+static __maybe_unused char cmd_crc_help[] =
+"Usage: crc32 [OPTION] [AREA]\n"
+"Calculate a crc32 checksum of a memory area\n"
+"Options:\n"
+" -f <file> Use file instead of memory\n"
+" -v <crc> Verfify\n";
U_BOOT_CMD_START(crc32)
- .maxargs = 4,
- .cmd = do_mem_crc,
- .usage = "checksum calculation",
- U_BOOT_CMD_HELP("address count [addr]\n - compute CRC32 checksum [save at addr]\n")
+ .maxargs = CONFIG_MAXARGS,
+ .cmd = do_crc,
+ .usage = "crc32 checksum calculation",
+ U_BOOT_CMD_HELP(cmd_crc_help)
U_BOOT_CMD_END
-#else /* CONFIG_CRC32_VERIFY */
-
-U_BOOT_CMD(
- crc32, 5, 0, do_mem_crc,
- "crc32 - checksum calculation\n",
- "address count [addr]\n - compute CRC32 checksum [save at addr]\n"
- "-v address count crc\n - verify crc of memory area\n"
-);
-
-#endif /* CONFIG_CRC32_VERIFY */