summaryrefslogblamecommitdiffstats
path: root/source/a/udev/config/rc.d/rc.udev.new
blob: 40f38d1de103da4d6955226b680dddc4c8f30195 (plain) (tree)
1
2
3
4
5
6
7
8
9
10
11
12
13












                                                               











                                                               











                                                                             

                                                                                        






















                                                                                

                                                        
                                      
                                                                              

                                                                 


















                                                                                 
                  


                      
 

                                        
 









                                                                                 
 

                                                    
 

                                                                     
 


                                                                                           











                                                                                                                                                                                  

                                                 


          



                                                                             






                                                       



                                                                                





















                                                                             
#!/bin/sh
# This is a script to initialize udev, which populates the /dev
# directory with device nodes, scans for devices, loads the
# appropriate kernel modules, and configures the devices.

PATH="/sbin:/bin"
OPT=""

. /etc/udev/udev.conf

# remove trailing slash from udev_root
UDEV_ROOT=$(echo "${udev_root}" |sed 's/\/*$//')

check_mounted() {
  grep -E -q "^[^[:space:]]+ $1 $2" /proc/mounts
  return $?	
}

mount_devpts() {
  if ! check_mounted $UDEV_ROOT/pts devpts ; then
    mkdir $UDEV_ROOT/pts 2> /dev/null
    mount -n -o mode=0620,gid=5 -t devpts devpts $UDEV_ROOT/pts
  fi
}

case "$1" in
    start)
	# Sanity check #1, udev requires that the kernel support tmpfs:
        if ! grep -wq tmpfs /proc/filesystems ; then
          echo "Sorry, but you need tmpfs support in the kernel to use udev."
          echo
          echo "FATAL:  Refusing to run /etc/rc.d/rc.udev."
          exit 1
        fi

        # Sanity check #2, make sure that a 2.6.x kernel is new enough:
        if [ "$(uname -r | cut -f 1,2 -d .)" = "2.6" ]; then
          if [ "$(uname -r | cut -f 3 -d . | sed 's/[^[:digit:]].*//')" -lt "27" ]; then
            echo "Sorry, but you need a 2.6.27+ kernel to use udev."
            echo "Your kernel version is only $(uname -r)."
            echo
            echo "FATAL:  Refusing to run /etc/rc.d/rc.udev."
            exit 1
          fi
        fi

        # Sanity check #3, make sure the udev package was not removed.  If udevd
        # is not there, this will also shut off this script to prevent further
        # problems:
        if [ ! -x /sbin/udevd ]; then
          chmod 644 /etc/rc.d/rc.udev
          echo "No udevd daemon found."
          echo "Turning off udev:  chmod 644 /etc/rc.d/rc.udev"
          echo "FATAL:  Refusing to run /etc/rc.d/rc.udev."
          exit 1
        fi

        # Disable hotplug helper since udevd listens to netlink:
        if [ -e /proc/sys/kernel/hotplug ]; then
          echo "" > /proc/sys/kernel/hotplug
        fi

	if grep -qw devtmpfs /proc/filesystems ; then
	   if ! check_mounted $UDEV_ROOT devtmpfs ; then
		# umount shm if needed
		check_mounted $UDEV_ROOT/shm tmpfs && umount -l $UDEV_ROOT/shm

		# Umount pts if needed, we will remount it later:
		check_mounted $UDEV_ROOT/pts devpts && umount -l $UDEV_ROOT/pts
		
		# Mount tmpfs on $UDEV_ROOT:
		mount -n -t devtmpfs devtmpfs $UDEV_ROOT 
	   fi
	else 
		# Mount tmpfs on $UDEV_ROOT:
		if ! check_mounted $UDEV_ROOT tmpfs ; then
		  # umount shm if needed
		  check_mounted $UDEV_ROOT/shm tmpfs && umount -l $UDEV_ROOT/shm

		  # Umount pts if needed, we will remount it later:
		  check_mounted $UDEV_ROOT/pts devpts && umount -l $UDEV_ROOT/pts
		
		  # Mount tmpfs on $UDEV_ROOT:
		  # the -n is because we don't want $UDEV_ROOT umounted when
		  # someone (rc.[06]) calls umount -a
		  mount -n -o mode=0755 -t tmpfs tmpfs $UDEV_ROOT 
		
		fi
	fi
	# Mount devpts
	mount_devpts

	# Start udevd.
	/sbin/udevd --daemon 2>/dev/null

	# If udevd was already running, then it will return !=0 exit code,
	# so we'll try to re-run failed events
	if [ $? != 0 ]; then
          OPT="--type=failed $OPT"
          ( cd ${UDEV_ROOT}/.udev
            for TMPFILE in tmp-rules-*.rules ; do
              mv $TMPFILE /etc/udev/rules.d/${TMPFILE/tmp-rules--/} 2>/dev/null
            done
          )
	else	# udev is just now being started, so we'll do some initial setup:

          # Set STARTUP=1 in the environment
          /sbin/udevadm control --property=STARTUP=1

	  # Set OPT="--action=add" to generate add events on coldplug
	  OPT="--action=add"

	  # Add the static nodes to $UDEV_ROOT:
	  cp --preserve=all --recursive --remove-destination /lib/udev/devices/* $UDEV_ROOT
	  
	  # Create rootdev rules
	  DEVICENUMBER=$( /bin/stat -c %d / )
	  MAJORNUMBER=$(($DEVICENUMBER / 256))
	  MINORNUMBER=$(($DEVICENUMBER % 256))

	  echo 'ACTION=="add|change", SUBSYSTEM=="block", ENV{MAJOR}=="'$MAJORNUMBER'", ENV{MINOR}=="'$MINORNUMBER'", SYMLINK+="root"' > /dev/.udev/rules.d/61-dev-root-link.rules

	fi

	echo "Triggering udev events:  /sbin/udevadm trigger $OPT"	
	# Call udevtrigger and udevsettle to do the device configuration:
	/sbin/udevadm trigger $OPT && /sbin/udevadm settle --timeout=120
        # Unset STARTUP=1 in the environment
        /sbin/udevadm control --property=STARTUP=

	;;
    stop)
	echo "Stopping udevd is STRONGLY discouraged and not supported."
	echo "If you are sure you want to do this, use 'force-stop' instead."
	;;
    force-stop)
	echo "Stopping udevd"
        if [ -e /proc/sys/kernel/hotplug ]; then
          echo /sbin/hotplug > /proc/sys/kernel/hotplug
        fi
	killall udevd 
	;;
    restart)
	echo "Restarting udevd is STRONGLY discouraged and not supported."
	echo "If you are sure you want to do this, use 'force-restart' instead."
	;;
    force-restart)
	echo "Restarting udevd"
	killall udevd
	sleep 5
	udevd --daemon
	;;
    reload)
	echo "Reloading udev rules"
	udevadm control --reload-rules
	cp --preserve=all --recursive --update /lib/udev/devices/* $UDEV_ROOT
	;;
    force-reload)
	echo "Updating all available device nodes in $UDEV_ROOT"
	udevadm control --reload-rules
	rm -rf $UDEV_ROOT/.udev $UDEV_ROOT/disk
	cp --preserve=all --recursive --update /lib/udev/devices/* $UDEV_ROOT
	;;
	
    *)
	echo "Usage: $0 {start|stop|restart|reload|force-reload}"
	exit 1
	;;
esac