Home | History | Annotate | Line # | Download | only in cksum
crc.c revision 1.1
      1  1.1  cgd /*-
      2  1.1  cgd  * Copyright (c) 1991 The Regents of the University of California.
      3  1.1  cgd  * All rights reserved.
      4  1.1  cgd  *
      5  1.1  cgd  * This code is derived from software contributed to Berkeley by
      6  1.1  cgd  * James W. Williams of the University of Maryland.
      7  1.1  cgd  *
      8  1.1  cgd  * Redistribution and use in source and binary forms, with or without
      9  1.1  cgd  * modification, are permitted provided that the following conditions
     10  1.1  cgd  * are met:
     11  1.1  cgd  * 1. Redistributions of source code must retain the above copyright
     12  1.1  cgd  *    notice, this list of conditions and the following disclaimer.
     13  1.1  cgd  * 2. Redistributions in binary form must reproduce the above copyright
     14  1.1  cgd  *    notice, this list of conditions and the following disclaimer in the
     15  1.1  cgd  *    documentation and/or other materials provided with the distribution.
     16  1.1  cgd  * 3. All advertising materials mentioning features or use of this software
     17  1.1  cgd  *    must display the following acknowledgement:
     18  1.1  cgd  *	This product includes software developed by the University of
     19  1.1  cgd  *	California, Berkeley and its contributors.
     20  1.1  cgd  * 4. Neither the name of the University nor the names of its contributors
     21  1.1  cgd  *    may be used to endorse or promote products derived from this software
     22  1.1  cgd  *    without specific prior written permission.
     23  1.1  cgd  *
     24  1.1  cgd  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
     25  1.1  cgd  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     26  1.1  cgd  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
     27  1.1  cgd  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
     28  1.1  cgd  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
     29  1.1  cgd  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
     30  1.1  cgd  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
     31  1.1  cgd  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
     32  1.1  cgd  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
     33  1.1  cgd  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
     34  1.1  cgd  * SUCH DAMAGE.
     35  1.1  cgd  */
     36  1.1  cgd 
     37  1.1  cgd #ifndef lint
     38  1.1  cgd static char sccsid[] = "@(#)crc.c	5.2 (Berkeley) 4/4/91";
     39  1.1  cgd #endif /* not lint */
     40  1.1  cgd 
     41  1.1  cgd #include <sys/types.h>
     42  1.1  cgd #include <unistd.h>
     43  1.1  cgd 
     44  1.1  cgd u_long crctab[] = {
     45  1.1  cgd 	0x7fffffff,
     46  1.1  cgd 	0x77073096,  0xee0e612c,  0x990951ba,  0x076dc419,  0x706af48f,
     47  1.1  cgd 	0xe963a535,  0x9e6495a3,  0x0edb8832,  0x79dcb8a4,  0xe0d5e91e,
     48  1.1  cgd 	0x97d2d988,  0x09b64c2b,  0x7eb17cbd,  0xe7b82d07,  0x90bf1d91,
     49  1.1  cgd 	0x1db71064,  0x6ab020f2,  0xf3b97148,  0x84be41de,  0x1adad47d,
     50  1.1  cgd 	0x6ddde4eb,  0xf4d4b551,  0x83d385c7,  0x136c9856,  0x646ba8c0,
     51  1.1  cgd 	0xfd62f97a,  0x8a65c9ec,  0x14015c4f,  0x63066cd9,  0xfa0f3d63,
     52  1.1  cgd 	0x8d080df5,  0x3b6e20c8,  0x4c69105e,  0xd56041e4,  0xa2677172,
     53  1.1  cgd 	0x3c03e4d1,  0x4b04d447,  0xd20d85fd,  0xa50ab56b,  0x35b5a8fa,
     54  1.1  cgd 	0x42b2986c,  0xdbbbc9d6,  0xacbcf940,  0x32d86ce3,  0x45df5c75,
     55  1.1  cgd 	0xdcd60dcf,  0xabd13d59,  0x26d930ac,  0x51de003a,  0xc8d75180,
     56  1.1  cgd 	0xbfd06116,  0x21b4f4b5,  0x56b3c423,  0xcfba9599,  0xb8bda50f,
     57  1.1  cgd 	0x2802b89e,  0x5f058808,  0xc60cd9b2,  0xb10be924,  0x2f6f7c87,
     58  1.1  cgd 	0x58684c11,  0xc1611dab,  0xb6662d3d,  0x76dc4190,  0x01db7106,
     59  1.1  cgd 	0x98d220bc,  0xefd5102a,  0x71b18589,  0x06b6b51f,  0x9fbfe4a5,
     60  1.1  cgd 	0xe8b8d433,  0x7807c9a2,  0x0f00f934,  0x9609a88e,  0xe10e9818,
     61  1.1  cgd 	0x7f6a0dbb,  0x086d3d2d,  0x91646c97,  0xe6635c01,  0x6b6b51f4,
     62  1.1  cgd 	0x1c6c6162,  0x856530d8,  0xf262004e,  0x6c0695ed,  0x1b01a57b,
     63  1.1  cgd 	0x8208f4c1,  0xf50fc457,  0x65b0d9c6,  0x12b7e950,  0x8bbeb8ea,
     64  1.1  cgd 	0xfcb9887c,  0x62dd1ddf,  0x15da2d49,  0x8cd37cf3,  0xfbd44c65,
     65  1.1  cgd 	0x4db26158,  0x3ab551ce,  0xa3bc0074,  0xd4bb30e2,  0x4adfa541,
     66  1.1  cgd 	0x3dd895d7,  0xa4d1c46d,  0xd3d6f4fb,  0x4369e96a,  0x346ed9fc,
     67  1.1  cgd 	0xad678846,  0xda60b8d0,  0x44042d73,  0x33031de5,  0xaa0a4c5f,
     68  1.1  cgd 	0xdd0d7cc9,  0x5005713c,  0x270241aa,  0xbe0b1010,  0xc90c2086,
     69  1.1  cgd 	0x5768b525,  0x206f85b3,  0xb966d409,  0xce61e49f,  0x5edef90e,
     70  1.1  cgd 	0x29d9c998,  0xb0d09822,  0xc7d7a8b4,  0x59b33d17,  0x2eb40d81,
     71  1.1  cgd 	0xb7bd5c3b,  0xc0ba6cad,  0xedb88320,  0x9abfb3b6,  0x03b6e20c,
     72  1.1  cgd 	0x74b1d29a,  0xead54739,  0x9dd277af,  0x04db2615,  0x73dc1683,
     73  1.1  cgd 	0xe3630b12,  0x94643b84,  0x0d6d6a3e,  0x7a6a5aa8,  0xe40ecf0b,
     74  1.1  cgd 	0x9309ff9d,  0x0a00ae27,  0x7d079eb1,  0xf00f9344,  0x8708a3d2,
     75  1.1  cgd 	0x1e01f268,  0x6906c2fe,  0xf762575d,  0x806567cb,  0x196c3671,
     76  1.1  cgd 	0x6e6b06e7,  0xfed41b76,  0x89d32be0,  0x10da7a5a,  0x67dd4acc,
     77  1.1  cgd 	0xf9b9df6f,  0x8ebeeff9,  0x17b7be43,  0x60b08ed5,  0xd6d6a3e8,
     78  1.1  cgd 	0xa1d1937e,  0x38d8c2c4,  0x4fdff252,  0xd1bb67f1,  0xa6bc5767,
     79  1.1  cgd 	0x3fb506dd,  0x48b2364b,  0xd80d2bda,  0xaf0a1b4c,  0x36034af6,
     80  1.1  cgd 	0x41047a60,  0xdf60efc3,  0xa867df55,  0x316e8eef,  0x4669be79,
     81  1.1  cgd 	0xcb61b38c,  0xbc66831a,  0x256fd2a0,  0x5268e236,  0xcc0c7795,
     82  1.1  cgd 	0xbb0b4703,  0x220216b9,  0x5505262f,  0xc5ba3bbe,  0xb2bd0b28,
     83  1.1  cgd 	0x2bb45a92,  0x5cb36a04,  0xc2d7ffa7,  0xb5d0cf31,  0x2cd99e8b,
     84  1.1  cgd 	0x5bdeae1d,  0x9b64c2b0,  0xec63f226,  0x756aa39c,  0x026d930a,
     85  1.1  cgd 	0x9c0906a9,  0xeb0e363f,  0x72076785,  0x05005713,  0x95bf4a82,
     86  1.1  cgd 	0xe2b87a14,  0x7bb12bae,  0x0cb61b38,  0x92d28e9b,  0xe5d5be0d,
     87  1.1  cgd 	0x7cdcefb7,  0x0bdbdf21,  0x86d3d2d4,  0xf1d4e242,  0x68ddb3f8,
     88  1.1  cgd 	0x1fda836e,  0x81be16cd,  0xf6b9265b,  0x6fb077e1,  0x18b74777,
     89  1.1  cgd 	0x88085ae6,  0xff0f6a70,  0x66063bca,  0x11010b5c,  0x8f659eff,
     90  1.1  cgd 	0xf862ae69,  0x616bffd3,  0x166ccf45,  0xa00ae278,  0xd70dd2ee,
     91  1.1  cgd 	0x4e048354,  0x3903b3c2,  0xa7672661,  0xd06016f7,  0x4969474d,
     92  1.1  cgd 	0x3e6e77db,  0xaed16a4a,  0xd9d65adc,  0x40df0b66,  0x37d83bf0,
     93  1.1  cgd 	0xa9bcae53,  0xdebb9ec5,  0x47b2cf7f,  0x30b5ffe9,  0xbdbdf21c,
     94  1.1  cgd 	0xcabac28a,  0x53b39330,  0x24b4a3a6,  0xbad03605,  0xcdd70693,
     95  1.1  cgd 	0x54de5729,  0x23d967bf,  0xb3667a2e,  0xc4614ab8,  0x5d681b02,
     96  1.1  cgd 	0x2a6f2b94,  0xb40bbe37,  0xc30c8ea1,  0x5a05df1b,  0x2d02ef8d
     97  1.1  cgd };
     98  1.1  cgd 
     99  1.1  cgd /*
    100  1.1  cgd  * crc --
    101  1.1  cgd  *	Compute a POSIX.2 checksum.  This routine has been broken out since
    102  1.1  cgd  *	it is anticipated that other programs will use it.  It takes a file
    103  1.1  cgd  *	descriptor to read from and locations to store the crc and the number
    104  1.1  cgd  *	of bytes read.  It returns 0 on success and 1 on failure.  Errno is
    105  1.1  cgd  *	set on failure.
    106  1.1  cgd  */
    107  1.1  cgd crc(fd, cval, clen)
    108  1.1  cgd 	register int fd;
    109  1.1  cgd 	u_long *cval, *clen;
    110  1.1  cgd {
    111  1.1  cgd 	register int i, nr, step;
    112  1.1  cgd 	register u_char *p;
    113  1.1  cgd 	register u_long crc, total;
    114  1.1  cgd 	u_char buf[8192];
    115  1.1  cgd 
    116  1.1  cgd 	crc = step = total = 0;
    117  1.1  cgd 	while ((nr = read(fd, buf, sizeof(buf))) > 0)
    118  1.1  cgd 		for (total += nr, p = buf; nr--; ++p) {
    119  1.1  cgd 			if (!(i = crc >> 24 ^ *p)) {
    120  1.1  cgd 				i = step++;
    121  1.1  cgd 				if (step >= sizeof(crctab)/sizeof(crctab[0]))
    122  1.1  cgd 					step = 0;
    123  1.1  cgd 			}
    124  1.1  cgd 			crc = (crc << 8) ^ crctab[i];
    125  1.1  cgd 		}
    126  1.1  cgd 	if (nr < 0)
    127  1.1  cgd 		return(1);
    128  1.1  cgd 
    129  1.1  cgd 	*cval = crc & 0xffffffff;		/* Mask to 32 bits. */
    130  1.1  cgd 	*clen = total;
    131  1.1  cgd 	return(0);
    132  1.1  cgd }
    133