summaryrefslogtreecommitdiffstats
path: root/abs/core/udev/start_udev
blob: 03c38fd56b4dc37690c425f194574f5abe297e30 (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
133
134
135
136
137
#! /bin/sh
#
# start_udev
# script to initialize /dev by using udev.
#
# Modified for Archlinux by Tobias Powalowski <tpowa@archlinux.org>
#
# Inspired by:
# 
# Copyright (C) 2004 Greg Kroah-Hartman <greg@kroah.com>
#
# Released under the GPL v2 only.
#
# This needs to be run at the earliest possible point in the boot 
# process.
#
# Based on the udev init.d script
#
# Thanks go out to the Gentoo developers for proving 
# that this is possible to do.
#
# Yes, it's very verbose, feel free to turn off all of the echo calls,
# they were there to make me feel better that everything was working
# properly during development...
#

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

starttime=$(date +%s)


function trigger_builtin_events() {   
           list="$(echo /sys/class/tty/ttyS*/uevent)"   
           for i in $list; do   
               case "$i" in   
                   */class/uevent|*\**)   
                       continue   
                       ;;   
                   */class/tty/ttyS*)   
                       echo "add" > "$i"   
                       ;;   
               esac   
           done   
   }

function trigger_device_events() {
	/sbin/udevtrigger
}

function wait_for_queue() {
#	loop=20
#        while ! [ "$loop" -gt 0 -a -d /dev/.udev/queue ]; do
#                   sleep 0.1;
#                   loop=$(($loop - 1))
#        done
	/sbin/udevsettle
}

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

	mkdir $udev_root/pts
	mkdir $udev_root/shm
}

udev_init  () {
# don't use udev if sysfs is not mounted.
if [ ! -d $sysfs_dir/block ]; then
	exit 1
fi

echo "mounting... ramfs at $udev_root"
mount -n -t ramfs none $udev_root

# propogate /udev from /sys
echo "Creating initial udev device nodes:"

#echo "making extra nodes"
make_extra_nodes

# check if udevd is already running
if [ `pidof -o %PPID /sbin/udevd` ]; then
	grep -v "/dev/shm" /etc/mtab | grep -v "/dev/pts" > /etc/mtab
	mount /dev/pts
	mount /dev/shm
else
	echo "start udev daemon"
	/sbin/udevd --daemon
fi
case "$(uname -r)" in
       2.6.[0-9]|2.6.[0-9][!0-9]*) ;;
       *) 	if [ -f "/sys/class/tty/console/uevent" ]; then
			echo "Kernel >= 2.6.15 and supports uevents"
			# trigger the sorted events
			echo -e '\000\000\000\000' > /proc/sys/kernel/hotplug
			# catch events that are real fast
			mkdir -p /dev/.udev/queue
			trigger_builtin_events
		else
			# for older kernels without uevents will be removed when udevstart dies in udev
			echo "Kernel does not support uevents, you need a kernel >= 2.6.15!"
			exit 1
		fi 
	;;
esac
}

udev_uevents () {
# configure all devices
trigger_device_events
# until we know how to do better, just wait for _all_ events to finish
wait_for_queue
}

if [ $# -eq 0 ]; then
udev_init
udev_uevents
fi

[ "$1" = "init" ] && udev_init
[ "$1" = "uevents" ] && udev_uevents

echo "udev startup is finished! - time = $(( `date +%s` - $starttime ))"
exit 0