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 i8042
	modprobe -q atkbd
	echo $@
	PS1='(initramfs) ' /bin/sh -i </dev/console >/dev/console 2>&1
}

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()
{
	case $1 in
	""|/*)
		return
		;;
	*:*)
		minor=${1#*:}
		major=${1%:*}
		;;
	*)
		value=$(( 0x${1} ))
		minor=$(( ${value} % 256 ))
		major=$(( ${value} / 256 ))
		;;
	esac

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

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 a p=" "
	local lower="a b c d e f g h i j k l m n o p q r s t u v w x y z a"
	for a in $lower; do
		[ "$p" = "$1" ] && break
		p=$a
	done
	echo $a
}

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 mac
		local bmac=$(substchar "${BOOTMAC#*-}" "-" ":")
		for i in /sys/class/net/*; do
			mac=$(cat $i/address)
			if [ "$mac" = "$bmac" ]; then
				echo ${i#/sys/class/net/}
				return
			fi
		done
	fi
	echo eth0
}
