don't let users create their own symbol table for the running kernel
[unix-history] / usr / src / usr.bin / cksum / crc.c
CommitLineData
df8e608f
KB
1/*-
2 * Copyright (c) 1991 The Regents of the University of California.
3 * All rights reserved.
4 *
5 * This code is derived from software contributed to Berkeley by
d943c816 6 * James W. Williams of NASA Goddard Space Flight Center.
df8e608f
KB
7 *
8 * %sccs.include.redist.c%
9 */
10
11#ifndef lint
8d2f77a4 12static char sccsid[] = "@(#)crc.c 5.5 (Berkeley) %G%";
df8e608f
KB
13#endif /* not lint */
14
15#include <sys/types.h>
16#include <unistd.h>
17
040b0e93
KB
18static u_long crctab[] = {
19 0x0,
df8e608f
KB
20 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, 0x706af48f,
21 0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4, 0xe0d5e91e,
22 0x97d2d988, 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91,
23 0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de, 0x1adad47d,
24 0x6ddde4eb, 0xf4d4b551, 0x83d385c7, 0x136c9856, 0x646ba8c0,
25 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9, 0xfa0f3d63,
26 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172,
27 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b, 0x35b5a8fa,
28 0x42b2986c, 0xdbbbc9d6, 0xacbcf940, 0x32d86ce3, 0x45df5c75,
29 0xdcd60dcf, 0xabd13d59, 0x26d930ac, 0x51de003a, 0xc8d75180,
30 0xbfd06116, 0x21b4f4b5, 0x56b3c423, 0xcfba9599, 0xb8bda50f,
31 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924, 0x2f6f7c87,
32 0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190, 0x01db7106,
33 0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f, 0x9fbfe4a5,
34 0xe8b8d433, 0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818,
35 0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01, 0x6b6b51f4,
36 0x1c6c6162, 0x856530d8, 0xf262004e, 0x6c0695ed, 0x1b01a57b,
37 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950, 0x8bbeb8ea,
38 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65,
39 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, 0x4adfa541,
40 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a, 0x346ed9fc,
41 0xad678846, 0xda60b8d0, 0x44042d73, 0x33031de5, 0xaa0a4c5f,
42 0xdd0d7cc9, 0x5005713c, 0x270241aa, 0xbe0b1010, 0xc90c2086,
43 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f, 0x5edef90e,
44 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17, 0x2eb40d81,
45 0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6, 0x03b6e20c,
46 0x74b1d29a, 0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683,
47 0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8, 0xe40ecf0b,
48 0x9309ff9d, 0x0a00ae27, 0x7d079eb1, 0xf00f9344, 0x8708a3d2,
49 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb, 0x196c3671,
50 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc,
51 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5, 0xd6d6a3e8,
52 0xa1d1937e, 0x38d8c2c4, 0x4fdff252, 0xd1bb67f1, 0xa6bc5767,
53 0x3fb506dd, 0x48b2364b, 0xd80d2bda, 0xaf0a1b4c, 0x36034af6,
54 0x41047a60, 0xdf60efc3, 0xa867df55, 0x316e8eef, 0x4669be79,
55 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236, 0xcc0c7795,
56 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe, 0xb2bd0b28,
57 0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b,
58 0x5bdeae1d, 0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a,
59 0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713, 0x95bf4a82,
60 0xe2b87a14, 0x7bb12bae, 0x0cb61b38, 0x92d28e9b, 0xe5d5be0d,
61 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242, 0x68ddb3f8,
62 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777,
63 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, 0x8f659eff,
64 0xf862ae69, 0x616bffd3, 0x166ccf45, 0xa00ae278, 0xd70dd2ee,
65 0x4e048354, 0x3903b3c2, 0xa7672661, 0xd06016f7, 0x4969474d,
66 0x3e6e77db, 0xaed16a4a, 0xd9d65adc, 0x40df0b66, 0x37d83bf0,
67 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9, 0xbdbdf21c,
68 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605, 0xcdd70693,
69 0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8, 0x5d681b02,
70 0x2a6f2b94, 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d
71};
72
73/*
8d2f77a4
KB
74 * Compute a POSIX 1003.2 checksum. This routine has been broken out so that
75 * other programs can use it. It takes a file descriptor to read from and
76 * locations to store the crc and the number of bytes read. It returns 0 on
77 * success and 1 on failure. Errno is set on failure.
df8e608f 78 */
8d2f77a4
KB
79u_long crc_total = ~0; /* The crc over a number of files. */
80
040b0e93 81int
df8e608f
KB
82crc(fd, cval, clen)
83 register int fd;
84 u_long *cval, *clen;
85{
df8e608f 86 register u_char *p;
040b0e93
KB
87 register int nr;
88 register u_long crc, len;
89 u_char buf[16 * 1024];
df8e608f 90
8d2f77a4
KB
91#define COMPUTE(var, ch) (var) = (var) << 8 ^ crctab[(var) >> 24 ^ (ch)]
92
040b0e93 93 crc = len = 0;
8d2f77a4 94 crc_total = ~crc_total;
df8e608f 95 while ((nr = read(fd, buf, sizeof(buf))) > 0)
8d2f77a4
KB
96 for (len += nr, p = buf; nr--; ++p) {
97 COMPUTE(crc, *p);
98 COMPUTE(crc_total, *p);
99 }
df8e608f 100 if (nr < 0)
8d2f77a4 101 return (1);
df8e608f 102
040b0e93
KB
103 *clen = len;
104
105 /* Include the length of the file. */
8d2f77a4
KB
106 for (; len != 0; len >>= 8) {
107 COMPUTE(crc, len & 0xff);
108 COMPUTE(crc_total, len & 0xff);
109 }
040b0e93
KB
110
111 *cval = ~crc;
8d2f77a4
KB
112 crc_total = ~crc_total;
113 return (0);
df8e608f 114}