--- /dev/null
+#!/bin/sh
+
+# Don't continue if root is ok
+[ -n "$rootok" ] && return
+
+# This script is sourced, so root should be set. But let's be paranoid
+[ -z "$root" ] && root=$(getarg root=)
+[ -z "$netroot" ] && netroot=$(getarg netroot=)
+
+if [ "$root" = "dhcp" ] || [ "$netroot" = "dhcp" ] ; then
+ # Tell ip= checker that we need dhcp
+ NEEDDHCP="1"
+
+ # Done, all good!
+ rootok=1
+ netroot=dhcp
+
+ # Shut up init error check
+ [ -z "$root" ] && root="dhcp"
+fi
inst "$moddir/dhclient.conf" "/etc/dhclient.conf"
instmods ecb arc4
inst_rules "$moddir/60-net.rules"
-inst_hook cmdline 99 "$moddir/dhcp-fallback.sh"
+inst_hook cmdline 91 "$moddir/dhcp-root.sh"
+inst_hook cmdline 99 "$moddir/parse-ip-opts.sh"
inst_hook pre-pivot 10 "$moddir/kill-dhclient.sh"
# TODO ifcfg config style is redhat specific, this should probably
--- /dev/null
+#!/bin/sh
+#
+# Format:
+# ip=[dhcp|on|any]
+#
+# ip=<interface>:[dhcp|on|any]
+#
+# ip=<client-IP-number>:<server-id>:<gateway-IP-number>:<netmask>:<client-hostname>:<interface>:[dhcp|on|any|none|off]
+#
+
+# Sadly there's no easy way to split ':' separated lines into variables
+ip_to_var() {
+ local v=${1}:
+ set --
+ while [ -n "$v" ]; do
+ set -- "$@" "${v%%:*}"
+ v=${v#*:}
+ done
+
+ unset ip srv gw mask hostname dev autoconf
+ case $# in
+ 0) autoconf="error" ;;
+ 1) autoconf=$1 ;;
+ 2) dev=$1; autoconf=$2 ;;
+ *) ip=$1; srv=$2; gw=$3; mask=$4; hostname=$5; dev=$6; autoconf=$7 ;;
+ esac
+}
+
+# Warn if defaulting to ip=dhcp
+if [ -n "$netroot" ] && [ -z "$(getarg ip=)" ] ; then
+ warn "No ip= argument(s) for netroot provided, defaulting to DHCP"
+ return;
+fi
+
+# Check ip= lines
+# XXX Would be nice if we could errorcheck ip addresses here as well
+[ "$CMDLINE" ] || read CMDLINE < /proc/cmdline
+for p in $CMDLINE; do
+ [ -n "${p%ip=*}" ] && continue
+
+ ip_to_var ${p#ip=}
+
+ # Empty autoconf defaults to 'dhcp'
+ if [ -z "$autoconf" ] ; then
+ warn "Empty autoconf values default to dhcp"
+ autoconf="dhcp"
+ fi
+
+ # Error checking for autoconf in combination with other values
+ case $autoconf in
+ error) die "Error parsing option '$p'";;
+ bootp|rarp|both) die "Sorry, ip=$autoconf is currenty unsupported";;
+ none|off) \
+ [ -z "$ip" ] && \
+ die "For argument '$p'\nValue '$autoconf' without static configuration does not make sense"
+ [ -z "$mask" ] && \
+ die "Sorry, automatic calculation of netmask is not yet supported"
+ ;;
+ dhcp|on|any) \
+ [ -n "$ip" ] && \
+ die "For argument '$p'\nSorry, setting client-ip does not make sense for '$autoconf'"
+ ;;
+ *) die "For argument '$p'\nSorry, unknown value '$autoconf'";;
+ esac
+
+ # We don't like duplicate device configs
+ if [ -n "$dev" ] ; then
+ if [ -n "$IFACES" ] ; then
+ for i in $IFACES ; do
+ [ "$dev" = "$i" ] && die "For argument '$p'\nDuplication configurations for '$dev'"
+ done
+ fi
+ IFACES="$IFACES $dev"
+ fi
+
+ # Do we need DHCP? (It's simpler to check for a set ip. Checks above ensure that if
+ # ip is there, we're static)
+ [ -n "$NEEDDHCP" ] && [ -z "$ip" ] && DHCPOK="1"
+
+ # Do we need srv OR dhcp?
+ if [ -n "$DHCPORSERVER" ] ; then
+ [ -n "$DHCPOK" ] && SRVOK="1"
+ [ -n "$srv" ] && SRVOK="1"
+ fi
+
+done
+
+[ -n "$NEEDDHCP" ] && [ -z "$DHCPOK" ] && die "Server-ip or dhcp for netboot needed, but current arguments say otherwise"
+
+[ -n "$DHCPORSERVER" ] && [ -z "$SRVOK" ] && die "Server-ip or dhcp for netboot needed, but current arguments say otherwise"