1/*-
2 * SPDX-License-Identifier: BSD-3-Clause
3 *
4 * Copyright (c) 1991, 1993
5 *	The Regents of the University of California.  All rights reserved.
6 *
7 * This code is derived from software contributed to Berkeley by
8 * James W. Williams of NASA Goddard Space Flight Center.
9 *
10 * Redistribution and use in source and binary forms, with or without
11 * modification, are permitted provided that the following conditions
12 * are met:
13 * 1. Redistributions of source code must retain the above copyright
14 *    notice, this list of conditions and the following disclaimer.
15 * 2. Redistributions in binary form must reproduce the above copyright
16 *    notice, this list of conditions and the following disclaimer in the
17 *    documentation and/or other materials provided with the distribution.
18 * 3. Neither the name of the University nor the names of its contributors
19 *    may be used to endorse or promote products derived from this software
20 *    without specific prior written permission.
21 *
22 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
23 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
24 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
25 * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
26 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
27 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
28 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
29 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
30 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
31 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
32 * SUCH DAMAGE.
33 */
34
35#ifndef lint
36static const char copyright[] =
37"@(#) Copyright (c) 1991, 1993\n\
38	The Regents of the University of California.  All rights reserved.\n";
39#endif /* not lint */
40
41#ifndef lint
42#if 0
43static char sccsid[] = "@(#)cksum.c	8.2 (Berkeley) 4/28/95";
44#endif
45#endif /* not lint */
46
47#include <sys/cdefs.h>
48__FBSDID("$FreeBSD$");
49
50#include <sys/types.h>
51
52#include <err.h>
53#include <fcntl.h>
54#include <stdio.h>
55#include <stdlib.h>
56#include <string.h>
57#include <unistd.h>
58
59#include "extern.h"
60
61static void usage(void);
62
63int
64main(int argc, char **argv)
65{
66	uint32_t val;
67	int ch, fd, rval;
68	off_t len;
69	char *fn, *p;
70	int (*cfncn)(int, uint32_t *, off_t *);
71	void (*pfncn)(char *, uint32_t, off_t);
72
73	if ((p = strrchr(argv[0], '/')) == NULL)
74		p = argv[0];
75	else
76		++p;
77	if (!strcmp(p, "sum")) {
78		cfncn = csum1;
79		pfncn = psum1;
80		++argv;
81	} else {
82		cfncn = crc;
83		pfncn = pcrc;
84
85		while ((ch = getopt(argc, argv, "o:")) != -1)
86			switch (ch) {
87			case 'o':
88				if (!strcmp(optarg, "1")) {
89					cfncn = csum1;
90					pfncn = psum1;
91				} else if (!strcmp(optarg, "2")) {
92					cfncn = csum2;
93					pfncn = psum2;
94				} else if (!strcmp(optarg, "3")) {
95					cfncn = crc32;
96					pfncn = pcrc;
97				} else {
98					warnx("illegal argument to -o option");
99					usage();
100				}
101				break;
102			case '?':
103			default:
104				usage();
105			}
106		argc -= optind;
107		argv += optind;
108	}
109
110	fd = STDIN_FILENO;
111	fn = NULL;
112	rval = 0;
113	do {
114		if (*argv) {
115			fn = *argv++;
116			if ((fd = open(fn, O_RDONLY, 0)) < 0) {
117				warn("%s", fn);
118				rval = 1;
119				continue;
120			}
121		}
122		if (cfncn(fd, &val, &len)) {
123			warn("%s", fn ? fn : "stdin");
124			rval = 1;
125		} else
126			pfncn(fn, val, len);
127		(void)close(fd);
128	} while (*argv);
129	exit(rval);
130}
131
132static void
133usage(void)
134{
135	(void)fprintf(stderr, "usage: cksum [-o 1 | 2 | 3] [file ...]\n");
136	(void)fprintf(stderr, "       sum [file ...]\n");
137	exit(1);
138}
139