#!/bin/sh

debug=0

start()
{
  for arg in `sed -e 's/ $//; y/ /\n/' /proc/cmdline`; do
    case "$arg" in
      blacklist=*)
        # build user blacklist
        for mod in `echo ${arg#blacklist=} | tr ',' ' '`; do
	  echo "blacklist $mod" >>/etc/modprobe.d/user-blacklist
	done;;
      extramodules=*)
        extramodules=`echo ${arg#extramodules=} | tr ',' ' '`;;
    esac
  done

  # create temp blacklist to prevent fibre channel disks etc appearing first
  for mod in lpfc qla2xxx qla4xxx; do
    echo "blacklist $mod" >>/etc/modprobe.d/temp-blacklist
  done

  mount -t ramfs udev /dev
  mkdir -p /dev/pts
  mount -t devpts none /dev/pts                     

  # create essential initial devices
  mknod -m 666 /dev/null c 1 3
  mknod -m 666 /dev/zero c 1 5
  mknod -m 600 /dev/console c 5 1

  echo -n "Detecting hardware."
  export UDEVD_MAX_CHILDS=1
  export UDEVD_MAX_CHILDS_RUNNING=64
  udevd --daemon
  udevtrigger
  udevsettle --timeout=180

  # repeat after deleting temp blacklist
  echo -n '.'
  rm -f /etc/modprobe.d/temp-blacklist
  udevtrigger
  udevsettle --timeout=180

  # load extra modules from command line
  for mod in $extramodules; do
    echo "Loading module: $mod"
    modprobe $mod
  done

  # need dm-mod for P2V:
  echo -n '.'
  modprobe dm-mod
  udevsettle --timeout=180
  echo

  /sbin/biosdevname -d >/dev/null
  if [ $? -eq 0 ] ; then
    # now re-order interfaces to BIOS order:
    for i in /sys/class/net/eth* ; do
      eth_basename=$(basename $i)
      ip link set ${eth_basename} name ${eth_basename}_pending
    done

    for i in /sys/class/net/*_pending ; do
      eth_basename=$(basename $i)
      ip link set ${eth_basename} name $(/sbin/biosdevname -i ${eth_basename})
    done
  fi

  return 0
}

stop()
{
  killall udevd
  umount /dev
  return 0
}


RET=0
case "$1" in
  start)
    start
    RET=$?;;
  stop)
    stop
    RET=$?;;
  *)
    echo "Usage: $0 start|stop"
    RET=1
esac

exit $RET
