#!/bin/sh
# -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*-
# ex: ts=8 sw=4 sts=4 et filetype=sh

PATH=/usr/sbin:/usr/bin:/sbin:/bin
command -v getarg >/dev/null    || . /lib/dracut-lib.sh
command -v setup_net >/dev/null || . /lib/net-lib.sh

# Huh? Empty $1?
[ -z "$1" ] && exit 1

# [ ! -z $2 ] means this is for manually bringing up network
# instead of real netroot; If It's called without $2, then there's
# no sense in doing something if no (net)root info is available
# or root is already there
if [ -z "$2" ]; then
    [ -d $NEWROOT/proc ] && exit 0
    [ -z "$netroot" ] && exit 1
fi

# Let's see if we have to wait for other interfaces
# Note: exit works just fine, since the last interface to be
#       online'd should see all files
all_ifaces_up || exit 1

# Set or override primary interface
netif=$1
[ -e "/tmp/net.bootdev" ] && read netif < /tmp/net.bootdev

if [ -e /tmp/net.$netif.manualup ]; then
    rm -f /tmp/net.$netif.manualup
fi

# Figure out the handler for root=dhcp by recalling all netroot cmdline
# handlers when this is not called from manually network bringing up.
if [ -z "$2" ]; then
    if [ "$netroot" = "dhcp" ] || [ "$netroot" = "dhcp6" ] ; then
        # Unset root so we can check later
        unset root

        # Load dhcp options
        [ -e /tmp/dhclient.$netif.dhcpopts ] && . /tmp/dhclient.$netif.dhcpopts

        # If we have a specific bootdev with no dhcpoptions or empty root-path,
        # we die. Otherwise we just warn
        if [ -z "$new_root_path" ] ; then
            [ -n "$BOOTDEV" ] && die "No dhcp root-path received for '$BOOTDEV'"
            warn "No dhcp root-path received for '$BOOTDEV' trying other interfaces if available"
            exit 1
        fi

        # Set netroot to new_root_path, so cmdline parsers don't call
        netroot=$new_root_path

        # FIXME!
        for f in $hookdir/cmdline/90*.sh; do
            [ -f "$f" ] && . "$f";
        done
    else
        rootok="1"
    fi

    # Check: do we really know how to handle (net)root?
    [ -z "$root" ] && die "No or empty root= argument"
    [ -z "$rootok" ] && die "Don't know how to handle 'root=$root'"

    handler=${netroot%%:*}
    handler=${handler%%4}
    handler=$(command -v ${handler}root)
    if [ -z "$netroot" ] || [ ! -e "$handler" ] ; then
        die "No handler for netroot type '$netroot'"
    fi
fi

# We're here, so we can assume that upping interfaces is now ok
setup_net $netif

# exit in case manually bring up network
[ -n "$2" ] && exit 0

# Source netroot hooks before we start the handler
source_hook netroot

# Run the handler; don't store the root, it may change from device to device
# XXX other variables to export?
if $handler $netif $netroot $NEWROOT; then
    # Network rootfs mount successful
    for iface in $IFACES ; do
        [ -f /tmp/dhclient.$iface.lease ] &&    cp /tmp/dhclient.$iface.lease    /tmp/net.$iface.lease
        [ -f /tmp/dhclient.$iface.dhcpopts ] && cp /tmp/dhclient.$iface.dhcpopts /tmp/net.$iface.dhcpopts
    done

    # Save used netif for later use
    [ ! -f /tmp/net.ifaces ] && echo $netif > /tmp/net.ifaces
else
    warn "Mounting root via '$netif' failed"
    # If we're trying with multiple interfaces, put that one down.
    [ -z "$BOOTDEV" ] && ifdown $netif
fi
exit 0
