summaryrefslogtreecommitdiffstats
path: root/abs/core-testing/udev/start_udev
diff options
context:
space:
mode:
Diffstat (limited to 'abs/core-testing/udev/start_udev')
-rwxr-xr-xabs/core-testing/udev/start_udev137
1 files changed, 137 insertions, 0 deletions
diff --git a/abs/core-testing/udev/start_udev b/abs/core-testing/udev/start_udev
new file mode 100755
index 0000000..03c38fd
--- /dev/null
+++ b/abs/core-testing/udev/start_udev
@@ -0,0 +1,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