1 /*- 2 * Copyright (c) 1991 The Regents of the University of California. 3 * All rights reserved. 4 * 5 * %sccs.include.redist.c% 6 */ 7 8 #ifndef lint 9 static char sccsid[] = "@(#)sum2.c 5.1 (Berkeley) 04/04/91"; 10 #endif /* not lint */ 11 12 #include <sys/types.h> 13 #include <unistd.h> 14 15 csum2(fd, cval, clen) 16 register int fd; 17 u_long *cval, *clen; 18 { 19 register u_long crc, total; 20 register int nr; 21 register u_char *p; 22 u_char buf[8192]; 23 24 /* 25 * Draft 8 POSIX 1003.2: 26 * 27 * s = sum of all bytes 28 * r = s % 2^16 + (s % 2^32) / 2^16 29 * crc = (r % 2^16) + r / 2^16 30 */ 31 crc = total = 0; 32 while ((nr = read(fd, buf, sizeof(buf))) > 0) 33 for (total += nr, p = buf; nr--; ++p) 34 crc += *p; 35 if (nr < 0) 36 return(1); 37 38 crc = (crc & 0xffff) + (crc >> 16); 39 crc = (crc & 0xffff) + (crc >> 16); 40 41 *cval = crc; 42 *clen = total; 43 return(0); 44 } 45