Home | History | Annotate | Line # | Download | only in lib
checkvers revision 1.5
      1 #!/bin/ksh
      2 #	$NetBSD: checkvers,v 1.5 2000/07/22 16:04:57 erh Exp $
      3 #
      4 # Copyright (c) 1998 The NetBSD Foundation, Inc.
      5 # All rights reserved.
      6 #
      7 # This code is derived from software contributed to The NetBSD Foundation
      8 # by Eric Haszlakiewicz.
      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. All advertising materials mentioning features or use of this software
     19 #    must display the following acknowledgement:
     20 #        This product includes software developed by the NetBSD
     21 #        Foundation, Inc. and its contributors.
     22 # 4. Neither the name of The NetBSD Foundation nor the names of its
     23 #    contributors may be used to endorse or promote products derived
     24 #    from this software without specific prior written permission.
     25 #
     26 # THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
     27 # ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
     28 # TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
     29 # PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
     30 # BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
     31 # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
     32 # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
     33 # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
     34 # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
     35 # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
     36 # POSSIBILITY OF SUCH DAMAGE.
     37 #
     38 
     39 #--------------------------------------------------------------------#
     40 # checkvers [-q] [systemlibdir [library name]]
     41 #
     42 # This is a wrapper script around checkver.  It will find
     43 # all directories withing the current directory containing
     44 # a shlib_version file and call checkver for each.
     45 #
     46 # As with checkver, a list of directories of installed libraries
     47 # may be specified.  This will replace the default of "/usr/lib"
     48 # and search there instead.
     49 #
     50 # A library name may also be specified.  However, this script
     51 # will not work correctly if it finds shlib_version files
     52 # corresponding to a different library.
     53 #
     54 # This script produces no output if all library version are ok.
     55 # If the versions aren't ok the header will be displayed once
     56 # followed by a list of problematic libraries.
     57 #
     58 
     59 # checkvers:
     60 #	if "-s", build list, pass with -f to checkver.
     61 #	if "-d", build list, pass with -f to checkver.
     62 #	if "-f", pass with -f to checkver.
     63 
     64 
     65 # Cleanup on exit.
     66 TMP=/tmp/checkvers.$$
     67 trap "exit 2" 1 2 3 4 5 6 7 8 10 11 12 13 14 15
     68 trap "rm -rf $TMP" 0
     69 
     70 Usage ( ) {
     71     echo "Usage: $1 [-q] -d [installedlibdir [library name]]"
     72     echo "       $1 [-q] -s [setlistdir [library name]]"
     73     echo "       $1 [-q] -f liblistfile [library name]"
     74 }
     75 
     76 basedir=/usr/src
     77 setsdir=$basedir/distrib/sets/lists
     78 libdir=/usr/lib
     79 
     80 error=0
     81 quiet=0
     82 usedir=0
     83 usefile=0
     84 usesets=0
     85 CWD=`pwd`
     86 args=`getopt "df:shq" "$@"`
     87 if [ $? -ne 0 ] ; then
     88     Usage $0
     89     exit 0
     90 fi
     91 
     92 set -- $args
     93 
     94 while . ; do
     95     case "$1" in
     96 	-d) usedir=1 ; shift
     97 	    if [ $usefile -eq 1 -o $usesets -eq 1 ]; then
     98 		Usage $0 ; exit 2
     99 	    fi;;
    100 	-f) usefile=1 ; arg1=$2 ; shift ; shift
    101 	    if [ $usedir -eq 1 -o $usesets -eq 1 ]; then
    102 		Usage $0 ; exit 2
    103 	    fi;;
    104 	-s) usesets=1 ; shift
    105 	    if [ $usedir -eq 1 -o $usefile -eq 1 ]; then
    106 		Usage $0 ; exit 2
    107 	    fi;;
    108 	-h) Usage $0 ; exit 0;;
    109 	-q) quiet=1 ; shift;;
    110 	--) shift ; break;;
    111     esac
    112 done
    113 
    114 if [ $usedir -eq 0 -a $usefile -eq 0 -a $usesets -eq 0 ] ; then
    115     Usage $0 ; exit 2
    116 fi
    117 if [ $usefile -eq 0 -a $# -gt 2 ] ; then
    118     Usage $0 ; exit 2
    119 fi
    120 if [ $usefile -eq 1 -a $# -gt 1 ] ; then
    121     Usage $0 ; exit 2
    122 fi
    123 
    124 #-------------------------#
    125 
    126 QUIET=
    127 LIBNAME=
    128 
    129 # Supress header.
    130 if [ quiet -eq 1 ] ; then
    131     QUIET="-q"
    132 fi
    133 
    134 if ! mkdir -m 700 $TMP ; then
    135     echo "$0: Unable to create temp directory."
    136     exit 2
    137 fi
    138 
    139 if [ $usefile -eq 1 ] ; then
    140     # Just pass the file name to checkver.
    141     LIBLIST="$arg1"
    142 else
    143     LIBLIST=$TMP/libs.lst
    144 fi
    145 
    146 # Build list from the installed libraries.
    147 if [ $usedir -eq 1 ] ; then
    148     if [ "X$1" != "X" ] ; then
    149 	libdir="$1"
    150     fi
    151     for f in $libdir ; do
    152 	ls $f/lib*.so.*.*
    153     done > $LIBLIST 2> /dev/null
    154 fi
    155 
    156 # Build list from set lists.  Parameter may be either
    157 # the "lists" directory or the top of the source tree.
    158 if [ $usesets -eq 1 ] ; then
    159     if [ "X$1" != "X" ] ; then
    160 	setsdir="$1"
    161 	if [ -d "$setsdir/distrib/sets/lists" ] ; then
    162 	    setsdir="$setsdir/distrib/sets/lists"
    163 	fi
    164     fi
    165     (cd $setsdir ;
    166      cat */[a-z]* | grep '^./usr/lib/lib.*\.so\.[0-9][0-9]*\.[0-9][0-9]*' \
    167 		  | sort -u > $LIBLIST
    168     )
    169 fi
    170 
    171 if [ "X$2" != "X" ] ; then
    172     LIBNAME="$2"
    173 fi
    174 
    175 EXECDIR=`eval "(cd \`dirname $0\` ; pwd)"`
    176 
    177 CWD=`pwd`
    178 VERFILES=`find $CWD -name shlib_version -print`
    179 
    180 for f in $VERFILES ; do
    181     # Call checkver.  We always have a list of libraries
    182     # here, whether given to us or built, so always
    183     # pass the -f flag.
    184     (cd `dirname $f` ;
    185     "$EXECDIR"/checkver $QUIET -f "$LIBLIST" "$LIBNAME" ;
    186     exit $?)
    187     ERR=$?
    188     if [ $ERR -eq 2 ] ; then
    189 	echo "$0: checkver failed. LIBLIST=$LIBLIST $LIBNAME=$LIBNAME"
    190 	exit 2
    191     fi
    192     if [ $ERR -ne 0 ] ; then
    193 	QUIET="-q"
    194 	error=1
    195     fi
    196 
    197     if [ "X$LIBNAME" = "X" ] ; then
    198 	# Build the library name from the directory it's in.
    199 	libname=`dirname $f`
    200 	libname=`basename $libname`
    201 	if ! echo $libname | grep -q "^lib" ; then
    202 	    libname="lib$libname"
    203 	fi
    204     else
    205 	libname="$LIBNAME"
    206     fi
    207 
    208     if [ -e $TMP/$libname ] ; then
    209 	echo "Warning: $libname sources encountered multiple times."
    210 	echo "         Previous location: `cat $TMP/$libname`"
    211 	echo "         Current location: `dirname $f`"
    212     fi
    213     echo "`dirname $f`" > $TMP/$libname
    214 
    215 done
    216 
    217 exit $error
    218