usplash_write()
{
	if [ -x /sbin/usplash_write ]; then
		/sbin/usplash_write "$@"
	fi
}

_log_msg()
{
	[ "$quiet" != "y" ] || echo "$@"
}

log_success_msg()
{
	_log_msg "Success: $@"
}

log_failure_msg()
{
	_log_msg "Failure: $@"
}

log_warning_msg()
{
	_log_msg "Warning: $@"
}

log_begin_msg()
{
	usplash_write "TEXT $@"
	_log_msg "Begin: $@ ..."
}

log_end_msg()
{
	usplash_write "SUCCESS ok"
	_log_msg "Done."
	update_progress
}

update_progress()
{
	if [ -d /dev/.initramfs ]; then
		[ -n "$PROGRESS_STATE" ] || export PROGRESS_STATE=0
		PROGRESS_STATE=$(($PROGRESS_STATE + 1))
		echo "PROGRESS_STATE=$PROGRESS_STATE" > /dev/.initramfs/progress_state
		usplash_write "PROGRESS $PROGRESS_STATE"
	fi
}

panic()
{
	usplash_write "QUIT"
	# Disallow console access
	[ "$panic" = 0 ] && reboot
	modprobe -q atkbd
	modprobe -qa ohci_hcd uhci_hcd
	modprobe -q usbkbd || modprobe -qa usbhid hid_generic
	echo $@
	PS1='(initramfs) ' /bin/sh -i </dev/console >/dev/console 2>&1
	modprobe -qr usbkbd
}

maybe_break()
{
	[ x$1 = x${break} ] && panic "Spawning shell within the initramfs"
}

run_scripts()
{
	if [ -r "$1" ]; then
		[ "$quiet" = "y" ] || log_begin_msg "Running $1"
		. "$1"
		[ "$quiet" = "y" ] || log_end_msg
	fi
}

substchar()
{
	local S="$1" D= c
	while true; do
		c=${S%%$2*}
		S=${S#*$2}
		D="$D$c"
		[ "$S" = "$c" ] && break
		D="$D$3"
	done
	echo "$D"
}

# Load custom modules first
load_modules()
{
	local m
	# Load modules from "modules=..." kernel parameter
	for m in $(substchar "$MODULES" "," " "); do
		modprobe -q $m
	done
	if [ -e /conf/modules ]; then
		local l
		cat /conf/modules |
		while read l; do
			# Skip empty lines and comments
			for m in $l; do
				[ "_$m" != "_${m#\#}" ] || modprobe -q $m
				break
			done
		done
	fi
	return 0
}

# lilo compatibility
parse_numeric()
{
	local minor
	local major

	case $1 in
	""|/*)
		return
		;;
	*:*)
		minor=${1#*:}
		major=${1%:*}
		;;
	*)
		local v
		v=$((0x${1}))
		minor=$(($v % 256))
		major=$(($v / 256))
		;;
	esac

	mknod /dev/root b $major $minor
	ROOT=/dev/root
}

GetDevPath()
{
	case "$2" in
		LABEL=*)	echo "/dev/disk/by-label/${2#LABEL=}" ;;
		UUID=*)		echo "/dev/disk/by-uuid/${2#UUID=}" ;;
		"")		echo "/dev/$1" ;;
		*)		echo "$2" ;;
	esac
}

ConfigIP()
{
	if [ -z "$IPV4ADDR" ]; then
		local s=/scripts/ip
		if [ -r "$s" ]; then
			run_scripts $s
			return $?
		else
			echo "Can't configure IP-address: $s not exist"
			return 1
		fi
	fi
}

NextAlpha()
{
	local l="?abcdefghijklmnopqrstuvwxyz"
	local a=${l#*$1}
	a=${a%${a#?}}
	echo ${a:-z}
}

NextSD()
{
	local d
	for d in /sys/block/sd?; do
		true
	done
	echo "/dev/sd$(NextAlpha ${d#/sys/block/sd})"
}

GetNetIf()
{
	if [ -n "$BOOTMAC" ]; then
		local i
		local bmac=$(substchar "${BOOTMAC#*-}" "-" ":")
		for i in /sys/class/net/*/address; do
			[ -s "$i" ] || continue
			if [ "$(cat "$i")" = "$bmac" ]; then
				i="${i#/sys/class/net/}"
				echo "${i%/address}"
				return
			fi
		done
	fi
	echo eth0
}
