# Copyright 1999-2005 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2

# modified for crux 12.20.2005 (jaeger)

udev_version() {
	local version=0

	if [[ -x /sbin/udev ]] ; then
		version=$(/sbin/udev -V)
		# We need it without a leading '0', else bash do the wrong thing
		version=${version##0}
		# Older udevs will print nothing
		[[ -z ${version} ]] && version=0
	fi

	echo "${version}"
}

# This works for 2.6.15 kernels or greater
trigger_events() {
	list=""
	# if you want real coldplug (with all modules being loaded for all
	# devices in the system), uncomment out the next line.
	#list="$list $(echo /sys/bus/*/devices/*/uevent)"
	list="$list $(echo /sys/class/*/*/uevent)"
	list="$list $(echo /sys/block/*/uevent /sys/block/*/*/uevent)"
	for i in $list; do
		case "$i" in
			*/device/uevent)
				# skip followed device symlinks
				continue
				;;
			*/class/mem/*|*/class/tty/*)
				first="$first $i"
				;;
			*/block/md*)
				last="$last $i"
				;;
			*/*)
				default="$default $i"
				;;
		esac
	done

	# trigger the sorted events
	for i in $first $default $last; do
		echo "add" > "$i"
	done
}

populate_udev() {
	# populate /dev with devices already found by the kernel
	#if [ "$(get_KV)" -gt "$(KV_to_int '2.6.14')" ] ; then
		#ebegin "Populating /dev with existing devices through uevents"
		#trigger_events
		#eend 0
	#else
		echo "Populating /dev with existing devices with udevstart..."
		/sbin/udevstart
	#fi

	# loop until everything is finished
	# there's gotta be a better way...
	echo "Letting udev process events..."
	loop=0
	while test -d /dev/.udev/queue; do
		sleep 0.1;
		test "$loop" -gt 300 && break
		loop=$(($loop + 1))
	done
	#einfo "loop = $loop"

	return 0
}

seed_dev() {
	# Seed /dev with some things that we know we need
	echo "Seeding /dev with needed nodes..."

	# copy over any persistant things
	cp --preserve=all --recursive --update /lib/udev/devices/* /dev

	# Not provided by sysfs but needed
	ln -snf /proc/self/fd /dev/fd
	ln -snf fd/0 /dev/stdin
	ln -snf fd/1 /dev/stdout
	ln -snf fd/2 /dev/stderr
	[[ -e /proc/kcore ]] && ln -snf /proc/kcore /dev/core

	# Create problematic directories
	mkdir -p /dev/{pts,shm}
}


main() {
	# Setup temporary storage for /dev
	#echo "Mounting /dev for udev"
	#if [[ ${RC_USE_FSTAB} == "yes" ]] ; then
		#mntcmd=$(get_mount_fstab /dev)
	#else
		#unset mntcmd
	#fi
	#if [[ -n ${mntcmd} ]] ; then
		#try mount -n ${mntcmd}
	#else
		#if egrep -qs tmpfs /proc/filesystems ; then
			mntcmd="tmpfs"
		#else
			#mntcmd="ramfs"
		#fi
		# many video drivers require exec access in /dev #92921
		mount -n -t ${mntcmd} udev /dev -o exec,nosuid,mode=0755
	#fi
	#eend $?

	# Selinux lovin; /selinux should be mounted by selinux-patched init
	#if [[ -x /sbin/restorecon && -c /selinux/null ]] ; then
		#restorecon /dev &> /selinux/null
	#fi

	# Actually get udev rolling
	#if [[ ${RC_DEVICE_TARBALL} == "yes" && \
	      #-s /lib/udev-state/devices.tar.bz2 ]] ; then
		#ebegin "Populating /dev with saved device nodes"
		#try tar -jxpf /lib/udev-state/devices.tar.bz2 -C /dev
		#eend $?
	#fi

	seed_dev

	# Setup hotplugging (if possible)
	echo -n "Setting up hotplug agent... "
	if [[ -e /proc/sys/kernel/hotplug ]] ; then
		#if [ "$(get_KV)" -gt "$(KV_to_int '2.6.14')" ] ; then
			#einfo "  Using netlink for hotplug events..."
			#echo "" > /proc/sys/kernel/hotplug
		if [[ $(udev_version) -ge "48" ]] ; then
			echo "/sbin/udevsend"
			echo "/sbin/udevsend" > /proc/sys/kernel/hotplug
		elif [[ -x /sbin/hotplug ]] ; then
			echo "/sbin/hotplug"
		else
			echo "/sbin/udev"
			echo "/sbin/udev" > /proc/sys/kernel/hotplug
		fi
	fi
	#eend 0

	echo "Starting udevd..."
	/sbin/udevd --daemon
	#eend $?

	populate_udev

	# Create nodes that udev can't
	echo "Finalizing udev configuration..."
	[[ -x /sbin/dmsetup ]] && /sbin/dmsetup mknodes &>/dev/null
	[[ -x /sbin/lvm ]] && \
		/sbin/lvm vgscan -P --mknodes --ignorelockingfailure &>/dev/null
	[[ -x /sbin/evms_activate ]] && /sbin/evms_activate -q &>/dev/null
	#eend 0

	# Same thing as /dev/.devfsd
	touch /dev/.udev
}

main

# vim:ts=4
