#!/bin/sh # # Preferred format: # root=nfs[4]:[server:]path[:options] # FIXME: What is the below referring to other than root=dhcp? # [root=*] netroot=nfs[4]:[server:]path[:options] # # Legacy format: # root=/dev/nfs nfsroot=[server:]path[,options] # # FIXME: This blurb below refers to only legacy? # If the 'nfsroot' parameter is not given on the command line or is empty, # the dhcp root-path is used as [server:]path[:options] or the default # "/tftpboot/%s" will be used. # # If server is unspecified it will be pulled from one of the following # sources, in order: # static ip= option on kernel command line # DHCP next-server option # DHCP server-id option # DHCP root-path option # # NFSv4 is only used if explicitly requested; default is NFSv2 or NFSv3 # depending on kernel configuration # # root= takes precedence over netroot= if root=nfs[...] # # Sadly there's no easy way to split ':' separated lines into variables netroot_to_var() { local v=${1}: set -- while [ -n "$v" ]; do set -- "$@" "${v%%:*}" v=${v#*:} done unset nfs server path options nfs=$1 # Ugly: Can't -z test #path after the case, since it might be allowed # to be empty for root=nfs case $# in 0|1);; 2) path=${2:-error};; 3) # This is ultra ugly. But we can't decide in which position path # sits without checking if the string starts with '/' case $2 in /*) path=$2; options=$3;; *) server=$2; path=${3:-error};; esac ;; *) server=$2; path=${3:-error}; options=$4; esac # Does it really start with '/'? [ -n "${path%%/*}" ] && path="error"; #Fix kernel legacy style separating path and options with ',' if [ "$path" != "${path#*,}" ] ; then options=${path#*,} path=${path%%,*} fi } #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=) [ -z "$nfsroot" ] && nfsroot=$(getarg nfsroot=) # Handle old style :/