140 lines
3.1 KiB
Bash
Executable File
140 lines
3.1 KiB
Bash
Executable File
#!/bin/sh
|
|
set -e
|
|
|
|
ROOT=`printroot -r`
|
|
DEFAULTCFG=/etc/boot.cfg.default
|
|
LOCALCFG=/etc/boot.cfg.local
|
|
TMP=/boot.cfg.temp
|
|
DIRSBASE=/boot/minix
|
|
INHERIT="ahci acpi no_apic nobeep"
|
|
|
|
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
|
|
# Substitute variables like $rootdevname and $args
|
|
line=$(eval echo \"$line\")
|
|
|
|
if ! echo "$line" | grep -sq '^menu=.*multiboot'
|
|
then
|
|
echo "$line"
|
|
continue
|
|
fi
|
|
|
|
# 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 | 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" ]
|
|
then
|
|
echo root device $ROOT not found
|
|
exit 1
|
|
fi
|
|
|
|
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
|
|
filter_entries < $DEFAULTCFG >> $TMP
|
|
fi
|
|
|
|
if [ -d /boot/minix_latest -o -h /boot/minix_latest ]
|
|
then
|
|
latest=`basename \`stat -f "%Y" /boot/minix_latest\``
|
|
fi
|
|
|
|
[ -d $DIRSBASE ] && for i in `ls $DIRSBASE/`
|
|
do
|
|
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 $args" >> $TMP
|
|
fi
|
|
done
|
|
|
|
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
|
|
|
|
sync
|