LOCALCFG=/etc/boot.cfg.local
TMP=/boot.cfg.temp
DIRSBASE=/boot/minix
+INHERIT="ahci acpi no_apic"
-filter_missing_entries()
+filter_entries()
{
+ # This routine performs three tasks:
+ # - substitute variables in the configuration lines;
+ # - remove multiboot entries that refer to nonexistent kernels;
+ # - adjust the default option for line removal and different files.
+ # The last part is handled by the awk part of the routine.
+
while read line
do
- if ! echo "$line" | grep -s -q 'multiboot'
+ # Substitute variables like $rootdevname and $args
+ line=$(eval echo \"$line\")
+
+ if ! echo "$line" | grep -sq '^menu=.*multiboot'
then
echo "$line"
continue
fi
- # Check if kernel presents
+ # Check if the referenced kernel is present
kernel=`echo "$line" | sed -n 's/.*multiboot[[:space:]]*\(\/[^[:space:]]*\).*/\1/p'`
if [ ! -r "$kernel" ]
then
echo "Warning: config contains entry for \"$kernel\" which is missing! Entry skipped." 1>&2
+ echo "menu=SKIP"
else
echo "$line"
fi
- done
+ done | awk '
+ BEGIN {
+ count=1
+ base=0
+ default=0
+ }
+ /^menu=SKIP$/ {
+ # A menu entry discarded by the kernel check above
+ skip[count++]=1
+ next
+ }
+ /^menu=/ {
+ # A valid menu entry
+ skip[count++]=0
+ print
+ next
+ }
+ /^BASE=/ {
+ # The menu count base as passed in by count_entries()
+ sub(/^.*=/,"",$1)
+ base=$1+0
+ next
+ }
+ /^default=/ {
+ # The default option
+ # Correct for the menu count base and store for later
+ sub(/^.*=/,"",$1)
+ default=$1+base
+ next
+ }
+ {
+ # Any other line
+ print
+ }
+ END {
+ # If a default was given, correct for removed lines
+ # (do not bother to warn if the default itself is gone)
+ if (default) {
+ for (i = default; i > 0; i--)
+ if (skip[i]) default--;
+ print "default=" default
+ }
+ }
+ '
+}
+
+count_entries()
+{
+ echo -n "BASE="; grep -cs '^menu=' "$1"
}
if [ ! -b "$ROOT" ]
rootdevname=`echo $ROOT | sed 's/\/dev\///'`
+# Construct a list of inherited arguments for boot options to use. Note that
+# rootdevname must not be passed on this way, as it is changed during setup.
+args=""
+for k in $INHERIT; do
+ if sysenv | grep -sq "^$k="; then
+ kv=$(sysenv | grep "^$k=")
+ args="$args $kv"
+ fi
+done
+
if [ -r $DEFAULTCFG ]
then
- default_cfg=`cat $DEFAULTCFG`
- # Substitute variables like $rootdevname
- echo "$default_cfg" | while read line; do eval echo \"$line\" | filter_missing_entries >> $TMP; done
+ filter_entries < $DEFAULTCFG >> $TMP
fi
-if [ -e /boot/minix_latest -a -d /boot/minix_latest -o -h /boot/minix_latest ]
+if [ -d /boot/minix_latest -o -h /boot/minix_latest ]
then
latest=`basename \`stat -f "%Y" /boot/minix_latest\``
fi
build_name="`basename $i`"
if [ "$build_name" != "$latest" ]
then
- echo "menu=Start MINIX 3 ($build_name):load_mods $DIRSBASE/$i/mod*;multiboot $DIRSBASE/$i/kernel rootdevname=$rootdevname" >> /$TMP
+ echo "menu=Start MINIX 3 ($build_name):load_mods $DIRSBASE/$i/mod*;multiboot $DIRSBASE/$i/kernel rootdevname=$rootdevname $args" >> $TMP
fi
done
-[ -r $LOCALCFG ] && cat $LOCALCFG | filter_missing_entries >> $TMP
+if [ -r $LOCALCFG ]
+then
+ # If the local config supplies a "default" option, we assume that this
+ # refers to one of the options in the local config itself. Therefore,
+ # we increase this default by the number of options already present in
+ # the output so far. To this end, count_entries() inserts a special
+ # token that is recognized and filtered out by filter_entries().
+ (count_entries $TMP; cat $LOCALCFG) | filter_entries >> $TMP
+fi
mv $TMP /boot.cfg
clear=1
timeout=5
default=2
-menu=Start MINIX 3:load_mods /boot/minix_default/mod*;multiboot /boot/minix_default/kernel rootdevname=$rootdevname
-menu=Start latest MINIX 3:load_mods /boot/minix_latest/mod*;multiboot /boot/minix_latest/kernel rootdevname=$rootdevname
-menu=Start latest MINIX 3 in single user mode:load_mods /boot/minix_latest/mod*;multiboot /boot/minix_latest/kernel rootdevname=$rootdevname bootopts=-s
+menu=Start MINIX 3:load_mods /boot/minix_default/mod*;multiboot /boot/minix_default/kernel rootdevname=$rootdevname $args
+menu=Start latest MINIX 3:load_mods /boot/minix_latest/mod*;multiboot /boot/minix_latest/kernel rootdevname=$rootdevname $args
+menu=Start latest MINIX 3 in single user mode:load_mods /boot/minix_latest/mod*;multiboot /boot/minix_latest/kernel rootdevname=$rootdevname bootopts=-s $args
menu=Edit menu option:edit
menu=Drop to boot prompt:prompt