1 /* $OpenBSD: cmp.c,v 1.18 2018/03/05 16:57:37 cheloha Exp $ */
2 /* $NetBSD: cmp.c,v 1.7 1995/09/08 03:22:56 tls Exp $ */
5 * Copyright (c) 1987, 1990, 1993, 1994
6 * The Regents of the University of California. All rights reserved.
8 * Redistribution and use in source and binary forms, with or without
9 * modification, are permitted provided that the following conditions
11 * 1. Redistributions of source code must retain the above copyright
12 * notice, this list of conditions and the following disclaimer.
13 * 2. Redistributions in binary form must reproduce the above copyright
14 * notice, this list of conditions and the following disclaimer in the
15 * documentation and/or other materials provided with the distribution.
16 * 3. Neither the name of the University nor the names of its contributors
17 * may be used to endorse or promote products derived from this software
18 * without specific prior written permission.
20 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
21 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
24 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
25 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
26 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
27 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
28 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
29 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
33 #include <sys/types.h>
49 static off_t
get_skip(const char *, const char *);
50 static void __dead
usage(void);
53 main(int argc
, char *argv
[])
57 int ch
, fd1
, fd2
, special
;
60 if (pledge("stdio rpath", NULL
) == -1)
61 err(ERR_EXIT
, "pledge");
63 while ((ch
= getopt(argc
, argv
, "ls")) != -1)
65 case 'l': /* print all differences */
68 case 's': /* silent run */
79 errx(ERR_EXIT
, "only one of -l and -s may be specified");
81 if (argc
< 2 || argc
> 4)
84 /* Backward compatibility -- handle "-" meaning stdin. */
86 if (strcmp(file1
= argv
[0], "-") == 0) {
90 } else if ((fd1
= open(file1
, O_RDONLY
, 0)) == -1)
92 if (strcmp(file2
= argv
[1], "-") == 0) {
94 fatalx("standard input may only be specified once");
98 } else if ((fd2
= open(file2
, O_RDONLY
, 0)) == -1)
101 if (pledge("stdio", NULL
) == -1)
102 err(ERR_EXIT
, "pledge");
104 skip1
= (argc
> 2) ? get_skip(argv
[2], "skip1") : 0;
105 skip2
= (argc
== 4) ? get_skip(argv
[3], "skip2") : 0;
108 if (fstat(fd1
, &sb1
) == -1)
110 if (!S_ISREG(sb1
.st_mode
))
113 if (fstat(fd2
, &sb2
) == -1)
115 if (!S_ISREG(sb2
.st_mode
))
121 c_special(fd1
, file1
, skip1
, fd2
, file2
, skip2
);
123 c_regular(fd1
, file1
, skip1
, sb1
.st_size
,
124 fd2
, file2
, skip2
, sb2
.st_size
);
129 get_skip(const char *arg
, const char *name
)
135 skip
= strtoll(arg
, &ep
, 0);
136 if (arg
[0] == '\0' || *ep
!= '\0')
137 fatalx("%s is invalid: %s", name
, arg
);
139 fatalx("%s is too small: %s", name
, arg
);
140 if (skip
== LLONG_MAX
&& errno
== ERANGE
)
141 fatalx("%s is too large: %s", name
, arg
);
149 (void)fprintf(stderr
,
150 "usage: cmp [-l | -s] file1 file2 [skip1 [skip2]]\n");