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

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 udev's will print nothing
		[[ -z ${version} ]] && version=0
	fi

	echo "${version}"
}

populate_udev() {
	# Now populate /dev
	/sbin/udevstart

	# 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 nodes that udev can't
	[[ -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

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

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

	return 0
}

main() {
		# Setup temporary storage for /dev
		ebegin "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
			try 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
		ebegin "Configuring system to use udev"
		if [[ ${RC_DEVICE_TARBALL} == "yes" && \
		      -s /lib/udev-state/devices.tar.bz2 ]] ; then
			einfo "  Populating /dev with device nodes ..."
			try tar -jxpf /lib/udev-state/devices.tar.bz2 -C /dev
		fi
		populate_udev

		# Setup hotplugging (if possible)
		if [[ -e /proc/sys/kernel/hotplug ]] ; then
			if [[ $(udev_version) -ge "48" ]] ; then
				einfo "  Setting /sbin/udevsend as hotplug agent ..."
				echo "/sbin/udevsend" > /proc/sys/kernel/hotplug
			elif [[ -x /sbin/hotplug ]] ; then
				einfo "  Using /sbin/hotplug as hotplug agent ..."
			else
				einfo "  Setting /sbin/udev as hotplug agent ..."
				echo "/sbin/udev" > /proc/sys/kernel/hotplug
			fi
		fi
		eend 0
}

main


# vim:ts=4
