#!/bin/sh

mount() {
    /bin/busybox mount -o noatime "$@"
}

mount_ubifs() {

    [ -e /dev/ubi0_0 -o -h /dev/ubi0_0 ] || {
        ubimkvol /dev/ubi0 -N 0 -s 30728192
    }
    [ -e /dev/ubi1_0 -o -h /dev/ubi1_0 ] || {
        ubimkvol /dev/ubi1 -N 0 -s 131072
    }
    mkdir -p /tmp/overlay
    mount "ubi0_0" /tmp/overlay -t ubifs -o sync
}

pivot() { # <new_root> <old_root>
	mount -o move /proc $1/proc && \
	pivot_root $1 $1$2 && {
		mount -o move $2/dev /dev
		mount -o move $2/tmp /tmp
		mount -o move $2/sys /sys 2>&-
		mount -o move $2/overlay /overlay 2>&-
		return 0
	}
}

fopivot() { # <rw_root> <ro_root>
    mkdir -p $1/upper $1/work
    mount -t overlay -olowerdir=/,upperdir=$1/upper,workdir=$1/work "overlayfs:$1" /mnt
    pivot /mnt $2
}

do_move_devtmpfs() {
    local mnt="$(grep devtmpfs /proc/mounts)"
          mnt="${mnt#* }"; mnt="${mnt%% *}"

    [ "$mnt" = "/dev" ] || mount -o move "$mnt" /dev
}

mount_essential_fs() {
    mount proc /proc -t proc
    mount sysfs /sys -t sysfs
    pi_size=$(awk '/MemTotal:/ {l=5242880;mt=($2*1024);print((s=mt/2)<l)&&(mt>l)?mt-l:s}' /proc/meminfo)
    mount tmpfs /tmp -t tmpfs -o size=$pi_size,nosuid,nodev,mode=1777
}

mount_device_fs() {
    if grep -q devtmpfs /proc/mounts; then
        do_move_devtmpfs
	else
        mount -t tmpfs tmpfs /dev -o mode=0755,size=512K
    fi
}

init_hotplug2() {
    [ -c /dev/console ] || mknod /dev/console c 5 1
    /sbin/hotplug2 --set-worker /lib/hotplug2/worker_fork.so --set-rules-file /etc/hotplug2-init.rules --no-persistent --set-coldplug-cmd /sbin/udevtrigger
    /sbin/hotplug2 --set-worker /lib/hotplug2/worker_fork.so --set-rules-file /etc/hotplug2-init.rules --persistent &
    echo "" > /proc/sys/kernel/hotplug
}

init_shm() {
    [ -d /dev/shm ] || mkdir -p /dev/shm
}

mount_devpts() {
    [ -d /dev/pts ] || mkdir -p /dev/pts
    mount devpts /dev/pts -t devpts
}

init_console() {
	exec </dev/console >/dev/console 2>&0
}

mount_root() {
    mount_ubifs
    mount -o move /tmp/overlay /overlay 2>&-
    fopivot /overlay /rom
}

run_init() {
    exec env - PATH="/bin:/sbin:/usr/bin:/usr/sbin" LD_LIBRARY_PATH="/lib:/usr/lib" "/sbin/init" 2>&0
}

mount_essential_fs
mount_device_fs
init_hotplug2
init_shm
mount_devpts
init_console
mount_root
run_init

