diff options
author | Sascha Hauer <s.hauer@pengutronix.de> | 2007-07-14 14:47:35 +0200 |
---|---|---|
committer | Sascha Hauer <s.hauer@pengutronix.de> | 2007-07-14 14:47:35 +0200 |
commit | 7c809ab519b0bc0db12e242146ab8a5aaebf0324 (patch) | |
tree | d78faffadb615f2def58a43ad675326d18939268 /commands/crc.c | |
parent | 4b0ac7ecf7dd2a5c585df1f126699c4d90265ff6 (diff) | |
download | barebox-7c809ab519b0bc0db12e242146ab8a5aaebf0324.tar.gz barebox-7c809ab519b0bc0db12e242146ab8a5aaebf0324.tar.xz |
allow calculationg checksums of files
Diffstat (limited to 'commands/crc.c')
-rw-r--r-- | commands/crc.c | 159 |
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 */ |