cksum.c revision 34447
1249746Sdteske/*-
2252980Sdteske * Copyright (c) 1991, 1993
3238438Sdteske *	The Regents of the University of California.  All rights reserved.
4238438Sdteske *
5238438Sdteske * This code is derived from software contributed to Berkeley by
6238438Sdteske * James W. Williams of NASA Goddard Space Flight Center.
7238438Sdteske *
8238438Sdteske * Redistribution and use in source and binary forms, with or without
9238438Sdteske * modification, are permitted provided that the following conditions
10238438Sdteske * are met:
11238438Sdteske * 1. Redistributions of source code must retain the above copyright
12238438Sdteske *    notice, this list of conditions and the following disclaimer.
13238438Sdteske * 2. Redistributions in binary form must reproduce the above copyright
14252987Sdteske *    notice, this list of conditions and the following disclaimer in the
15238438Sdteske *    documentation and/or other materials provided with the distribution.
16238438Sdteske * 3. All advertising materials mentioning features or use of this software
17238438Sdteske *    must display the following acknowledgement:
18252987Sdteske *	This product includes software developed by the University of
19238438Sdteske *	California, Berkeley and its contributors.
20238438Sdteske * 4. Neither the name of the University nor the names of its contributors
21238438Sdteske *    may be used to endorse or promote products derived from this software
22238438Sdteske *    without specific prior written permission.
23238438Sdteske *
24238438Sdteske * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
25238438Sdteske * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
26238438Sdteske * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
27238438Sdteske * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
28238438Sdteske * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
29238438Sdteske * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
30249746Sdteske * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
31249746Sdteske * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
32249746Sdteske * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
33249746Sdteske * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
34249746Sdteske * SUCH DAMAGE.
35238438Sdteske */
36238438Sdteske
37238438Sdteske#ifndef lint
38static const char copyright[] =
39"@(#) Copyright (c) 1991, 1993\n\
40	The Regents of the University of California.  All rights reserved.\n";
41#endif /* not lint */
42
43#ifndef lint
44#if 0
45static char sccsid[] = "@(#)cksum.c	8.2 (Berkeley) 4/28/95";
46#endif
47static const char rcsid[] =
48	"$Id: cksum.c,v 1.8 1997/11/09 05:47:55 obrien Exp $";
49#endif /* not lint */
50
51#include <sys/cdefs.h>
52#include <sys/types.h>
53
54#include <err.h>
55#include <errno.h>
56#include <fcntl.h>
57#include <stdio.h>
58#include <stdlib.h>
59#include <string.h>
60#include <unistd.h>
61
62#include "extern.h"
63
64static void usage __P((void));
65
66int
67main(argc, argv)
68	int argc;
69	char **argv;
70{
71	register int ch, fd, rval;
72	u_int32_t len, val;
73	char *fn, *p;
74	int (*cfncn) __P((int, u_int32_t *, u_int32_t *));
75	void (*pfncn) __P((char *, u_int32_t, u_int32_t));
76
77	if ((p = rindex(argv[0], '/')) == NULL)
78		p = argv[0];
79	else
80		++p;
81	if (!strcmp(p, "sum")) {
82		cfncn = csum1;
83		pfncn = psum1;
84		++argv;
85	} else {
86		cfncn = crc;
87		pfncn = pcrc;
88
89		while ((ch = getopt(argc, argv, "o:")) != -1)
90			switch (ch) {
91			case 'o':
92				if (!strcmp(optarg, "1")) {
93					cfncn = csum1;
94					pfncn = psum1;
95				} else if (!strcmp(optarg, "2")) {
96					cfncn = csum2;
97					pfncn = psum2;
98				} else if (*optarg == '3') {
99					cfncn = crc32;
100					pfncn = pcrc;
101				} else {
102					warnx("illegal argument to -o option");
103					usage();
104				}
105				break;
106			case '?':
107			default:
108				usage();
109			}
110		argc -= optind;
111		argv += optind;
112	}
113
114	fd = STDIN_FILENO;
115	fn = NULL;
116	rval = 0;
117	do {
118		if (*argv) {
119			fn = *argv++;
120			if ((fd = open(fn, O_RDONLY, 0)) < 0) {
121				warn("%s", fn);
122				rval = 1;
123				continue;
124			}
125		}
126		if (cfncn(fd, &val, &len)) {
127			warn("%s", fn ? fn : "stdin");
128			rval = 1;
129		} else
130			pfncn(fn, val, len);
131		(void)close(fd);
132	} while (*argv);
133	exit(rval);
134}
135
136static void
137usage()
138{
139	(void)fprintf(stderr, "usage: cksum [-o 1 | 2] [file ...]\n");
140	(void)fprintf(stderr, "       sum [file ...]\n");
141	exit(1);
142}
143