PRG="${0##*/}"
ABSPRG="$0"
SIGINT="$PRG: Interrupt caught ... exiting"
-VERSION=1.3.13
+VERSION=1.3.14
DEBUG=0
VERBOSE=0
TMP="${TMPDIR:-/tmp}"
-b, --boot set bootstrap partition device [ -b /dev/hda2 ]
-o, --ofboot set bootstrap partition OpenFirmware device
default: automatically determined [ -o hd:2 ]
+ --bootonce override default boot label for ONLY next boot
+ eg: --bootonce linux-2.6.20-testing
-i, --install pathname to the actual bootloader binary
default: /usr/{local/}lib/yaboot/yaboot same as
install= in config file [ -i bootloader_file ]
fi
if [ "$nonvram" = 0 ] ; then
- ## see if nvsetenv exists and is executable
- if (command -v nvsetenv > /dev/null 2>&1) ; then
- [ -x `command -v nvsetenv` ] || MISSING=1 ; else MISSING=1
+ ## see if nvsetenv or nvram exists and is executable
+ for program in nvsetenv nvram ; do
+ if (command -v $program > /dev/null 2>&1) && [ -x `command -v $program` ] ; then
+ NVRAM_PROG=$program
+ break
+ fi
+ done
+ if [ -z "$NVRAM_PROG" ] ; then
+ nonvram=1
+ echo 1>&2 "$PRG: Warning: \`nvsetenv' and \`nvram' could not be found, nvram will not be updated"
+ fi
fi
if [ "$nonvram" = 0 ] ; then
## if nvsetenv exists see if its the old broken version
- if [ "$MISSING" != 1 ] ; then
- nvsetenv --version > /dev/null 2>&1 || OLD=1
- else
- nonvram=1
- echo 1>&2 "$PRG: Warning: \`nvsetenv' could not be found, nvram will not be updated"
- fi
-
- if [ "$OLD" = 1 ] ; then
+ if [ "$NVRAM_PROG" = "nvsetenv" ] && ! nvsetenv --version > /dev/null 2>&1 ; then
## i check this myself to avoid misleading error
## messages. nvsetenv should REALLY support --version.
if [ ! -e /dev/nvram ] ; then
nonvram=1
else
nonvram=1
- echo 1>&2 "$PRG: Warning: Incompatible version of \`nvsetenv', nvram will not be updated"
+ echo 1>&2 "$PRG: Warning: Incompatible version of nvsetenv, nvram will not be updated"
fi
fi
fi
if [ "$nonvram" = 0 ] ; then
[ "$VERBOSE" = 1 ] && echo "$PRG: Updating OpenFirmware boot-device variable in nvram..."
[ "$DEBUG" = 1 ] && echo 1>&2 "$PRG: DEBUG: boot-device=${ofboot},${OFFILE}"
- nvsetenv boot-device "${ofboot},${OFFILE}"
+ if [ "$NVRAM_PROG" = "nvsetenv" ] ; then
+ nvsetenv boot-device "${ofboot},${OFFILE}"
+ else
+ nvram -p common --update-config boot-device="${ofboot},${OFFILE}"
+ fi
if [ $? != 0 ] ; then
echo 1>&2 "$PRG: An error occured while updating nvram, we'll ignore it"
fi
if [ "$nonvram" = 0 ] ; then
[ "$VERBOSE" = 1 ] && echo "$PRG: Updating OpenFirmware boot-device variable in nvram..."
[ "$DEBUG" = 1 ] && echo 1>&2 "$PRG: DEBUG: boot-device=${ofboot},${OFFILE}"
- nvsetenv boot-device "${ofboot},${OFFILE}"
+ if [ "$NVRAM_PROG" = "nvsetenv" ] ; then
+ nvsetenv boot-device "${ofboot},${OFFILE}"
+ else
+ nvram -p common --update-config boot-device="${ofboot},${OFFILE}"
+ fi
if [ $? != 0 ] ; then
echo 1>&2 "$PRG: An error occured while updating nvram, we'll ignore it"
fi
exit 1
fi
;;
+ --bootonce)
+ if [ -n "$2" ] ; then
+ bootonce="$2"
+ ARGS="$ARGS $1 $2"
+ shift 2
+ else
+ echo 1>&2 "$PRG: option requires an argument $1"
+ echo 1>&2 "Try \`$PRG --help' for more information."
+ exit 1
+ fi
+ ;;
-i|--install)
if [ -n "$2" ] ; then
install="$2"
## validate configuration for sanity.
checkconf || exit 1
+if [ "x$bootonce" != "x" ]; then
+ foundlabel=`sed s/\#.*// $bootconf | grep "label=$bootonce$" | wc -l`
+ if [ "$nonvram" = 0 ]; then
+ echo 1>&2 "$PRG: --bootonce specified, but nvsetenv not available."
+ exit 1
+ fi
+ if [ "$foundlabel" = 1 ]; then
+ nvsetenv boot-once "$bootonce"
+ foundlabel=`nvsetenv boot-once`
+ if [ "$foundlabel" != "boot-once=$bootonce" ]; then
+ echo 1>&2 "$PRG: Could not nvsetenv boot-once $bootonce"
+ exit 1
+ fi
+ [ "$VERBOSE" = 1 ] && echo "$PRG: nvsetenv boot-once $bootonce"
+ else
+ echo 1>&2 "$PRG: Could not find bootonce label [$bootonce] in $bootconf"
+ exit 1
+ fi
+fi
+
+bootparts=0
+
## check that we can use ofpath, its only needed for magicboot script
## building and nvram updates.
if [ -n "$magicboot" -o "$nonvram" = 0 ] ; then