source: MondoRescue/branches/3.3/mindi-busybox/coreutils/cksum.c@ 3865

Last change on this file since 3865 was 3621, checked in by Bruno Cornec, 10 years ago

New 3?3 banch for incorporation of latest busybox 1.25. Changing minor version to handle potential incompatibilities.

File size: 1.8 KB
RevLine 
[821]1/* vi: set sw=4 ts=4: */
2/*
3 * cksum - calculate the CRC32 checksum of a file
4 *
5 * Copyright (C) 2006 by Rob Sullivan, with ideas from code by Walter Harms
[1765]6 *
[2725]7 * Licensed under GPLv2 or later, see file LICENSE in this source tree.
8 */
[3232]9
10//usage:#define cksum_trivial_usage
11//usage: "FILES..."
12//usage:#define cksum_full_usage "\n\n"
13//usage: "Calculate the CRC32 checksums of FILES"
14
[1765]15#include "libbb.h"
[3621]16#include "common_bufsiz.h"
[821]17
[2725]18/* This is a NOEXEC applet. Be very careful! */
19
20int cksum_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
21int cksum_main(int argc UNUSED_PARAM, char **argv)
[1765]22{
23 uint32_t *crc32_table = crc32_filltable(NULL, 1);
[821]24 uint32_t crc;
[2725]25 off_t length, filesize;
[821]26 int bytes_read;
[2725]27 int exit_code = EXIT_SUCCESS;
[1765]28
[2725]29#if ENABLE_DESKTOP
30 getopt32(argv, ""); /* coreutils 6.9 compat */
31 argv += optind;
32#else
33 argv++;
34#endif
[1765]35
[3621]36 setup_common_bufsiz();
[821]37 do {
[2725]38 int fd = open_or_warn_stdin(*argv ? *argv : bb_msg_standard_input);
[1765]39
[2725]40 if (fd < 0) {
41 exit_code = EXIT_FAILURE;
42 continue;
43 }
[821]44 crc = 0;
45 length = 0;
[1765]46
47#define read_buf bb_common_bufsiz1
[3621]48 while ((bytes_read = safe_read(fd, read_buf, COMMON_BUFSIZE)) > 0) {
[2859]49 length += bytes_read;
[2725]50 crc = crc32_block_endian1(crc, read_buf, bytes_read, crc32_table);
[821]51 }
[2725]52 close(fd);
[1765]53
[821]54 filesize = length;
[1765]55
[2725]56 while (length) {
57 crc = (crc << 8) ^ crc32_table[(uint8_t)(crc >> 24) ^ (uint8_t)length];
58 /* must ensure that shift is unsigned! */
59 if (sizeof(length) <= sizeof(unsigned))
60 length = (unsigned)length >> 8;
61 else if (sizeof(length) <= sizeof(unsigned long))
62 length = (unsigned long)length >> 8;
63 else
64 length = (unsigned long long)length >> 8;
[821]65 }
[2725]66 crc = ~crc;
[1765]67
[2725]68 printf((*argv ? "%"PRIu32" %"OFF_FMT"i %s\n" : "%"PRIu32" %"OFF_FMT"i\n"),
69 crc, filesize, *argv);
70 } while (*argv && *++argv);
[1765]71
[2725]72 fflush_stdout_and_exit(exit_code);
[821]73}
Note: See TracBrowser for help on using the repository browser.