#!/bin/sh

error() {
	printf "getty_console: %s\n" "$@" >&2
	# avoid looping
	exec sleep infinity
}

cmdline_console() {
	local cmdline console
	read -r cmdline 2>/dev/null </proc/cmdline
	console="${cmdline#*console=}"

	# cmdline does not contain console= setting
	[ "$console" = "$cmdline" ] && return 1
	console="${console%%[ ,]*}"

	case "$console" in
	# the kernel accepts any of these three as no console
	null|ttynull|"") ;;
	*) echo "$console";;
	esac
}

chosen_console() {
	local chosen console
	read -r chosen 2>/dev/null </sys/firmware/devicetree/base/chosen/stdout-path
	[ -n "$chosen" ] || return 1
	# e.g. chosen=/soc/bus@2100000/serial@21ec000
	# keep just the last @ reg and look for any matching console
	chosen="${chosen##*@}"
	for console in /sys/class/tty/*; do
		[ -e "$console" ] || continue
		if readlink "$console" 2>/dev/null | grep -q "$chosen"; then
			echo "${console##*/}"
			return
		fi
	done
	# not found
	return 1
}

get_console() {
	cmdline_console \
		|| chosen_console
}

case "${1:-}" in
-h|--help)
	echo "Usage: $0 [--get]"
	exit
	;;
--get)
	get_console
	exit
	;;
"")
	;;
*)
	echo "Invalid argument: $1" >&2
	exit 1
	;;
esac

console="$(get_console)" || error "Could not find default console"

if [ -z "$console" ]; then
	error "Console disabled"
fi

exec /sbin/getty -L 115200 "$console" vt102
