X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=etc%2Finit.d%2Fudev;h=8726090d44f5374d12ba40c9e0f3b4fe2e43406f;hb=2b41e68a08548ce44b4d145900dab2bb04cd34f7;hp=c540057d21ae82b925ed0d56286bc8f354150304;hpb=5779dd31f49b41d52d1f08c2eb4239926fa58864;p=elogind.git diff --git a/etc/init.d/udev b/etc/init.d/udev index c540057d2..8726090d4 100644 --- a/etc/init.d/udev +++ b/etc/init.d/udev @@ -1,30 +1,22 @@ -#! /bin/bash +#! /bin/sh # -# random init script to setup /udev +# udev init script to setup /udev # # chkconfig: 2345 20 80 # description: manage user-space device nodes in /udev . /etc/rc.d/init.d/functions -udev_dir=/udev +. /etc/udev/udev.conf + +prog=udev sysfs_dir=/sys bin=/sbin/udev +udevd=/sbin/udevd +udev_root=/udev -case "$1" in - start) - if [ ! -d $udev_dir ]; then - mkdir $udev_dir - fi - if [ ! -d $sysfs_dir ]; then - exit 1 - fi - # propogate /udev from /sys - we only need this while we do not - # have initramfs and an early user-space with which to do early - # device bring up - action "Creating initial udev device nodes: " /bin/true - export ACTION=add - # add block devices and their partitions +run_udev () { + # handle block devices and their partitions for i in ${sysfs_dir}/block/*; do # add each drive export DEVPATH=${i#${sysfs_dir}} @@ -49,21 +41,81 @@ case "$1" in fi done done + return 0 +} + +make_extra_nodes () { + # there are a few things that sysfs does not export for us. + # these things go here (and remember to remove them in + # remove_extra_nodes() + # + # Thanks to Gentoo for the initial list of these. + ln -snf /proc/self/fd $udev_root/fd + ln -snf /proc/self/fd/0 $udev_root/stdin + ln -snf /proc/self/fd/1 $udev_root/stdout + ln -snf /proc/self/fd/2 $udev_root/stderr + ln -snf /proc/kcore $udev_root/core + #ln -snf /proc/asound/oss/sndstat $udev_root/sndstat +} + +remove_extra_nodes () { + # get rid of the extra nodes created in make_extra_nodes() + rm $udev_root/fd + rm $udev_root/stdin + rm $udev_root/stdout + rm $udev_root/stderr + rm $udev_root/core + #rm $udev_root/sndstat +} + +case "$1" in + start) + # don't use udev if sysfs is not mounted. + if [ ! -d $sysfs_dir/block ]; then + exit 1 + fi + if [ ! -d $udev_root ]; then + mkdir $udev_root + fi + + # remove the database if it is there as we always want to start fresh + if [ -f $udev_root/.udevdb ]; then + rm -rf $udev_root/.udevdb + fi + + # propogate /udev from /sys - we only need this while we do not + # have initramfs and an early user-space with which to do early + # device bring up + export ACTION=add + echo -n $"Creating initial udev device nodes:" + run_udev + make_extra_nodes + + # We want to start udevd ourselves if it isn't already running. This + # lets udevd run at a sane nice level... + $udevd & + + success /bin/true + echo + touch /var/lock/subsys/udev ;; stop) # be careful - action "Removing udev device nodes: " /bin/true - if [ $udev_dir -a "$udev_dir" != "/" ]; then - # clear out /udev - rm -rf ${udev_dir}/* - fi + echo -n $"Removing udev device nodes: " + export ACTION=remove + run_udev + remove_extra_nodes + success /bin/true + echo + rm -f /var/lock/subsys/udev ;; status) - if [ -d $udev_dir ]; then - echo "the udev device node directory exists" - else - echo "the udev device node directory does not exist" + if [ -f /var/lock/subsys/udev ]; then + echo $"$prog has run" + exit 0 fi + echo $"$prog is stopped" + exit 3 ;; restart) $0 stop