147798Sbostic /*-
2*61940Sbostic * Copyright (c) 1991, 1993
3*61940Sbostic * The Regents of the University of California. All rights reserved.
447798Sbostic *
547798Sbostic * %sccs.include.redist.c%
647798Sbostic */
747798Sbostic
847798Sbostic #ifndef lint
9*61940Sbostic static char sccsid[] = "@(#)sum2.c 8.1 (Berkeley) 06/06/93";
1047798Sbostic #endif /* not lint */
1147798Sbostic
1247798Sbostic #include <sys/types.h>
1347798Sbostic #include <unistd.h>
1447798Sbostic
1551818Sbostic int
csum2(fd,cval,clen)1647798Sbostic csum2(fd, cval, clen)
1747798Sbostic register int fd;
1847798Sbostic u_long *cval, *clen;
1947798Sbostic {
2047798Sbostic register u_long crc, total;
2147798Sbostic register int nr;
2247798Sbostic register u_char *p;
2347798Sbostic u_char buf[8192];
2447798Sbostic
2547798Sbostic /*
2647798Sbostic * Draft 8 POSIX 1003.2:
2747798Sbostic *
2847798Sbostic * s = sum of all bytes
2947798Sbostic * r = s % 2^16 + (s % 2^32) / 2^16
3047798Sbostic * crc = (r % 2^16) + r / 2^16
3147798Sbostic */
3247798Sbostic crc = total = 0;
3347798Sbostic while ((nr = read(fd, buf, sizeof(buf))) > 0)
3447798Sbostic for (total += nr, p = buf; nr--; ++p)
3547798Sbostic crc += *p;
3647798Sbostic if (nr < 0)
3747798Sbostic return(1);
3847798Sbostic
3947798Sbostic crc = (crc & 0xffff) + (crc >> 16);
4047798Sbostic crc = (crc & 0xffff) + (crc >> 16);
4147798Sbostic
4247798Sbostic *cval = crc;
4347798Sbostic *clen = total;
4447798Sbostic return(0);
4547798Sbostic }
46