#!/bin/bash -eu

. /.initrd/initenv

. shell-error
. uevent-sh-functions
. initrd-sh-functions
. state-sh-functions

exec >> "/var/log/console-setup.log" 2>&1

for e in "$1/ev".*; do
	[ -e "$e" ] || break
	done_event "$e"
done

. /etc/sysconfig/console

foreach_ttys()
{
	local t
	for t in $CONSOLE_TTYS; do
		t="/dev/char/4:$t"
		[ ! -c "$t" ] || "$@" "$t"
	done

	[ -z "$CONSOLE_TTYS" ] || return 0

	for t in /dev/char/4:[0-9]*; do
		[ ! -c "$t" ] || "$@" "$t"
	done
}

set_keyboard_mode()
{
	local mode arg rc=0
	if [ -n "$CONSOLE_UNICODE" ]; then
		mode="Unicode"
		arg=-u
	else
		mode="ASCII"
		arg=-a
	fi
	message "$1: Setting the keyboard driver in $mode mode ..."
	kbd_mode $arg -C "$1" ||
		rc=$?

	[ "$rc" = 0 ] ||
		return 0

	printf '%s\n' "$mode" | statefs_write "/devices/char/$majmin/mode"
}

setup_terminal()
{
	# Tell the console output driver that the bytes arriving are UTF-8
	# encoded multibyte sequences.
	if [ -n "$CONSOLE_UNICODE" ]; then
		printf '\033%%G' >>"$1"
		stty -F "$1" iutf8
	else
		printf '\033%%@' >>"$1"
		stty -F "$1" -iutf8
	fi
}

set_font()
{
	[ -n "$CONSOLE_FONT" ] ||
		return 0

	local rc=0

	message "$1: Loading font $CONSOLE_FONT${CONSOLE_FONT_UNIMAP:+ (unimap $CONSOLE_FONT_UNIMAP)} ..."
	setfont -C "$1" "$CONSOLE_FONT" ${CONSOLE_FONT_UNIMAP:+-u "$CONSOLE_FONT_UNIMAP"} ||
		rc=$?

	[ "$rc" = 0 ] ||
		return 0

	printf '%s\n' "$CONSOLE_FONT" | statefs_write "/devices/char/$majmin/font"
}

set_keymap()
{
	[ -n "$CONSOLE_KEYMAP" ] && [ "$CONSOLE_KEYMAP" != "bogus" ] ||
		return 0

	local FILE arg='' rc=0

	[ "$CONSOLE_BACKSPACE" = "BackSpace" ] &&
		FILE="backspace.inc" ||
		FILE="delete.inc"

	[ -z "$CONSOLE_UNICODE" ] ||
		arg=-u

	message "$1: Loading keymap $CONSOLE_KEYMAP, $FILE${CONSOLE_GRP_TOGGLE:+, $CONSOLE_GRP_TOGGLE.inc} ..."

	loadkeys -C "$1" $arg "$CONSOLE_KEYMAP" "$FILE" ${CONSOLE_GRP_TOGGLE:+"$CONSOLE_GRP_TOGGLE.inc"} ||
		rc=$?

	[ "$rc" = 0 ] ||
		return 0

	printf '%s\n' "$CONSOLE_KEYMAP" | statefs_write "/devices/char/$majmin/keymap"
}

setup_tty()
{
	majmin="$(get_majmin "$1")" ||
		return 0
	set_keyboard_mode "$1"
	setup_terminal "$1"
	set_font "$1"
	set_keymap "$1"
}

foreach_ttys setup_tty
