#!/sbin/openrc-run
# Copyright 1999-2010 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2

description="mount devtmpfs on /dev"

depend()
{
    provide dev-mount
    keyword -vserver -lxc
}

mount_dev_directory()
{
    local mounted=false fstab=false action=--mount msg=Mounting rc=0

    if ! grep -qs devtmpfs /proc/filesystems; then
        eerror "CONFIG_DEVTMPFS=y is required in your kernel configuration"
        eerror "for this version of udev to run successfully."
        eerror "This requires immediate attention."
        if ! mountinfo -q /dev; then
            mount -n -t tmpfs dev /dev
            busybox mdev -s
            mkdir /dev/pts
        fi
        return 1
    fi

    # Is /dev already a mounted devtmpfs?
    mountinfo -q -f devtmpfs /dev && mounted=true

    # If an entry for /dev exists in fstab it must be a devtmpfs.
    fstabinfo -q -t devtmpfs /dev && fstab=true

    # No options are processed here as they should all be in /etc/fstab
    if $fstab; then
        $mounted && action=--remount && msg=Remounting
        ebegin "$msg /dev according to /etc/fstab"
        fstabinfo $action /dev
        rc=$?
    elif ! $mounted; then
        ebegin "Mounting /dev"
        # Some devices require exec, Bug #92921
        mount -n -t devtmpfs -o "exec,nosuid,mode=0755,size=10M" udev /dev
        rc=$?
    else
        ebegin "Using /dev mounted from kernel"
    fi

    eend $rc
}

seed_dev()
{
    # Seed /dev with some things that we know we need

    # creating /dev/console, /dev/tty and /dev/tty1 to be able to write
    # to $CONSOLE with/without bootsplash before udevd creates it
    [ -c /dev/console ] || mknod -m 600 /dev/console c 5 1
    [ -c /dev/tty1 ] || mknod -m 620 /dev/tty1 c 4 1
    [ -c /dev/tty ] || mknod -m 666 /dev/tty c 5 0

    # udevd will dup its stdin/stdout/stderr to /dev/null
    # and we do not want a file which gets buffered in ram
    [ -c /dev/null ] || mknod -m 666 /dev/null c 1 3

    # so udev can add its start-message to dmesg
    [ -c /dev/kmsg ] || mknod -m 660 /dev/kmsg c 1 11

    # Create problematic directories
    mkdir -p /dev/pts /dev/shm
    return 0
}

start()
{
    mount_dev_directory || return 1

    seed_dev
    return 0
}
