ctffindmod.sh revision 7c478bd95313f5f23a4c958a745db2134aa03244
#!/usr/bin/ksh -p
#
# CDDL HEADER START
#
# The contents of this file are subject to the terms of the
# Common Development and Distribution License, Version 1.0 only
# (the "License"). You may not use this file except in compliance
# with the License.
#
# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
# or http://www.opensolaris.org/os/licensing.
# See the License for the specific language governing permissions
# and limitations under the License.
#
# When distributing Covered Code, include this CDDL HEADER in each
# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
# If applicable, add the following below this CDDL HEADER, with the
# fields enclosed by brackets "[]" replaced with your own identifying
# information: Portions Copyright [yyyy] [name of copyright owner]
#
# CDDL HEADER END
#
#
# ident "%Z%%M% %I% %E% SMI"
#
# Copyright 2002 Sun Microsystems, Inc. All rights reserved.
# Use is subject to license terms.
#
# Given a machine-optimal patch makeup table (see ctfcvtptbl), this program
# will allow the build process to determine the following:
#
# * The patch ID associated with a given module
# * The KU required by the patch associated with a given module
# * The patch ID and location of the genunix module preceding the genunix
# module currently being built.
#
PROGNAME=$(basename "$0")
usage()
{
echo "Usage: $PROGNAME [-nr] [-o outfmt] [-b build_type] -t table" \
"module_path" >&2
}
die()
{
echo "$1" >&2
exit 1
}
outfmt="patch,ku"
notfoundok=0
relative=0
build_type=debug32
err=0
while getopts b:lno:rt: c ; do
case $c in
b)
build_type="$OPTARG"
;;
n)
notfoundok=1
;;
o)
outfmt="$OPTARG"
;;
r)
relative=1
;;
t)
table="$OPTARG"
;;
\?)
err=1
;;
esac
done
shift `expr $OPTIND - 1`
if [[ $err -eq 1 || $# -ne 1 || -z "$table" ]] ; then
usage
exit 2
fi
print_garpath=0
print_ku=0
print_patch=0
print_lastgu=0
for word in $(echo "$outfmt" |tr ',' ' ') ; do
case $word in
garpath)
print_garpath=1
;;
ku)
print_ku=1
;;
lastgu)
print_lastgu=1
;;
patch)
print_patch=1
;;
\?)
usage
exit 2
esac
done
module="$1"
shift
if [[ ! -f "$table" ]] ; then
die "$PROGNAME: Cannot open $table"
fi
head -1 "$table" |sed -e 's/^\([^=]*\)=/\1 /' |read garkw garpath
if [[ "$garkw" != "GENUNIX_ARCHIVE" || -z "$garpath" ]] ; then
die "$PROGNAME: $table is not a machine-optimal patch table" >&2
fi
if [[ $relative -eq 1 ]] ; then
crd=$(pwd |sed -e 's:^.*usr/src/uts::')
module=$(echo "$crd/$module" |sed -e 's://*:/:g')
fi
fgrep "$module" "$table" |read junk patch ku
if [[ -z "$patch" ||
"$(expr "$patch" : '[0-9]\{6\}-[0-9][0-9]')" -ne 9 ]] ; then
if [[ "$notfoundok" -eq 1 ]] ; then
patch="-"
else
die "$PROGNAME: Cannot find patch for $module" >&2
fi
fi
if [[ -z "$ku" ]] ; then
ku="-"
fi
# Output
space=""
if [[ $print_patch -eq 1 ]] ; then
echo "$space$patch\c"
space=" "
fi
if [[ $print_ku -eq 1 ]] ; then
echo "$space$ku\c"
space=" "
fi
if [[ $print_garpath -eq 1 ]] ; then
echo "$space$garpath\c"
space=" "
fi
if [[ $print_lastgu -eq 1 ]] ; then
suffix=
if expr $build_type : '.*64' >/dev/null ; then
if [ `uname -p` = "sparc" ] ; then
suffix=/sparcv9
else
suffix=/ia64
fi
fi
echo "$space$garpath/$ku$suffix/genunix\c"
space=" "
fi
[[ -n "$space" ]] && echo
return 0