#!/bin/sh -e
### BEGIN INIT INFO
# Provides:          udev
# Required-Start:    mountkernfs
# Required-Stop:
# Default-Start:     S
# Default-Stop:
# Short-Description: Start mdev, populate /dev and load drivers.
### END INIT INFO

# This startup script is inspired from Debian's script for udev.

# shell version of /usr/bin/tty
my_tty() {
  [ -x /bin/readlink ] || return 0
  [ -e /proc/self/fd/0 ] || return 0
  readlink --silent /proc/self/fd/0 || true
}

# Make sure /dev/pts exists and is mounted over devpts
# We assume /proc and /sys are properly mounted.
mount_pts() {
    if ! [ -d /dev/pts ]; then
	mkdir -m 0755 /dev/pts
    fi
    DEVPTS_MOUNT_OPTIONS='rw,nosuid,noexec,relatime,gid=5,mode=620,ptmxmode=000'
    if ! grep -E -q "^[^[:space:]]+ /dev/pts devpts" /proc/mounts; then
	mount -n -o remount,$DEVPTS_MOUNT_OPTIONS -t devpts devpts /dev/pts
    fi
    return
}

##############################################################################

[ -x /sbin/mdev ] || exit 0

PATH='/sbin:/bin'
TMPFS_MOUNT_OPTIONS='rw,nosuid,size=10m,mode=755'

. /lib/lsb/init-functions

if ! [ -f /etc/mdev.conf ]; then
  log_failure_msg "Cannot find /etc/mdev.conf, not started."
  log_end_msg 1
fi

if [ ! -d /sys/class/ ]; then
  log_failure_msg "mdev requires a mounted sysfs, not started"
  log_end_msg 1
fi

read -r HOTPLUGGER < /proc/sys/kernel/hotplug

case "$1" in
    start)
	if ! mountpoint -q /dev && ! [ -z "$HOTPLUGGER" ]; then
	    log_daemon_msg "/dev/ is not a mountpoint, stopping current hotplugger, $HOTPLUGGER"
	    printf '\n' > /proc/sys/kernel/hotplug
	    HOTPLUGGER=''
	fi
	if ! [ -z "$HOTPLUGGER" ]; then
	    if [ "$HOTPLUGGER" = '/sbin/mdev' ]; then
		log_daemon_msg "mdev is already the hotplugger"
		log_end_msg 0;
	    else
		log_failure_msg "There is already a hotplugger, $HOTPLUGGER, not changed."
		log_end_msg 1
	    fi
	else
	    if ! mountpoint -q /dev; then
		log_daemon_msg "Mounting /dev over tmpfs"
		mount -t tmpfs -o "$TMPFS_MOUNT_OPTIONS" none /dev
		mknod -m 0660 /dev/null c 1 3
	    fi
	    mount_pts
	    log_daemon_msg "Starting the hotplug events dispatcher" "mdev"
	    printf '\n' >/dev/mdev.seq
	    rm -rf /dev/disk/by_uuid /dev/disk/by_label
	    printf '/sbin/mdev\n' > /proc/sys/kernel/hotplug
	    /sbin/mdev -s
	    log_end_msg 0;
	fi
	;;

    stop)
	if [ -z "$HOTPLUGGER" ]; then
	    log_failure_msg "There is no running hotplugger."
	    log_end_msg 1
	elif [ "$HOTPLUGGER" != "/sbin/mdev" ]; then
	    log_failure_msg "Current hotplugger is $HOTPLUGGER, not stopped."
	    log_end_msg 1
	else
	    log_daemon_msg "Removing the hotplug events dispatcher" "mdev"
	    printf '\n' > /proc/sys/kernel/hotplug
	    log_end_msg 0;
	fi
	;;

    restart)
	log_daemon_msg "Executing mdev -s."
	/sbin/mdev -s
	log_end_msg 0;
	;;

    status)
	if [ -z "$HOTPLUGGER" ]; then
	    log_daemon_msg "There is no hotplugger."
	else
	    log_daemon_msg "Current hotplugger is" "$HOTPLUGGER"
	fi
	log_end_msg 0;
	;;

    *)
	printf 'Usage: /etc/init.d/mdev {start|stop|status}\n' >&2
	log_end_msg 1;
	;;
esac    

exit 0;
