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 t=
	local args="$1" d="$2" s="$3"
	while :; do
		a="${args%%$d*}"
		t="${t:+$t$s}$a"
		if [ "$a" = "$args" ]; then
			echo "$t"
			break
		fi
		args=${args#*$d}
	done
}

# Load custom modules first
load_modules()
{
	local m
	# Load modules from "modules=..." kernel parameter
	if [ -n "$MODULES" ]; then
		for m in $(substchar "$MODULES" "," " "); do
			modprobe -q $m
		done
	fi
	if [ -e /conf/modules ]; then
		cat /conf/modules |
		while read m; do
			# Skip empty lines
			if [ -n "$m" ]; then
				# Skip comments - d?ash removes whitespace prefix
				com=$(printf "%.1s" "$m")
				[ "$com" = "#" ] || modprobe -q $m
			fi
		done
	fi
}

# 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
		:
	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
}
