Home | History | Annotate | Line # | Download | only in mtree
      1  1.11  christos /*	$NetBSD: crc.c,v 1.11 2024/12/05 17:17:43 christos Exp $	*/
      2   1.1   mycroft 
      3   1.1   mycroft /*-
      4   1.1   mycroft  * Copyright (c) 1991, 1993
      5   1.1   mycroft  *	The Regents of the University of California.  All rights reserved.
      6   1.1   mycroft  *
      7   1.1   mycroft  * This code is derived from software contributed to Berkeley by
      8   1.1   mycroft  * James W. Williams of NASA Goddard Space Flight Center.
      9   1.1   mycroft  *
     10   1.1   mycroft  * Redistribution and use in source and binary forms, with or without
     11   1.1   mycroft  * modification, are permitted provided that the following conditions
     12   1.1   mycroft  * are met:
     13   1.1   mycroft  * 1. Redistributions of source code must retain the above copyright
     14   1.1   mycroft  *    notice, this list of conditions and the following disclaimer.
     15   1.1   mycroft  * 2. Redistributions in binary form must reproduce the above copyright
     16   1.1   mycroft  *    notice, this list of conditions and the following disclaimer in the
     17   1.1   mycroft  *    documentation and/or other materials provided with the distribution.
     18   1.5       agc  * 3. Neither the name of the University nor the names of its contributors
     19   1.1   mycroft  *    may be used to endorse or promote products derived from this software
     20   1.1   mycroft  *    without specific prior written permission.
     21   1.1   mycroft  *
     22   1.1   mycroft  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
     23   1.1   mycroft  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     24   1.1   mycroft  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
     25   1.1   mycroft  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
     26   1.1   mycroft  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
     27   1.1   mycroft  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
     28   1.1   mycroft  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
     29   1.1   mycroft  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
     30   1.1   mycroft  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
     31   1.1   mycroft  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
     32   1.1   mycroft  * SUCH DAMAGE.
     33   1.1   mycroft  */
     34   1.1   mycroft 
     35   1.6       jmc #if HAVE_NBTOOL_CONFIG_H
     36   1.6       jmc #include "nbtool_config.h"
     37   1.6       jmc #endif
     38   1.6       jmc 
     39   1.1   mycroft #include <sys/cdefs.h>
     40   1.4        tv #if defined(__RCSID) && !defined(lint)
     41   1.1   mycroft #if 0
     42   1.1   mycroft static char sccsid[] = "@(#)crc.c	8.1 (Berkeley) 6/17/93";
     43   1.1   mycroft #else
     44  1.11  christos __RCSID("$NetBSD: crc.c,v 1.11 2024/12/05 17:17:43 christos Exp $");
     45   1.1   mycroft #endif
     46   1.1   mycroft #endif /* not lint */
     47   1.1   mycroft 
     48   1.1   mycroft #include <sys/types.h>
     49   1.1   mycroft 
     50   1.2     lukem #include <stdio.h>
     51   1.2     lukem #include <time.h>
     52   1.1   mycroft #include <unistd.h>
     53   1.1   mycroft 
     54   1.1   mycroft #include "extern.h"
     55   1.1   mycroft 
     56  1.10   cheusov static const uint32_t crctab[] = {
     57   1.1   mycroft 	0x0,
     58   1.1   mycroft 	0x04c11db7, 0x09823b6e, 0x0d4326d9, 0x130476dc, 0x17c56b6b,
     59   1.1   mycroft 	0x1a864db2, 0x1e475005, 0x2608edb8, 0x22c9f00f, 0x2f8ad6d6,
     60   1.1   mycroft 	0x2b4bcb61, 0x350c9b64, 0x31cd86d3, 0x3c8ea00a, 0x384fbdbd,
     61   1.1   mycroft 	0x4c11db70, 0x48d0c6c7, 0x4593e01e, 0x4152fda9, 0x5f15adac,
     62   1.1   mycroft 	0x5bd4b01b, 0x569796c2, 0x52568b75, 0x6a1936c8, 0x6ed82b7f,
     63   1.1   mycroft 	0x639b0da6, 0x675a1011, 0x791d4014, 0x7ddc5da3, 0x709f7b7a,
     64   1.1   mycroft 	0x745e66cd, 0x9823b6e0, 0x9ce2ab57, 0x91a18d8e, 0x95609039,
     65   1.1   mycroft 	0x8b27c03c, 0x8fe6dd8b, 0x82a5fb52, 0x8664e6e5, 0xbe2b5b58,
     66   1.1   mycroft 	0xbaea46ef, 0xb7a96036, 0xb3687d81, 0xad2f2d84, 0xa9ee3033,
     67   1.1   mycroft 	0xa4ad16ea, 0xa06c0b5d, 0xd4326d90, 0xd0f37027, 0xddb056fe,
     68   1.1   mycroft 	0xd9714b49, 0xc7361b4c, 0xc3f706fb, 0xceb42022, 0xca753d95,
     69   1.1   mycroft 	0xf23a8028, 0xf6fb9d9f, 0xfbb8bb46, 0xff79a6f1, 0xe13ef6f4,
     70   1.1   mycroft 	0xe5ffeb43, 0xe8bccd9a, 0xec7dd02d, 0x34867077, 0x30476dc0,
     71   1.1   mycroft 	0x3d044b19, 0x39c556ae, 0x278206ab, 0x23431b1c, 0x2e003dc5,
     72   1.1   mycroft 	0x2ac12072, 0x128e9dcf, 0x164f8078, 0x1b0ca6a1, 0x1fcdbb16,
     73   1.1   mycroft 	0x018aeb13, 0x054bf6a4, 0x0808d07d, 0x0cc9cdca, 0x7897ab07,
     74   1.1   mycroft 	0x7c56b6b0, 0x71159069, 0x75d48dde, 0x6b93dddb, 0x6f52c06c,
     75   1.1   mycroft 	0x6211e6b5, 0x66d0fb02, 0x5e9f46bf, 0x5a5e5b08, 0x571d7dd1,
     76   1.1   mycroft 	0x53dc6066, 0x4d9b3063, 0x495a2dd4, 0x44190b0d, 0x40d816ba,
     77   1.1   mycroft 	0xaca5c697, 0xa864db20, 0xa527fdf9, 0xa1e6e04e, 0xbfa1b04b,
     78   1.1   mycroft 	0xbb60adfc, 0xb6238b25, 0xb2e29692, 0x8aad2b2f, 0x8e6c3698,
     79   1.1   mycroft 	0x832f1041, 0x87ee0df6, 0x99a95df3, 0x9d684044, 0x902b669d,
     80   1.1   mycroft 	0x94ea7b2a, 0xe0b41de7, 0xe4750050, 0xe9362689, 0xedf73b3e,
     81   1.1   mycroft 	0xf3b06b3b, 0xf771768c, 0xfa325055, 0xfef34de2, 0xc6bcf05f,
     82   1.1   mycroft 	0xc27dede8, 0xcf3ecb31, 0xcbffd686, 0xd5b88683, 0xd1799b34,
     83   1.1   mycroft 	0xdc3abded, 0xd8fba05a, 0x690ce0ee, 0x6dcdfd59, 0x608edb80,
     84   1.1   mycroft 	0x644fc637, 0x7a089632, 0x7ec98b85, 0x738aad5c, 0x774bb0eb,
     85   1.1   mycroft 	0x4f040d56, 0x4bc510e1, 0x46863638, 0x42472b8f, 0x5c007b8a,
     86   1.1   mycroft 	0x58c1663d, 0x558240e4, 0x51435d53, 0x251d3b9e, 0x21dc2629,
     87   1.1   mycroft 	0x2c9f00f0, 0x285e1d47, 0x36194d42, 0x32d850f5, 0x3f9b762c,
     88   1.1   mycroft 	0x3b5a6b9b, 0x0315d626, 0x07d4cb91, 0x0a97ed48, 0x0e56f0ff,
     89   1.1   mycroft 	0x1011a0fa, 0x14d0bd4d, 0x19939b94, 0x1d528623, 0xf12f560e,
     90   1.1   mycroft 	0xf5ee4bb9, 0xf8ad6d60, 0xfc6c70d7, 0xe22b20d2, 0xe6ea3d65,
     91   1.1   mycroft 	0xeba91bbc, 0xef68060b, 0xd727bbb6, 0xd3e6a601, 0xdea580d8,
     92   1.1   mycroft 	0xda649d6f, 0xc423cd6a, 0xc0e2d0dd, 0xcda1f604, 0xc960ebb3,
     93   1.1   mycroft 	0xbd3e8d7e, 0xb9ff90c9, 0xb4bcb610, 0xb07daba7, 0xae3afba2,
     94   1.1   mycroft 	0xaafbe615, 0xa7b8c0cc, 0xa379dd7b, 0x9b3660c6, 0x9ff77d71,
     95   1.1   mycroft 	0x92b45ba8, 0x9675461f, 0x8832161a, 0x8cf30bad, 0x81b02d74,
     96   1.1   mycroft 	0x857130c3, 0x5d8a9099, 0x594b8d2e, 0x5408abf7, 0x50c9b640,
     97   1.1   mycroft 	0x4e8ee645, 0x4a4ffbf2, 0x470cdd2b, 0x43cdc09c, 0x7b827d21,
     98   1.1   mycroft 	0x7f436096, 0x7200464f, 0x76c15bf8, 0x68860bfd, 0x6c47164a,
     99   1.1   mycroft 	0x61043093, 0x65c52d24, 0x119b4be9, 0x155a565e, 0x18197087,
    100   1.1   mycroft 	0x1cd86d30, 0x029f3d35, 0x065e2082, 0x0b1d065b, 0x0fdc1bec,
    101   1.1   mycroft 	0x3793a651, 0x3352bbe6, 0x3e119d3f, 0x3ad08088, 0x2497d08d,
    102   1.1   mycroft 	0x2056cd3a, 0x2d15ebe3, 0x29d4f654, 0xc5a92679, 0xc1683bce,
    103   1.1   mycroft 	0xcc2b1d17, 0xc8ea00a0, 0xd6ad50a5, 0xd26c4d12, 0xdf2f6bcb,
    104   1.1   mycroft 	0xdbee767c, 0xe3a1cbc1, 0xe760d676, 0xea23f0af, 0xeee2ed18,
    105   1.1   mycroft 	0xf0a5bd1d, 0xf464a0aa, 0xf9278673, 0xfde69bc4, 0x89b8fd09,
    106   1.1   mycroft 	0x8d79e0be, 0x803ac667, 0x84fbdbd0, 0x9abc8bd5, 0x9e7d9662,
    107   1.1   mycroft 	0x933eb0bb, 0x97ffad0c, 0xafb010b1, 0xab710d06, 0xa6322bdf,
    108   1.1   mycroft 	0xa2f33668, 0xbcb4666d, 0xb8757bda, 0xb5365d03, 0xb1f740b4
    109   1.1   mycroft };
    110   1.1   mycroft 
    111   1.1   mycroft /*
    112   1.1   mycroft  * Compute a POSIX 1003.2 checksum.  This routine has been broken out so that
    113   1.1   mycroft  * other programs can use it.  It takes a file descriptor to read from and
    114   1.1   mycroft  * locations to store the crc and the number of bytes read.  It returns 0 on
    115   1.1   mycroft  * success and 1 on failure.  Errno is set on failure.
    116   1.1   mycroft  */
    117  1.11  christos uint32_t crc_total = ~0u;		/* The crc over a number of files. */
    118   1.1   mycroft 
    119   1.1   mycroft int
    120  1.10   cheusov crc(int fd, uint32_t *cval, uint32_t *clen)
    121   1.1   mycroft {
    122   1.7     perry 	u_char *p;
    123  1.11  christos 	ssize_t nr;
    124  1.10   cheusov 	uint32_t thecrc, len;
    125  1.10   cheusov 	uint32_t crctot;
    126   1.1   mycroft 	u_char buf[16 * 1024];
    127   1.1   mycroft 
    128   1.1   mycroft #define	COMPUTE(var, ch)	(var) = (var) << 8 ^ crctab[(var) >> 24 ^ (ch)]
    129   1.1   mycroft 
    130   1.8     lukem 	thecrc = len = crctot = 0;
    131   1.1   mycroft 	if (sflag)
    132   1.1   mycroft 		crctot = ~crc_total;
    133   1.1   mycroft 	while ((nr = read(fd, buf, sizeof(buf))) > 0)
    134   1.1   mycroft 		if (sflag) {
    135  1.11  christos 			for (len += (uint32_t)nr, p = buf; nr--; ++p) {
    136   1.1   mycroft 				COMPUTE(thecrc, *p);
    137   1.1   mycroft 				COMPUTE(crctot, *p);
    138   1.1   mycroft 			}
    139   1.1   mycroft 		} else {
    140  1.11  christos 			for (len += (uint32_t)nr, p = buf; nr--; ++p)
    141   1.1   mycroft 				COMPUTE(thecrc, *p);
    142   1.1   mycroft 		}
    143   1.1   mycroft 	if (nr < 0)
    144   1.7     perry 		return 1;
    145   1.1   mycroft 
    146   1.1   mycroft 	*clen = len;
    147   1.1   mycroft 
    148   1.1   mycroft 	/* Include the length of the file. */
    149   1.1   mycroft 	if (sflag) {
    150   1.1   mycroft 		for (; len != 0; len >>= 8) {
    151   1.1   mycroft 			COMPUTE(thecrc, len & 0xff);
    152   1.1   mycroft 			COMPUTE(crctot, len & 0xff);
    153   1.1   mycroft 		}
    154   1.1   mycroft 	} else {
    155   1.1   mycroft 		for (; len != 0; len >>= 8)
    156   1.1   mycroft 			COMPUTE(thecrc, len & 0xff);
    157   1.1   mycroft 	}
    158   1.1   mycroft 
    159   1.1   mycroft 	*cval = ~thecrc;
    160   1.1   mycroft 	if (sflag)
    161   1.1   mycroft 		crc_total = ~crctot;
    162   1.7     perry 	return 0;
    163   1.1   mycroft }
    164