#!@SH@ LIBKVER='@PREFIX@/lib/libkver.so' EX_USAGE=64 nl=' ' tab=' ' usage() { cat <&2 "$0: $*" exit $EX_USAGE } # begin code copied from build.sh {{{ # valid_MACHINE_ARCH -- A multi-line string, listing all valid # MACHINE/MACHINE_ARCH pairs. # # Each line contains a MACHINE and MACHINE_ARCH value, an optional ALIAS # which may be used to refer to the MACHINE/MACHINE_ARCH pair, and an # optional DEFAULT or NO_DEFAULT keyword. # # When a MACHINE corresponds to multiple possible values of # MACHINE_ARCH, then this table should list all allowed combinations. # If the MACHINE is associated with a default MACHINE_ARCH (to be # used when the user specifies the MACHINE but fails to specify the # MACHINE_ARCH), then one of the lines should have the "DEFAULT" # keyword. If there is no default MACHINE_ARCH for a particular # MACHINE, then there should be a line with the "NO_DEFAULT" keyword, # and with a blank MACHINE_ARCH. # valid_MACHINE_ARCH=' MACHINE=acorn26 MACHINE_ARCH=arm MACHINE=acorn32 MACHINE_ARCH=arm MACHINE=algor MACHINE_ARCH=mips64el ALIAS=algor64 MACHINE=algor MACHINE_ARCH=mipsel DEFAULT MACHINE=alpha MACHINE_ARCH=alpha MACHINE=amd64 MACHINE_ARCH=x86_64 MACHINE=amiga MACHINE_ARCH=m68k MACHINE=amigappc MACHINE_ARCH=powerpc MACHINE=arc MACHINE_ARCH=mips64el ALIAS=arc64 MACHINE=arc MACHINE_ARCH=mipsel DEFAULT MACHINE=atari MACHINE_ARCH=m68k MACHINE=bebox MACHINE_ARCH=powerpc MACHINE=cats MACHINE_ARCH=arm DEFAULT MACHINE=cats MACHINE_ARCH=earmv4 ALIAS=ecats MACHINE=cesfic MACHINE_ARCH=m68k MACHINE=cobalt MACHINE_ARCH=mips64el ALIAS=cobalt64 MACHINE=cobalt MACHINE_ARCH=mipsel DEFAULT MACHINE=dreamcast MACHINE_ARCH=sh3el MACHINE=emips MACHINE_ARCH=mipseb MACHINE=epoc32 MACHINE_ARCH=arm MACHINE=evbarm MACHINE_ARCH=arm ALIAS=evbarm-el DEFAULT MACHINE=evbarm MACHINE_ARCH=armeb ALIAS=evbarm-eb MACHINE=evbarm MACHINE_ARCH=earm ALIAS=evbearm-el MACHINE=evbarm MACHINE_ARCH=earmeb ALIAS=evbearm-eb MACHINE=evbarm MACHINE_ARCH=earmhf ALIAS=evbearmhf-el MACHINE=evbarm MACHINE_ARCH=earmhfeb ALIAS=evbearmhf-eb MACHINE=evbarm MACHINE_ARCH=earmv4 ALIAS=evbearmv4-el MACHINE=evbarm MACHINE_ARCH=earmv4eb ALIAS=evbearmv4-eb MACHINE=evbarm MACHINE_ARCH=earmv5 ALIAS=evbearmv5-el MACHINE=evbarm MACHINE_ARCH=earmv5eb ALIAS=evbearmv5-eb MACHINE=evbarm MACHINE_ARCH=earmv6 ALIAS=evbearmv6-el MACHINE=evbarm MACHINE_ARCH=earmv6hf ALIAS=evbearmv6hf-el MACHINE=evbarm MACHINE_ARCH=earmv6eb ALIAS=evbearmv6-eb MACHINE=evbarm MACHINE_ARCH=earmv6hfeb ALIAS=evbearmv6hf-eb MACHINE=evbarm MACHINE_ARCH=earmv7 ALIAS=evbearmv7-el MACHINE=evbarm MACHINE_ARCH=earmv7eb ALIAS=evbearmv7-eb MACHINE=evbarm MACHINE_ARCH=earmv7hf ALIAS=evbearmv7hf-el MACHINE=evbarm MACHINE_ARCH=earmv7hfeb ALIAS=evbearmv7hf-eb MACHINE=evbcf MACHINE_ARCH=coldfire MACHINE=evbmips MACHINE_ARCH= NO_DEFAULT MACHINE=evbmips MACHINE_ARCH=mips64eb ALIAS=evbmips64-eb MACHINE=evbmips MACHINE_ARCH=mips64el ALIAS=evbmips64-el MACHINE=evbmips MACHINE_ARCH=mipseb ALIAS=evbmips-eb MACHINE=evbmips MACHINE_ARCH=mipsel ALIAS=evbmips-el MACHINE=evbppc MACHINE_ARCH=powerpc DEFAULT MACHINE=evbppc MACHINE_ARCH=powerpc64 ALIAS=evbppc64 MACHINE=evbsh3 MACHINE_ARCH= NO_DEFAULT MACHINE=evbsh3 MACHINE_ARCH=sh3eb ALIAS=evbsh3-eb MACHINE=evbsh3 MACHINE_ARCH=sh3el ALIAS=evbsh3-el MACHINE=ews4800mips MACHINE_ARCH=mipseb MACHINE=hp300 MACHINE_ARCH=m68k MACHINE=hp700 MACHINE_ARCH=hppa MACHINE=hpcarm MACHINE_ARCH=arm DEFAULT MACHINE=hpcarm MACHINE_ARCH=earm ALIAS=hpcearm MACHINE=hpcmips MACHINE_ARCH=mipsel MACHINE=hpcsh MACHINE_ARCH=sh3el MACHINE=i386 MACHINE_ARCH=i386 MACHINE=ia64 MACHINE_ARCH=ia64 MACHINE=ibmnws MACHINE_ARCH=powerpc MACHINE=iyonix MACHINE_ARCH=arm DEFAULT MACHINE=iyonix MACHINE_ARCH=earm ALIAS=eiyonix MACHINE=landisk MACHINE_ARCH=sh3el MACHINE=luna68k MACHINE_ARCH=m68k MACHINE=mac68k MACHINE_ARCH=m68k MACHINE=macppc MACHINE_ARCH=powerpc DEFAULT MACHINE=macppc MACHINE_ARCH=powerpc64 ALIAS=macppc64 MACHINE=mipsco MACHINE_ARCH=mipseb MACHINE=mmeye MACHINE_ARCH=sh3eb MACHINE=mvme68k MACHINE_ARCH=m68k MACHINE=mvmeppc MACHINE_ARCH=powerpc MACHINE=netwinder MACHINE_ARCH=arm DEFAULT MACHINE=netwinder MACHINE_ARCH=earmv4 ALIAS=enetwinder MACHINE=news68k MACHINE_ARCH=m68k MACHINE=newsmips MACHINE_ARCH=mipseb MACHINE=next68k MACHINE_ARCH=m68k MACHINE=ofppc MACHINE_ARCH=powerpc DEFAULT MACHINE=ofppc MACHINE_ARCH=powerpc64 ALIAS=ofppc64 MACHINE=pmax MACHINE_ARCH=mips64el ALIAS=pmax64 MACHINE=pmax MACHINE_ARCH=mipsel DEFAULT MACHINE=prep MACHINE_ARCH=powerpc MACHINE=rs6000 MACHINE_ARCH=powerpc MACHINE=sandpoint MACHINE_ARCH=powerpc MACHINE=sbmips MACHINE_ARCH= NO_DEFAULT MACHINE=sbmips MACHINE_ARCH=mips64eb ALIAS=sbmips64-eb MACHINE=sbmips MACHINE_ARCH=mips64el ALIAS=sbmips64-el MACHINE=sbmips MACHINE_ARCH=mipseb ALIAS=sbmips-eb MACHINE=sbmips MACHINE_ARCH=mipsel ALIAS=sbmips-el MACHINE=sgimips MACHINE_ARCH=mips64eb ALIAS=sgimips64 MACHINE=sgimips MACHINE_ARCH=mipseb DEFAULT MACHINE=shark MACHINE_ARCH=arm DEFAULT MACHINE=shark MACHINE_ARCH=earmv4 ALIAS=eshark MACHINE=sparc MACHINE_ARCH=sparc MACHINE=sparc64 MACHINE_ARCH=sparc64 MACHINE=sun2 MACHINE_ARCH=m68000 MACHINE=sun3 MACHINE_ARCH=m68k MACHINE=vax MACHINE_ARCH=vax MACHINE=x68k MACHINE_ARCH=m68k MACHINE=zaurus MACHINE_ARCH=arm DEFAULT MACHINE=zaurus MACHINE_ARCH=earm ALIAS=ezaurus ' # getarch -- find the default MACHINE_ARCH for a MACHINE, # or convert an alias to a MACHINE/MACHINE_ARCH pair. # # Saves MACHINE in makewrappermachine before possibly modifying MACHINE. # # Sets MACHINE and MACHINE_ARCH if the input MACHINE value is # recognised as an alias, or recognised as a machine that has a default # MACHINE_ARCH (or that has only one possible MACHINE_ARCH). # # Leaves MACHINE and MACHINE_ARCH unchanged if MACHINE is recognised # as being associated with multiple MACHINE_ARCH values with no default. # # Bombs if MACHINE is not recognised. # getarch() { local IFS local found="" local line IFS="${nl}" makewrappermachine="${MACHINE}" for line in ${valid_MACHINE_ARCH}; do line="${line%%#*}" # ignore comments line="$( IFS=" ${tab}" ; echo $line )" # normalise white space case "${line} " in "") # skip blank lines or comment lines continue ;; *" ALIAS=${MACHINE} "*) # Found a line with a matching ALIAS=. found="$line" break ;; "MACHINE=${MACHINE} "*" NO_DEFAULT"*) # Found an explicit "NO_DEFAULT" for this MACHINE. found="$line" break ;; "MACHINE=${MACHINE} "*" DEFAULT"*) # Found an explicit "DEFAULT" for this MACHINE. found="$line" break ;; "MACHINE=${MACHINE} "*) # Found a line for this MACHINE. If it's the # first such line, then tentatively accept it. # If it's not the first matching line, then # remember that there was more than one match. case "$found" in '') found="$line" ;; *) found="MULTIPLE_MATCHES" ; break ;; esac ;; esac done case "$found" in *NO_DEFAULT*|*MULTIPLE_MATCHES*) # MACHINE is OK, but MACHINE_ARCH is still unknown return ;; "MACHINE="*" MACHINE_ARCH="*) # Obey the MACHINE= and MACHINE_ARCH= parts of the line. IFS=" " for frag in ${found}; do case "$frag" in MACHINE=*|MACHINE_ARCH=*) eval "$frag" ;; esac done ;; *) bomb "Unknown target MACHINE: ${MACHINE}" ;; esac } # end code copied from build.sh }}} # MAIN PROGRAM opt_s="" opt_r="" opt_m="" opt_p="" while getopts "s:r:m:p:" opt do case "$opt" in s) opt_s="$OPTARG"; export LIBKVER_OSTYPE="$OPTARG" ;; r) opt_r="$OPTARG"; export LIBKVER_OSRELEASE="$OPTARG" ;; m) opt_m="$OPTARG"; export LIBKVER_MACHINE="$OPTARG" ;; p) opt_p="$OPTARG"; export LIBKVER_MACHINE_ARCH="$OPTARG" ;; *) usage ; exit $EX_USAGE ;; esac done shift $(($OPTIND - 1)) if [ $# -eq 0 ]; then usage exit $EX_USAGE fi # If MACHINE was specified and MACHINE_ARCH was not specified, # then try to guess MACHINE_ARCH. if [ -n "$opt_m" ] && [ -z "$opt_p" ]; then MACHINE="$opt_m" getarch if [ -n "$MACHINE_ARCH" ]; then # in addition to setting MACHINE_ARCH, # getarch might have modified MACHINE. export LIBKVER_MACHINE="$MACHINE" export LIBKVER_MACHINE_ARCH="$MACHINE_ARCH" else bomb "'-m ${MACHINE}' needs '-p '" fi fi export LD_PRELOAD="${LIBKVER}${LD_PRELOAD:+:}${LD_PRELOAD}" exec "$@"