## 10_support_ethdevice.dpatch by <mika@grml.org>
##
## All lines beginning with `## DP:' are a description of the patch.
-## DP: Support bootoption ethdevice
+## DP: Support bootoptions ethdevice and ethdevice-timeout for
+## DP: specifying from which device you want to boot from and
+## DP: using which timeout (being 30 seconds if unconfigured), if
+## DP: ethdevice is not specified try to get a working network
+## DP: configuration for each existing network device.
@DPATCH@
-
-diff --git a/scripts/live b/scripts/live
-index db1d355..797a5da 100755
---- a/scripts/live
-+++ b/scripts/live
-@@ -66,6 +66,11 @@ Arguments ()
+diff -urNad live-initramfs-grml~/scripts/live live-initramfs-grml/scripts/live
+--- live-initramfs-grml~/scripts/live 2009-12-29 22:00:53.858638095 +0100
++++ live-initramfs-grml/scripts/live 2009-12-29 22:04:16.588656569 +0100
+@@ -66,6 +66,16 @@
set -x
;;
+ ethdevice=*)
-+ DEVICE="${ARGUMENT#ethdevice=}"
-+ export DEVICE
++ ETHDEVICE="${ARGUMENT#ethdevice=}"
++ export ETHDEVICE
++ ;;
++
++ ethdevice-timeout=*)
++ ETHDEV_TIMEOUT="${ARGUMENT#ethdevice-timeout=}"
++ export ETHDEV_TIMEOUT
+ ;;
+
fetch=*)
FETCH="${ARGUMENT#fetch=}"
export FETCH
+@@ -739,7 +749,48 @@
+ udevsettle
+ fi
+
+- ipconfig ${DEVICE} | tee /netboot.config
++ # if ethdevice was not specified on the kernel command line
++ # make sure we try to get a working network configuration
++ # for *every* present network device (except for loopback of course)
++ if [ -z "$ETHDEVICE" ] ; then
++ echo "If you want to boot from a specific device use bootoption ethdevice=..."
++ for device in /sys/class/net/*; do
++ dev=${device##*/} ;
++ if [ "$dev" != "lo" ] ; then
++ ETHDEVICE="$ETHDEVICE $dev"
++ fi
++ done
++ fi
++
++ # split args of ethdevice=eth0,eth1 into "eth0 eth1"
++ for device in $(echo $ETHDEVICE | sed 's/,/ /g') ; do
++ devlist="$devlist $device"
++ done
++
++ [ -n "$ETHDEV_TIMEOUT" ] || ETHDEV_TIMEOUT=15
++ echo "Using timeout of $ETHDEV_TIMEOUT seconds for network configuration."
++
++ # this is tricky (and ugly) because ipconfig sometimes just hangs/runs into
++ # an endless loop; iff execution fails give it two further tries, that's
++ # why we use '$devlist $devlist $devlist' for the other for loop
++ for dev in $devlist $devlist $devlist ; do
++ echo "Executing ipconfig -t $ETHDEV_TIMEOUT $dev"
++ ipconfig -t "$ETHDEV_TIMEOUT" $dev | tee -a /netboot.config &
++ jobid=$!
++ sleep "$ETHDEV_TIMEOUT" ; sleep 1
++ if [ -r /proc/"$jobid"/status ] ; then
++ echo "Killing job $jobid for device $dev as ipconfig ran into recursioni..."
++ kill -9 $jobid
++ fi
++
++ # if configuration of device worked we should have an assigned
++ # IP address, iff so let's use the according as $DEVICE for later usage
++ # simple and primitive approach which seems to work fine
++ if ifconfig $dev | grep -q 'inet.*addr:' ; then
++ export DEVICE="$dev"
++ break
++ fi
++ done
+
+ # source relevant ipconfig output
+ OLDHOSTNAME=${HOSTNAME}
+@@ -748,7 +799,8 @@
+ export HOSTNAME
+
+ # Check if we have a network device at all
+- if ! ls /sys/class/net/eth0 > /dev/null 2>&1 && \
++ if ! ls /sys/class/net/"$DEVICE" > /dev/null 2>&1 && \
++ ! ls /sys/class/net/eth0 > /dev/null 2>&1 && \
+ ! ls /sys/class/net/wlan0 > /dev/null 2>&1 && \
+ ! ls /sys/class/net/ath0 > /dev/null 2>&1 && \
+ ! ls /sys/class/net/ra0 > /dev/null 2>&1