Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/freebsd-src
Path: blob/main/usr.bin/cmp/link.c
34677 views
1
/*-
2
* SPDX-License-Identifier: BSD-2-Clause
3
*
4
* Copyright (c) 2005 Brian Somers <[email protected]>
5
* All rights reserved.
6
*
7
* Redistribution and use in source and binary forms, with or without
8
* modification, are permitted provided that the following conditions
9
* are met:
10
* 1. Redistributions of source code must retain the above copyright
11
* notice, this list of conditions and the following disclaimer.
12
* 2. Redistributions in binary form must reproduce the above copyright
13
* notice, this list of conditions and the following disclaimer in the
14
* documentation and/or other materials provided with the distribution.
15
*
16
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
17
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
20
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
22
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
23
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
24
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26
* SUCH DAMAGE.
27
*/
28
29
#include <sys/types.h>
30
31
#include <err.h>
32
#include <limits.h>
33
#include <stdbool.h>
34
#include <stdio.h>
35
#include <stdlib.h>
36
#include <unistd.h>
37
38
#include "extern.h"
39
40
int
41
c_link(const char *file1, off_t skip1, const char *file2, off_t skip2,
42
off_t limit)
43
{
44
char buf1[PATH_MAX], *p1;
45
char buf2[PATH_MAX], *p2;
46
ssize_t len1, len2;
47
int dfound;
48
off_t byte;
49
u_char ch;
50
51
if ((len1 = readlink(file1, buf1, sizeof(buf1) - 1)) < 0) {
52
if (!sflag)
53
err(ERR_EXIT, "%s", file1);
54
else
55
exit(ERR_EXIT);
56
}
57
58
if ((len2 = readlink(file2, buf2, sizeof(buf2) - 1)) < 0) {
59
if (!sflag)
60
err(ERR_EXIT, "%s", file2);
61
else
62
exit(ERR_EXIT);
63
}
64
65
if (skip1 > len1)
66
skip1 = len1;
67
buf1[len1] = '\0';
68
69
if (skip2 > len2)
70
skip2 = len2;
71
buf2[len2] = '\0';
72
73
dfound = 0;
74
byte = 1;
75
for (p1 = buf1 + skip1, p2 = buf2 + skip2;
76
*p1 && *p2 && (limit == 0 || byte <= limit); p1++, p2++) {
77
if ((ch = *p1) != *p2) {
78
if (xflag) {
79
dfound = 1;
80
(void)printf("%08llx %02x %02x\n",
81
(long long)byte - 1, ch, *p2);
82
} else if (lflag) {
83
dfound = 1;
84
if (bflag)
85
(void)printf("%6lld %3o %c %3o %c\n",
86
(long long)byte, ch, ch, *p2, *p2);
87
else
88
(void)printf("%6lld %3o %3o\n",
89
(long long)byte, ch, *p2);
90
} else {
91
diffmsg(file1, file2, byte, 1, ch, *p2);
92
return (DIFF_EXIT);
93
}
94
}
95
byte++;
96
}
97
98
if (*p1 || *p2) {
99
eofmsg (*p1 ? file2 : file1);
100
return (DIFF_EXIT);
101
}
102
return (dfound ? DIFF_EXIT : 0);
103
}
104
105