summaryrefslogtreecommitdiff
path: root/etc/init.d/udev
blob: 7e6305a45b9d4c91101497144abe68ce7eac8137 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
#! /bin/sh
#
# udev	init script to setup /udev
#
# chkconfig: 2345 20 80
# description: manage user-space device nodes in /udev

. /etc/rc.d/init.d/functions

. /etc/udev/udev.conf

prog=udev
sysfs_dir=/sys
bin=/sbin/udev
udevd=/sbin/udevd
udev_root=/udev

run_udev () {
	# handle block devices and their partitions
	for i in ${sysfs_dir}/block/*; do
		# add each drive
		export DEVPATH=${i#${sysfs_dir}}
		$bin block &

		# add each partition, on each device
		for j in $i/*; do
			if [ -f $j/dev ]; then
				export DEVPATH=${j#${sysfs_dir}}
				$bin block &
			fi
		done
	done
	# all other device classes
	for i in ${sysfs_dir}/class/*; do
		for j in $i/*; do
			if [ -f $j/dev ]; then
				export DEVPATH=${j#${sysfs_dir}}
				CLASS=`echo ${i#${sysfs_dir}} | \
					cut --delimiter='/' --fields=3-`
				$bin $CLASS &
			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/.udev.tdb ]; then
		rm -f $udev_root/.udev.tdb
	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
	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 [ -f /var/lock/subsys/udev ]; then
		echo $"$prog has run"
		exit 0
	fi
	echo $"$prog is stopped"
	exit 3
	;;
  restart)
	$0 stop
	$0 start
	;;
  reload)
  	# nothing to do here
	;;
  *)
  	echo "Usage: $0 {start|stop|status|restart}"
	exit 1
esac

exit 0