checkver revision 1.17 1 1.5 christos #!/bin/sh
2 1.17 christos # $NetBSD: checkver,v 1.17 2021/09/17 02:12:16 christos Exp $
3 1.1 erh #
4 1.1 erh # Copyright (c) 1998 The NetBSD Foundation, Inc.
5 1.1 erh # All rights reserved.
6 1.1 erh #
7 1.1 erh # This code is derived from software contributed to The NetBSD Foundation
8 1.1 erh # by Eric Haszlakiewicz.
9 1.1 erh #
10 1.1 erh # Redistribution and use in source and binary forms, with or without
11 1.1 erh # modification, are permitted provided that the following conditions
12 1.1 erh # are met:
13 1.1 erh # 1. Redistributions of source code must retain the above copyright
14 1.1 erh # notice, this list of conditions and the following disclaimer.
15 1.1 erh # 2. Redistributions in binary form must reproduce the above copyright
16 1.1 erh # notice, this list of conditions and the following disclaimer in the
17 1.1 erh # documentation and/or other materials provided with the distribution.
18 1.1 erh #
19 1.1 erh # THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
20 1.1 erh # ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
21 1.1 erh # TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
22 1.1 erh # PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
23 1.1 erh # BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24 1.1 erh # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25 1.1 erh # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26 1.1 erh # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27 1.1 erh # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28 1.1 erh # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29 1.1 erh # POSSIBILITY OF SUCH DAMAGE.
30 1.1 erh #
31 1.1 erh
32 1.1 erh #--------------------------------------------------------------------#
33 1.9 erh # checkver -
34 1.9 erh # Check for libraries that appear to be newer than the
35 1.9 erh # one we're about to install.
36 1.9 erh #
37 1.6 simonb # checkver [-q] [-v shlib_version_file] -d [installedlibdir [library name]]"
38 1.6 simonb # checkver [-q] [-v shlib_version_file] -s [setlistdir [library name]]"
39 1.6 simonb # checkver [-q] [-v shlib_version_file] -f liblistfile [library name]"
40 1.1 erh #
41 1.2 erh # One of -d, -s or -f must be specified.
42 1.1 erh #
43 1.2 erh # all: If library name is not specified it is assumed to
44 1.2 erh # be the name of the current directory.
45 1.2 erh #
46 1.2 erh # -d: Checks the version against the installed libraries.
47 1.2 erh # If no further arguments are given "/usr/lib" is
48 1.2 erh # used as the location of installed libraries.
49 1.2 erh #
50 1.2 erh # -s: Checks the version against the sets. If no argument
51 1.2 erh # follows the sets directory defaults to "/usr/src/distrib/sets/lists".
52 1.2 erh # The directory may be specified as either the top of the
53 1.2 erh # source tree or as the lists directory.
54 1.2 erh #
55 1.2 erh # -f: Checks the version against the provided list. A filename
56 1.2 erh # must be supplied.
57 1.1 erh #
58 1.6 simonb # -v: Specify the filename of the shlib_version file. Defaults
59 1.6 simonb # to "./shlib_version".
60 1.6 simonb #
61 1.8 simonb # This script produces no output if all library version are not
62 1.1 erh # large than the source version. If an installed library with a
63 1.1 erh # version greater than the source is found, checkver prints a
64 1.1 erh # header and a list of the names of the offending installed libraries.
65 1.1 erh #
66 1.1 erh # The header may be supressed by passing "-q" as the first argument.
67 1.1 erh #
68 1.1 erh
69 1.2 erh TMP=/tmp/checkver.$$
70 1.15 christos PROG="$(basename "$0")"
71 1.5 christos # Can't trap 11 (SEGV) in the Real Bourne Shell, since it uses it for
72 1.5 christos # internal malloc!
73 1.5 christos trap "exit 2" 1 2 3 4 5 6 7 8 10 12 13 14 15
74 1.2 erh trap "[ -d $TMP ] && rm -rf $TMP" 0
75 1.1 erh
76 1.5 christos Usage() {
77 1.14 christos cat << EOF 1>&2
78 1.14 christos Usage: $PROG [-q] [-v version_file] -d [installedlibdir [library name]]
79 1.14 christos $PROG [-q] [-v version_file] -s [setlistdir [library name]]
80 1.14 christos $PROG [-q] [-v version_file] -f liblistfile [library name]
81 1.14 christos $PROG is a script that looks for installed libraries with
82 1.14 christos versions greater than that in the version file.
83 1.14 christos For more information, read the comments.
84 1.14 christos EOF
85 1.14 christos exit 1
86 1.1 erh }
87 1.1 erh
88 1.2 erh basedir=/usr/src
89 1.2 erh setsdir=$basedir/distrib/sets/lists
90 1.2 erh libdir=/usr/lib
91 1.6 simonb shlib_version=./shlib_version
92 1.1 erh
93 1.2 erh error=0
94 1.2 erh quiet=0
95 1.2 erh usedir=0
96 1.2 erh usefile=0
97 1.2 erh usesets=0
98 1.14 christos CWD=$(pwd)
99 1.17 christos : ${AWK:=awk}
100 1.14 christos
101 1.14 christos fixone() {
102 1.17 christos eval $(${AWK} -v 'LIB=$1' '
103 1.17 christos BEGIN {
104 1.17 christos gsub(".*\.so\.", "", LIB);
105 1.17 christos split(LIB, VER, ".");
106 1.17 christos printf("local instmajor=%d\n", V[1] + 0);
107 1.17 christos printf("local instminor=%d\n", V[2] + 0);
108 1.17 christos printf("local instteeny=%d\n", V[3] + 0);
109 1.17 christos }')
110 1.14 christos local ms="The following libraries have versions greater than the source"
111 1.14 christos
112 1.14 christos # If they're greater than the source, complain.
113 1.14 christos if [ "0$major" -eq "0$instmajor" ]; then
114 1.14 christos if [ "0$minor" -eq "0$instminor" ]; then
115 1.14 christos if [ "0$teeny" -lt "0$instteeny" ]; then
116 1.14 christos if [ $error -eq 0 -a $quiet -eq 0 ]; then
117 1.14 christos echo "$ms" 1>&2
118 1.14 christos fi
119 1.14 christos echo $1 1>&2
120 1.14 christos error=1
121 1.14 christos fi
122 1.14 christos elif [ "0$minor" -lt "0$instminor" ]; then
123 1.14 christos if [ $error -eq 0 -a $quiet -eq 0 ]; then
124 1.14 christos echo "$ms" 1>&2
125 1.14 christos fi
126 1.14 christos echo $1 1>&2
127 1.14 christos error=1
128 1.14 christos fi
129 1.14 christos elif [ "0$major" -lt "0$instmajor" ]; then
130 1.14 christos if [ $error -eq 0 -a $quiet -eq 0 ]; then
131 1.14 christos echo "$ms" 1>&2
132 1.14 christos fi
133 1.14 christos echo $1 1>&2
134 1.14 christos error=1
135 1.14 christos fi
136 1.14 christos }
137 1.14 christos
138 1.14 christos while getopts df:shqv: f; do
139 1.14 christos case $f in
140 1.14 christos d) usedir=1
141 1.14 christos if [ $usefile -eq 1 -o $usesets -eq 1 ]; then
142 1.14 christos Usage
143 1.14 christos fi;;
144 1.14 christos f) usefile=1; arg1=$OPTARG
145 1.14 christos if [ $usedir -eq 1 -o $usesets -eq 1 ]; then
146 1.14 christos Usage
147 1.14 christos fi;;
148 1.14 christos s) usesets=1
149 1.14 christos if [ $usedir -eq 1 -o $usefile -eq 1 ]; then
150 1.14 christos Usage
151 1.14 christos fi;;
152 1.16 christos v) shlib_version=$OPTARG;;
153 1.16 christos q) quiet=1;;
154 1.14 christos *) Usage;;
155 1.14 christos esac
156 1.2 erh done
157 1.2 erh
158 1.14 christos shift $(($OPTIND - 1))
159 1.14 christos
160 1.14 christos if [ $usedir -eq 0 -a $usefile -eq 0 -a $usesets -eq 0 ]; then
161 1.14 christos Usage
162 1.2 erh fi
163 1.2 erh
164 1.14 christos if [ $usefile -eq 1 ]; then
165 1.14 christos LIBLIST="$arg1"
166 1.1 erh else
167 1.14 christos if ! mkdir -m 0700 $TMP; then
168 1.14 christos echo "$PROG: Unable to create temp directory." 1>&2
169 1.14 christos exit 2
170 1.14 christos fi
171 1.14 christos LIBLIST=$TMP/libs.lst
172 1.2 erh fi
173 1.2 erh
174 1.2 erh # Build list from the installed libraries.
175 1.14 christos if [ $usedir -eq 1 ]; then
176 1.14 christos if [ -n "$1" ]; then
177 1.14 christos libdir="$1"
178 1.14 christos fi
179 1.14 christos for f in $libdir; do
180 1.14 christos ls $f/lib*.so.*.*
181 1.14 christos done > $LIBLIST 2> /dev/null
182 1.1 erh fi
183 1.1 erh
184 1.2 erh # Build list from set lists. Parameter may be either
185 1.2 erh # the "lists" directory or the top of the source tree.
186 1.14 christos if [ $usesets -eq 1 ]; then
187 1.14 christos if [ -n "$1" ]; then
188 1.14 christos setsdir="$1"
189 1.14 christos if [ -d "$setsdir/distrib/sets/lists" ]; then
190 1.14 christos setsdir="$setsdir/distrib/sets/lists"
191 1.14 christos fi
192 1.2 erh fi
193 1.14 christos (cd $setsdir;
194 1.14 christos cat */[a-z]* |
195 1.14 christos grep '^./usr/lib/lib.*\.so\.[0-9][0-9]*\.[0-9][0-9]*' |
196 1.14 christos sort -u > $LIBLIST)
197 1.1 erh fi
198 1.1 erh
199 1.2 erh #
200 1.2 erh # The file $LIBLIST now contains a list of libraries.
201 1.2 erh #
202 1.14 christos if [ -z "$2" ]; then
203 1.14 christos makefile=$CWD/Makefile
204 1.14 christos libname=$(grep '^LIB=' $makefile | sed -e 's/^LIB=[[:space:]]*//')
205 1.14 christos
206 1.14 christos # Assume the library name is the name of the current directory.
207 1.14 christos if [ -z "$libname" ]; then
208 1.14 christos libname=$(basename $CWD)
209 1.14 christos fi
210 1.2 erh else
211 1.14 christos libname="$2"
212 1.2 erh fi
213 1.5 christos echo $libname | grep "^lib" 1>&2 2> /dev/null
214 1.5 christos if [ $? != 0 ]; then
215 1.14 christos libname="lib$libname"
216 1.2 erh fi
217 1.1 erh
218 1.1 erh
219 1.14 christos if [ ! -f $shlib_version ]; then
220 1.14 christos echo "$PROG: unable to find $shlib_version" 1>&2
221 1.14 christos exit 2
222 1.1 erh fi
223 1.1 erh
224 1.1 erh # Grab major and minor numbers from the source.
225 1.6 simonb . $shlib_version
226 1.1 erh
227 1.14 christos if [ -z "$minor" -o -z "$major" ]; then
228 1.14 christos echo "$PROG: $shlib_version doesn't contain the version." 1>&2
229 1.14 christos exit 2
230 1.1 erh fi
231 1.1 erh
232 1.1 erh # Find every shared object library with the same base name.
233 1.14 christos for instlib in $(grep $libname.so "$LIBLIST"); do
234 1.14 christos # Grab the major and minor from the installed library.
235 1.14 christos fixone "$instlib"
236 1.14 christos done
237 1.1 erh
238 1.1 erh exit $error
239