cksum.c

Go to the documentation of this file.
00001 /* cksum.c - Display file checksums and block counts    Author: V. Archer */
00002 
00003 /* Copyright 1991 by Vincent Archer
00004  *      You may freely redistribute this software, in source or binary
00005  *      form, provided that you do not alter this copyright mention in any
00006  *      way.
00007  */
00008 
00009 #include <sys/types.h>
00010 #include <fcntl.h>
00011 #include <unistd.h>
00012 #include <stdio.h>
00013 
00014 int error;
00015 
00016 /* Table from P1003.2 (4.9/Fig 4.1). In fact, this table was taken from zmodem
00017  * and rewritten to look like the Draft 11 example.
00018  */
00019 unsigned long crctab[] = {
00020                   0x7fffffff,
00021          0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, 0x706af48f,
00022          0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4, 0xe0d5e91e,
00023          0x97d2d988, 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91,
00024          0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de, 0x1adad47d,
00025          0x6ddde4eb, 0xf4d4b551, 0x83d385c7, 0x136c9856, 0x646ba8c0,
00026          0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9, 0xfa0f3d63,
00027          0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172,
00028          0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b, 0x35b5a8fa,
00029          0x42b2986c, 0xdbbbc9d6, 0xacbcf940, 0x32d86ce3, 0x45df5c75,
00030          0xdcd60dcf, 0xabd13d59, 0x26d930ac, 0x51de003a, 0xc8d75180,
00031          0xbfd06116, 0x21b4f4b5, 0x56b3c423, 0xcfba9599, 0xb8bda50f,
00032          0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924, 0x2f6f7c87,
00033          0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190, 0x01db7106,
00034          0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f, 0x9fbfe4a5,
00035          0xe8b8d433, 0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818,
00036          0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01, 0x6b6b51f4,
00037          0x1c6c6162, 0x856530d8, 0xf262004e, 0x6c0695ed, 0x1b01a57b,
00038          0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950, 0x8bbeb8ea,
00039          0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65,
00040          0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, 0x4adfa541,
00041          0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a, 0x346ed9fc,
00042          0xad678846, 0xda60b8d0, 0x44042d73, 0x33031de5, 0xaa0a4c5f,
00043          0xdd0d7cc9, 0x5005713c, 0x270241aa, 0xbe0b1010, 0xc90c2086,
00044          0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f, 0x5edef90e,
00045          0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17, 0x2eb40d81,
00046          0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6, 0x03b6e20c,
00047          0x74b1d29a, 0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683,
00048          0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8, 0xe40ecf0b,
00049          0x9309ff9d, 0x0a00ae27, 0x7d079eb1, 0xf00f9344, 0x8708a3d2,
00050          0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb, 0x196c3671,
00051          0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc,
00052          0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5, 0xd6d6a3e8,
00053          0xa1d1937e, 0x38d8c2c4, 0x4fdff252, 0xd1bb67f1, 0xa6bc5767,
00054          0x3fb506dd, 0x48b2364b, 0xd80d2bda, 0xaf0a1b4c, 0x36034af6,
00055          0x41047a60, 0xdf60efc3, 0xa867df55, 0x316e8eef, 0x4669be79,
00056          0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236, 0xcc0c7795,
00057          0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe, 0xb2bd0b28,
00058          0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b,
00059          0x5bdeae1d, 0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a,
00060          0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713, 0x95bf4a82,
00061          0xe2b87a14, 0x7bb12bae, 0x0cb61b38, 0x92d28e9b, 0xe5d5be0d,
00062          0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242, 0x68ddb3f8,
00063          0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777,
00064          0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, 0x8f659eff,
00065          0xf862ae69, 0x616bffd3, 0x166ccf45, 0xa00ae278, 0xd70dd2ee,
00066          0x4e048354, 0x3903b3c2, 0xa7672661, 0xd06016f7, 0x4969474d,
00067          0x3e6e77db, 0xaed16a4a, 0xd9d65adc, 0x40df0b66, 0x37d83bf0,
00068          0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9, 0xbdbdf21c,
00069          0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605, 0xcdd70693,
00070          0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8, 0x5d681b02,
00071           0x2a6f2b94, 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d
00072 };
00073 
00074 _PROTOTYPE(int main, (int argc, char **argv));
00075 _PROTOTYPE(void crc, (int fd, char *name));
00076 _PROTOTYPE(unsigned long strncrc, (unsigned char *b, int n, unsigned long s));
00077 
00078 static int aux;
00079 
00080 /* Routine straight out of 4.9.10 */
00081 unsigned long strncrc(b, n, s)
00082 register unsigned char *b;      /* byte sequence to checksum */
00083 register int n;                 /* length of sequence */
00084 register unsigned long s;       /* initial checksum value */
00085 {
00086   register int i;
00087 
00088   while (n-- > 0) {
00089         /* Compute the index to the crc table */
00090         i = (s >> 24) ^ ((unsigned int) (*b++));
00091 
00092         if (i == 0) {
00093                 /* Replace an intermediate zero with the next value
00094                  * from the sequence */
00095                 i = aux++;
00096                 if (aux >= sizeof(crctab) / sizeof(crctab[0])) aux = 0;
00097         }
00098 
00099         /* New checksum value */
00100         s = (s << 8) ^ crctab[i];
00101   }
00102   return(s);
00103 }
00104 
00105 /* Main module. No options switches allowed, none parsed. */
00106 int main(argc, argv)
00107 int argc;
00108 char *argv[];
00109 {
00110   argc--;
00111   error = 0;
00112   if (!argc)
00113         crc(0, (char *) 0);
00114   else
00115         for (argv++; argc--; argv++) crc(open(*argv, O_RDONLY), *argv);
00116   return(error);
00117 }
00118 
00119 /* Compute crc and size of input file descriptor. */
00120 void crc(fd, name)
00121 int fd;
00122 char *name;
00123 {
00124   off_t f_size;
00125   unsigned long crc;
00126   int nb;
00127   unsigned char buffer[1024];
00128 
00129   if (fd < 0) {
00130         perror(name);
00131         error = 1;
00132         return;
00133   }
00134   crc = 0;
00135   f_size = 0;
00136   aux = 0;
00137   for (;;) {
00138         nb = read(fd, (char *) buffer, sizeof(buffer));
00139         if (nb < 0) {
00140                 close(fd);
00141                 perror(name ? name : "stdin");
00142                 error = 1;
00143                 return;
00144         }
00145         if (!nb) break;
00146         f_size += nb;
00147         crc = strncrc(buffer, nb, crc);
00148   }
00149   close(fd);
00150   printf("%lu %ld", crc, f_size);
00151   if (name)
00152         printf(" %s\n", name);
00153   else
00154         putchar('\n');
00155 }

Generated on Fri Apr 14 22:57:04 2006 for minix by  doxygen 1.4.6