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