- inherit a predefined set of system environment variables (the current set of inherited variables is: ahci; acpi; no_apic); - auto-adjust the default menu option when lines are auto-removed; - add variable substitution support for /etc/boot.cfg.local; - make default menu options in boot.cfg.local relative to itself, allowing one to set the default to a menu option from this file.
		
			
				
	
	
		
			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"
 | 
						|
 | 
						|
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
 |