/* POSIX crc32/adler32 checksum program; requires zlib (a.k.a. libz) * Compile: cc -o zsum32 zsum32.c -lz */ #include #include #include #include #define BUFSIZE (8192*4) int main(int argc, char **argv) { int estat = 0, erri = 0; FILE *f; uLong adler, crc; const char *errs = NULL; auto char buffer[BUFSIZE]; if (argc != 2) { erri = EINVAL; errs = "Usage zsum32 FILE"; goto jerror_noc; } ++argv; f = fopen(*argv, "rb"); if (f == NULL) { erri = errno; errs = "fopen()ing the file failed"; goto jerror_noc; } adler = adler32(0L, Z_NULL, 0); crc = 0; for (;;) { size_t rb = fread(buffer, 1, BUFSIZE, f); if (rb > 0) { adler = adler32(adler, (const Bytef*)buffer, (uInt)rb); crc = crc32(crc, (const Bytef*)buffer, (uInt)rb); continue; } if (feof(f)) break; erri = errno; errs = "fread()ing the file failed"; goto jerror; } printf("Adler-32 <%lx> CRC-32 <%lx> -- %s\n", (unsigned long)adler, (unsigned long)crc, *argv); (void)fclose(f); jleave: return estat; jerror: (void)fclose(f); jerror_noc: fprintf(stderr, "%s: %s\n", errs, strerror(erri)); estat = 1; goto jleave; }