]> git.ozlabs.org Git - yaboot.git/blobdiff - ybin/ybin
The attached patch adds support for writing the nvram using the nvram
[yaboot.git] / ybin / ybin
index a3d94d1a83434cbb6808a3cbe8865e77fffddfc7..19ee2aab580188abb50821a02dccd06d84b9d83f 100755 (executable)
--- a/ybin/ybin
+++ b/ybin/ybin
@@ -29,7 +29,7 @@ fi
 PRG="${0##*/}"
 ABSPRG="$0"
 SIGINT="$PRG: Interrupt caught ... exiting"
-VERSION=1.3.13
+VERSION=1.3.14
 DEBUG=0
 VERBOSE=0
 TMP="${TMPDIR:-/tmp}"
@@ -63,7 +63,7 @@ fi
 ## define default configuration
 boot=unconfigured
 
-## allow default to work on packaged and non-packaged yaboot. 
+## allow default to work on packaged and non-packaged yaboot.
 ## no default for magicboot since it is not required everywhere.
 if [ -f /usr/local/lib/yaboot/yaboot ] ; then
     install=/usr/local/lib/yaboot/yaboot
@@ -124,7 +124,7 @@ fi
 
 ## make fake `id' if its missing, outputs 0 since if its missing we
 ## are probably running on boot floppies and thus are root.
-if (command -v id > /dev/null 2>&1) ; then 
+if (command -v id > /dev/null 2>&1) ; then
     true
 else
     id()
@@ -155,6 +155,8 @@ Update/install bootloader onto a bootstrap partition.
   -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 ]
@@ -300,7 +302,7 @@ checkconf()
            fi
            local CONFERR=1
        fi
-       
+
        if [ `echo ${#hfscreator}` != 4 ] ; then
            if [ "$ARGCT" = 1 ] ; then
                echo 1>&2 "$PRG: --creator must be 4 characters"
@@ -386,7 +388,7 @@ checkconf()
        fi
 
        ## convert defaultos variable
-       case "$defaultos" in 
+       case "$defaultos" in
            linux|Linux|GNU|Gnu|gnu)
                defaultos=bootyaboot
                ;;
@@ -434,21 +436,22 @@ checkconf()
     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
@@ -728,7 +731,7 @@ checkhfsutils()
 
 ## This is gross, IBM CHRP OF needs a .note added to the yaboot
 ## binary, nobody knows whether this note will affect PowerMac OF or
-## not (or could in the future). 
+## not (or could in the future).
 hack_yaboot()
 {
     local YBDIR="${install%/*}"
@@ -790,7 +793,7 @@ util_install()
 
     ## repoint magicboot as the real first stage loader if using the
     ## modern automatic generating ofboot.b.
-    if [ -n "$FIRST" ] ; then  
+    if [ -n "$FIRST" ] ; then
        magicboot="$FIRST"
        [ "$DEBUG" = 1 ] && echo 1>&2 "$PRG: DEBUG: set magicboot to $FIRST"
     fi
@@ -804,7 +807,7 @@ util_install()
        if [ "$protect" = yes ] ; then
            local LOCK="+l"
        fi
-       
+
        if [ "$hide" = yes ] ; then
            local INVISIBLE="+i"
        fi
@@ -924,7 +927,11 @@ util_install()
        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
@@ -1008,7 +1015,7 @@ umnt()
 mnt_install()
 {
     local BTFILE=yaboot
-  
+
     ## msdosfs is broken, yaboot may not support this filename.
     if [ "$fstype" = msdos ] ; then
        local CFFILE=yaboot.cnf
@@ -1110,7 +1117,11 @@ mnt_install()
     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
@@ -1122,7 +1133,7 @@ mnt_install()
 }
 
 ## raw installation, for IBM RS/6000 hardware, yaboot is dded to the
-## bootstrap partition. 
+## bootstrap partition.
 raw_install()
 {
     ## make sure the device is not mounted as a filesystem before
@@ -1244,7 +1255,7 @@ mkoffs()
            [ "$VERBOSE" = 1 ] && echo "$PRG: Creating DOS filesystem on $boot..."
             if (command -v dd > /dev/null 2>&1) ; then
                 dd if=/dev/zero of="$boot" bs=512 count=1600 > /dev/null 2>&1
-            fi  
+            fi
            mkdosfs -n bootstrap "$boot" > /dev/null
             if [ $? != 0 ] ; then
                echo 1>&2 "$PRG: DOS filesystem creation failed!"
@@ -1326,7 +1337,7 @@ cleanup()
 ## absurdly bloated case statement to parse command line options.
 if [ $# != 0 ] ; then
     while true ; do
-       case "$1" in 
+       case "$1" in
            -V|--version)
                version
                exit 0
@@ -1377,6 +1388,17 @@ if [ $# != 0 ] ; then
                    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"
@@ -1643,6 +1665,28 @@ fi
 ## 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