#!/bin/sh -efu
PATH=/sbin:/bin:/usr/bin:/usr/sbin
export PATH

PROG="${PROG:-${0##*/}}"

msg() {
    local msg="$@"
    if [ -z "$(echo $msg | sed -e 's/[[:space:]]//g')" ]; then
        return
    fi
    echo "$PROG: $msg"
}

##
# Star point
#

msg "Mount /proc"
mount -t proc none /proc

msg "Mount /sys"
mount -t sysfs none /sys

msg "Mount /dev with tmpfs"
mount -t tmpfs -o size=128k,mode=0755 none /dev

msg "Mount /dev/pts"
mkdir /dev/pts
mount -t devpts devpts /dev/pts

msg "Create device files at /dev"
mknod "/dev/console" c 5 1
mknod "/dev/null" c 1 3
mknod "/dev/ram" b 1 1
mknod "/dev/mem" c 1 1
mknod "/dev/kmem" c 1 2
mknod "/dev/systty" c 4 0
mknod "/dev/loop0" b 7 0
mknod "/dev/zero" c 1 5
mknod "/dev/tty" c 5 0
mknod "/dev/ptmx" c 5 2
mknod "/dev/rtc" c 10 135
mknod "/dev/tty0" c 4 0
mknod "/dev/tty1" c 4 1
mknod "/dev/tty2" c 4 2
mknod "/dev/tty3" c 4 3
mknod "/dev/tty4" c 4 4
mknod "/dev/tty5" c 4 5
mknod "/dev/tty6" c 4 6
mknod "/dev/tty7" c 4 7
mknod "/dev/tty8" c 4 8
mknod "/dev/tty9" c 4 9
mknod "/dev/tty10" c 4 10
mknod "/dev/tty11" c 4 11
mknod "/dev/tty12" c 4 12
mknod "/dev/ttyS0" c 4 64
mknod "/dev/ttyS1" c 4 65
mknod "/dev/ttyS2" c 4 66
mknod "/dev/ttyS3" c 4 67

# Autodect hardware and load kernel modules
echo > /proc/sys/kernel/hotplug
echo /sbin/modprobe > /proc/sys/kernel/modprobe

msg "Start udevd"
mkdir -p /dev/.udev/db/
udevd --daemon
mkdir -p /dev/.udev/queue/
udevadm trigger

msg "Mount root fs to RW"
mount -o remount,rw /
mount -a

msg "Bring up loopback device"
ifconfig lo 127.0.0.1 up
route add -net 127.0.0.0 netmask 255.0.0.0 lo

msg "Open failsafe terminal at second console"
openvt /bin/bash

msg "Run any rc scripts"
for i in $(find /etc/init.d -maxdepth 1 -type f -name 'S*' -executable | sort); do
    msg "Run $i"
    sleep 1
    case "$i" in
        *.sh)
        # Source shell script for speed.
        (
        trap - INT QUIT TSTP
        set start
        . $i
        )
        ;;
        *)
        # No sh extension, so fork subprocess.
        if ! $i start; then
            msg "Script \`$i' failed. Drop to shell"
            bash
        fi
        ;;
    esac
    msg "Script $i finished"
    sleep 1
done

msg "Something failed, drop to shell."
exec bash
