1 1.1 erh #!/bin/ksh 2 1.9 msaitoh # $NetBSD: checkvers,v 1.9 2021/12/05 08:09:30 msaitoh 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.1 erh # checkvers [-q] [systemlibdir [library name]] 34 1.1 erh # 35 1.1 erh # This is a wrapper script around checkver. It will find 36 1.8 andvar # all directories within the current directory containing 37 1.1 erh # a shlib_version file and call checkver for each. 38 1.1 erh # 39 1.1 erh # As with checkver, a list of directories of installed libraries 40 1.1 erh # may be specified. This will replace the default of "/usr/lib" 41 1.1 erh # and search there instead. 42 1.4 simonb # 43 1.1 erh # A library name may also be specified. However, this script 44 1.1 erh # will not work correctly if it finds shlib_version files 45 1.1 erh # corresponding to a different library. 46 1.1 erh # 47 1.8 andvar # This script produces no output if all library versions are ok. 48 1.1 erh # If the versions aren't ok the header will be displayed once 49 1.1 erh # followed by a list of problematic libraries. 50 1.1 erh # 51 1.1 erh 52 1.2 erh # checkvers: 53 1.2 erh # if "-s", build list, pass with -f to checkver. 54 1.2 erh # if "-d", build list, pass with -f to checkver. 55 1.2 erh # if "-f", pass with -f to checkver. 56 1.2 erh 57 1.1 erh 58 1.1 erh # Cleanup on exit. 59 1.2 erh TMP=/tmp/checkvers.$$ 60 1.2 erh trap "exit 2" 1 2 3 4 5 6 7 8 10 11 12 13 14 15 61 1.1 erh trap "rm -rf $TMP" 0 62 1.1 erh 63 1.1 erh Usage ( ) { 64 1.2 erh echo "Usage: $1 [-q] -d [installedlibdir [library name]]" 65 1.2 erh echo " $1 [-q] -s [setlistdir [library name]]" 66 1.2 erh echo " $1 [-q] -f liblistfile [library name]" 67 1.1 erh } 68 1.1 erh 69 1.2 erh basedir=/usr/src 70 1.2 erh setsdir=$basedir/distrib/sets/lists 71 1.2 erh libdir=/usr/lib 72 1.2 erh 73 1.2 erh error=0 74 1.2 erh quiet=0 75 1.2 erh usedir=0 76 1.2 erh usefile=0 77 1.2 erh usesets=0 78 1.2 erh CWD=`pwd` 79 1.2 erh args=`getopt "df:shq" "$@"` 80 1.2 erh if [ $? -ne 0 ] ; then 81 1.1 erh Usage $0 82 1.1 erh exit 0 83 1.1 erh fi 84 1.1 erh 85 1.2 erh set -- $args 86 1.2 erh 87 1.2 erh while . ; do 88 1.2 erh case "$1" in 89 1.2 erh -d) usedir=1 ; shift 90 1.2 erh if [ $usefile -eq 1 -o $usesets -eq 1 ]; then 91 1.2 erh Usage $0 ; exit 2 92 1.2 erh fi;; 93 1.2 erh -f) usefile=1 ; arg1=$2 ; shift ; shift 94 1.2 erh if [ $usedir -eq 1 -o $usesets -eq 1 ]; then 95 1.2 erh Usage $0 ; exit 2 96 1.2 erh fi;; 97 1.2 erh -s) usesets=1 ; shift 98 1.2 erh if [ $usedir -eq 1 -o $usefile -eq 1 ]; then 99 1.2 erh Usage $0 ; exit 2 100 1.2 erh fi;; 101 1.2 erh -h) Usage $0 ; exit 0;; 102 1.2 erh -q) quiet=1 ; shift;; 103 1.2 erh --) shift ; break;; 104 1.2 erh esac 105 1.2 erh done 106 1.2 erh 107 1.2 erh if [ $usedir -eq 0 -a $usefile -eq 0 -a $usesets -eq 0 ] ; then 108 1.2 erh Usage $0 ; exit 2 109 1.2 erh fi 110 1.2 erh if [ $usefile -eq 0 -a $# -gt 2 ] ; then 111 1.2 erh Usage $0 ; exit 2 112 1.2 erh fi 113 1.2 erh if [ $usefile -eq 1 -a $# -gt 1 ] ; then 114 1.2 erh Usage $0 ; exit 2 115 1.2 erh fi 116 1.2 erh 117 1.2 erh #-------------------------# 118 1.2 erh 119 1.2 erh QUIET= 120 1.2 erh LIBNAME= 121 1.2 erh 122 1.9 msaitoh # Suppress header. 123 1.2 erh if [ quiet -eq 1 ] ; then 124 1.1 erh QUIET="-q" 125 1.2 erh fi 126 1.2 erh 127 1.2 erh if ! mkdir -m 700 $TMP ; then 128 1.2 erh echo "$0: Unable to create temp directory." 129 1.2 erh exit 2 130 1.2 erh fi 131 1.2 erh 132 1.2 erh if [ $usefile -eq 1 ] ; then 133 1.2 erh # Just pass the file name to checkver. 134 1.2 erh LIBLIST="$arg1" 135 1.1 erh else 136 1.2 erh LIBLIST=$TMP/libs.lst 137 1.2 erh fi 138 1.2 erh 139 1.2 erh # Build list from the installed libraries. 140 1.2 erh if [ $usedir -eq 1 ] ; then 141 1.2 erh if [ "X$1" != "X" ] ; then 142 1.2 erh libdir="$1" 143 1.2 erh fi 144 1.3 erh for f in $libdir ; do 145 1.3 erh ls $f/lib*.so.*.* 146 1.5 erh done > $LIBLIST 2> /dev/null 147 1.1 erh fi 148 1.1 erh 149 1.2 erh # Build list from set lists. Parameter may be either 150 1.2 erh # the "lists" directory or the top of the source tree. 151 1.2 erh if [ $usesets -eq 1 ] ; then 152 1.2 erh if [ "X$1" != "X" ] ; then 153 1.2 erh setsdir="$1" 154 1.2 erh if [ -d "$setsdir/distrib/sets/lists" ] ; then 155 1.2 erh setsdir="$setsdir/distrib/sets/lists" 156 1.2 erh fi 157 1.2 erh fi 158 1.2 erh (cd $setsdir ; 159 1.2 erh cat */[a-z]* | grep '^./usr/lib/lib.*\.so\.[0-9][0-9]*\.[0-9][0-9]*' \ 160 1.2 erh | sort -u > $LIBLIST 161 1.2 erh ) 162 1.1 erh fi 163 1.2 erh 164 1.1 erh if [ "X$2" != "X" ] ; then 165 1.1 erh LIBNAME="$2" 166 1.1 erh fi 167 1.1 erh 168 1.1 erh EXECDIR=`eval "(cd \`dirname $0\` ; pwd)"` 169 1.1 erh 170 1.1 erh CWD=`pwd` 171 1.1 erh VERFILES=`find $CWD -name shlib_version -print` 172 1.1 erh 173 1.1 erh for f in $VERFILES ; do 174 1.2 erh # Call checkver. We always have a list of libraries 175 1.2 erh # here, whether given to us or built, so always 176 1.2 erh # pass the -f flag. 177 1.1 erh (cd `dirname $f` ; 178 1.6 gmcgarry "sh $EXECDIR"/checkver $QUIET -f "$LIBLIST" "$LIBNAME" ; 179 1.1 erh exit $?) 180 1.2 erh ERR=$? 181 1.2 erh if [ $ERR -eq 2 ] ; then 182 1.2 erh echo "$0: checkver failed. LIBLIST=$LIBLIST $LIBNAME=$LIBNAME" 183 1.2 erh exit 2 184 1.2 erh fi 185 1.2 erh if [ $ERR -ne 0 ] ; then 186 1.1 erh QUIET="-q" 187 1.1 erh error=1 188 1.1 erh fi 189 1.1 erh 190 1.1 erh if [ "X$LIBNAME" = "X" ] ; then 191 1.1 erh # Build the library name from the directory it's in. 192 1.1 erh libname=`dirname $f` 193 1.1 erh libname=`basename $libname` 194 1.1 erh if ! echo $libname | grep -q "^lib" ; then 195 1.1 erh libname="lib$libname" 196 1.1 erh fi 197 1.1 erh else 198 1.1 erh libname="$LIBNAME" 199 1.1 erh fi 200 1.1 erh 201 1.1 erh if [ -e $TMP/$libname ] ; then 202 1.1 erh echo "Warning: $libname sources encountered multiple times." 203 1.1 erh echo " Previous location: `cat $TMP/$libname`" 204 1.1 erh echo " Current location: `dirname $f`" 205 1.1 erh fi 206 1.1 erh echo "`dirname $f`" > $TMP/$libname 207 1.1 erh 208 1.1 erh done 209 1.1 erh 210 1.2 erh exit $error 211