#!/bin/bash -efu

export PATH=/sbin:/usr/sbin:/usr/local/sbin:/bin:/usr/bin:/usr/local/bin

[ -d /.initrd ] ||
	mkdir -p /.initrd

# Save kernel environment and init arguments
[ -f /.initrd/kernenv ] ||
	/bin/environ -q -u _,PWD,SHLVL > /.initrd/kernenv

# Create storage for init environment
:> /.initrd/initenv

# Check and create the necessary device files
[ -d /dev ] ||
	mkdir /dev
while read -r d_name d_type d_maj d_min; do
	[ -e "/dev/$d_name" ] ||
		mknod "/dev/$d_name" "$d_type" "$d_maj" "$d_min"
done <<EOF
ram     b 1 1
null    c 1 3
zero    c 1 5
full    c 1 7
random  c 1 8
kmsg    c 1 11
systty  c 4 0
tty0    c 4 0
tty1    c 4 1
tty     c 5 0
console c 5 1
ptmx    c 5 2
EOF

# Backward compatibility
x=/sbin/init-bin
[ ! -x "$x" ] || exec "$x"

trap : INT TSTP QUIT HUP

x=/etc/rc.d/rc.sysinit
[ ! -x "$x" ] || setsid "$x" ||:

level=3
rc=

while :; do
	[ -z "$rc" ] || {
		read -r level < /.initrd/telinit
	} 2>/dev/null ||:

	case "$level" in
		[0-6])
			[ "$rc" != "$level" ] ||
				continue

			rc="$level"

			{
				:> "/.initrd/killall/$BASHPID"
				setsid /etc/rc.d/rc "$rc" ||:
				rm -f -- "/.initrd/killall/$BASHPID"
			} &
			;;
		9)
			exec /etc/rc.d/rc.sysexec "$@"
			;;
	esac
done
