147720Sbostic /*- 247720Sbostic * Copyright (c) 1991 The Regents of the University of California. 347720Sbostic * All rights reserved. 447720Sbostic * 547720Sbostic * This code is derived from software contributed to Berkeley by 651066Sbostic * James W. Williams of NASA Goddard Space Flight Center. 747720Sbostic * 847720Sbostic * %sccs.include.redist.c% 947720Sbostic */ 1047720Sbostic 1147720Sbostic #ifndef lint 12*51883Sbostic static char sccsid[] = "@(#)crc.c 5.5 (Berkeley) 12/11/91"; 1347720Sbostic #endif /* not lint */ 1447720Sbostic 1547720Sbostic #include <sys/types.h> 1647720Sbostic #include <unistd.h> 1747720Sbostic 1851821Sbostic static u_long crctab[] = { 1951821Sbostic 0x0, 2047720Sbostic 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, 0x706af48f, 2147720Sbostic 0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 2247720Sbostic 0x97d2d988, 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91, 2347720Sbostic 0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de, 0x1adad47d, 2447720Sbostic 0x6ddde4eb, 0xf4d4b551, 0x83d385c7, 0x136c9856, 0x646ba8c0, 2547720Sbostic 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9, 0xfa0f3d63, 2647720Sbostic 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172, 2747720Sbostic 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b, 0x35b5a8fa, 2847720Sbostic 0x42b2986c, 0xdbbbc9d6, 0xacbcf940, 0x32d86ce3, 0x45df5c75, 2947720Sbostic 0xdcd60dcf, 0xabd13d59, 0x26d930ac, 0x51de003a, 0xc8d75180, 3047720Sbostic 0xbfd06116, 0x21b4f4b5, 0x56b3c423, 0xcfba9599, 0xb8bda50f, 3147720Sbostic 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924, 0x2f6f7c87, 3247720Sbostic 0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190, 0x01db7106, 3347720Sbostic 0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 3447720Sbostic 0xe8b8d433, 0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818, 3547720Sbostic 0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01, 0x6b6b51f4, 3647720Sbostic 0x1c6c6162, 0x856530d8, 0xf262004e, 0x6c0695ed, 0x1b01a57b, 3747720Sbostic 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950, 0x8bbeb8ea, 3847720Sbostic 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65, 3947720Sbostic 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, 0x4adfa541, 4047720Sbostic 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a, 0x346ed9fc, 4147720Sbostic 0xad678846, 0xda60b8d0, 0x44042d73, 0x33031de5, 0xaa0a4c5f, 4247720Sbostic 0xdd0d7cc9, 0x5005713c, 0x270241aa, 0xbe0b1010, 0xc90c2086, 4347720Sbostic 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f, 0x5edef90e, 4447720Sbostic 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17, 0x2eb40d81, 4547720Sbostic 0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6, 0x03b6e20c, 4647720Sbostic 0x74b1d29a, 0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683, 4747720Sbostic 0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8, 0xe40ecf0b, 4847720Sbostic 0x9309ff9d, 0x0a00ae27, 0x7d079eb1, 0xf00f9344, 0x8708a3d2, 4947720Sbostic 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb, 0x196c3671, 5047720Sbostic 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc, 5147720Sbostic 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5, 0xd6d6a3e8, 5247720Sbostic 0xa1d1937e, 0x38d8c2c4, 0x4fdff252, 0xd1bb67f1, 0xa6bc5767, 5347720Sbostic 0x3fb506dd, 0x48b2364b, 0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 5447720Sbostic 0x41047a60, 0xdf60efc3, 0xa867df55, 0x316e8eef, 0x4669be79, 5547720Sbostic 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236, 0xcc0c7795, 5647720Sbostic 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe, 0xb2bd0b28, 5747720Sbostic 0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 5847720Sbostic 0x5bdeae1d, 0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a, 5947720Sbostic 0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713, 0x95bf4a82, 6047720Sbostic 0xe2b87a14, 0x7bb12bae, 0x0cb61b38, 0x92d28e9b, 0xe5d5be0d, 6147720Sbostic 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242, 0x68ddb3f8, 6247720Sbostic 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777, 6347720Sbostic 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, 0x8f659eff, 6447720Sbostic 0xf862ae69, 0x616bffd3, 0x166ccf45, 0xa00ae278, 0xd70dd2ee, 6547720Sbostic 0x4e048354, 0x3903b3c2, 0xa7672661, 0xd06016f7, 0x4969474d, 6647720Sbostic 0x3e6e77db, 0xaed16a4a, 0xd9d65adc, 0x40df0b66, 0x37d83bf0, 6747720Sbostic 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9, 0xbdbdf21c, 6847720Sbostic 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605, 0xcdd70693, 6947720Sbostic 0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8, 0x5d681b02, 7047720Sbostic 0x2a6f2b94, 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d 7147720Sbostic }; 7247720Sbostic 7347720Sbostic /* 74*51883Sbostic * Compute a POSIX 1003.2 checksum. This routine has been broken out so that 75*51883Sbostic * other programs can use it. It takes a file descriptor to read from and 76*51883Sbostic * locations to store the crc and the number of bytes read. It returns 0 on 77*51883Sbostic * success and 1 on failure. Errno is set on failure. 7847720Sbostic */ 79*51883Sbostic u_long crc_total = ~0; /* The crc over a number of files. */ 80*51883Sbostic 8151821Sbostic int 8247720Sbostic crc(fd, cval, clen) 8347720Sbostic register int fd; 8447720Sbostic u_long *cval, *clen; 8547720Sbostic { 8647720Sbostic register u_char *p; 8751821Sbostic register int nr; 8851821Sbostic register u_long crc, len; 8951821Sbostic u_char buf[16 * 1024]; 9047720Sbostic 91*51883Sbostic #define COMPUTE(var, ch) (var) = (var) << 8 ^ crctab[(var) >> 24 ^ (ch)] 92*51883Sbostic 9351821Sbostic crc = len = 0; 94*51883Sbostic crc_total = ~crc_total; 9547720Sbostic while ((nr = read(fd, buf, sizeof(buf))) > 0) 96*51883Sbostic for (len += nr, p = buf; nr--; ++p) { 97*51883Sbostic COMPUTE(crc, *p); 98*51883Sbostic COMPUTE(crc_total, *p); 99*51883Sbostic } 10047720Sbostic if (nr < 0) 101*51883Sbostic return (1); 10247720Sbostic 10351821Sbostic *clen = len; 10451821Sbostic 10551821Sbostic /* Include the length of the file. */ 106*51883Sbostic for (; len != 0; len >>= 8) { 107*51883Sbostic COMPUTE(crc, len & 0xff); 108*51883Sbostic COMPUTE(crc_total, len & 0xff); 109*51883Sbostic } 11051821Sbostic 11151821Sbostic *cval = ~crc; 112*51883Sbostic crc_total = ~crc_total; 113*51883Sbostic return (0); 11447720Sbostic } 115