syscons revision 271095
155714Skris#!/bin/sh -
255714Skris#
355714Skris# Copyright (c) 2000  The FreeBSD Project
455714Skris# All rights reserved.
555714Skris#
655714Skris# Redistribution and use in source and binary forms, with or without
755714Skris# modification, are permitted provided that the following conditions
855714Skris# are met:
955714Skris# 1. Redistributions of source code must retain the above copyright
1055714Skris#    notice, this list of conditions and the following disclaimer.
1155714Skris# 2. Redistributions in binary form must reproduce the above copyright
1255714Skris#    notice, this list of conditions and the following disclaimer in the
1355714Skris#    documentation and/or other materials provided with the distribution.
1455714Skris#
1555714Skris# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
1655714Skris# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
1755714Skris# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
1855714Skris# ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
1955714Skris# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
2055714Skris# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
2155714Skris# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
2255714Skris# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
2355714Skris# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
2455714Skris# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
2555714Skris# SUCH DAMAGE.
2655714Skris#
2755714Skris# $FreeBSD: stable/10/etc/rc.d/syscons 271095 2014-09-04 13:45:16Z se $
2855714Skris#
2955714Skris
3055714Skris# PROVIDE: syscons
3155714Skris# REQUIRE: LOGIN
3255714Skris# KEYWORD: nojail
3355714Skris
3455714Skris. /etc/rc.subr
3555714Skris
3655714Skrisname="syscons"
3755714Skrisextra_commands="setkeyboard"
3855714Skrissetkeyboard_cmd="syscons_setkeyboard"
3955714Skrisstart_precmd="syscons_precmd"
4055714Skrisstart_cmd="syscons_start"
4155714Skrisstop_cmd=":"
4255714Skris
4355714Skris# stdin must be redirected because it might be for a serial console
4455714Skris#
4555714Skriskbddev=/dev/ttyv0
4655714Skrisviddev=/dev/ttyv0
4755714Skris
4855714Skris_sc_config=
4955714Skris_sc_console=
5055714Skris_sc_initdone=
5155714Skris_sc_keymap_msg=
5255714Skrissc_init()
5355714Skris{
5455714Skris	if [ -z "${_sc_initdone}" ]; then
5555714Skris		if [ -z "${_sc_console}" ]; then
5655714Skris			if [ x`sysctl -n kern.vty` = x"vt" ]; then
5755714Skris				_sc_console="vt"
5855714Skris			else
5955714Skris				_sc_console="syscons"
6055714Skris			fi
6155714Skris			_sc_config="${_sc_console}"
6255714Skris		fi
6355714Skris		echo -n "Configuring ${_sc_config}:"
6455714Skris		_sc_initdone=yes
6555714Skris	fi
6655714Skris}
6755714Skris
68160814Ssimon# syscons to vt migration helper
69160814Ssimonlookup_keymap_for_vt()
70160814Ssimon{
71160814Ssimon	keymap=`basename $1 .kbd`
72160814Ssimon	case $keymap in
73160814Ssimonhy.armscii-8)			echo am;;
74160814Ssimonbe.iso.acc)			echo be.acc;;
75160814Ssimonbe.iso)				echo be;;
76160814Ssimonbg.bds.ctrlcaps)		echo bg.bds;;
77160814Ssimonbg.phonetic.ctrlcaps)		echo bg.phonetic;;
78160814Ssimonbr275.iso.acc)			echo br;;
79160814Ssimonbr275.*)			echo br.noacc;;
80160814Ssimonby.*)				echo by;;
81160814Ssimonfr_CA.iso.acc)			echo ca-fr;;
82160814Ssimonswissgerman.macbook.acc)	echo ch.macbook.acc;;
83160814Ssimonswissgerman.iso.acc)		echo ch.acc;;
84160814Ssimonswissgerman.*)			echo ch;;
85160814Ssimonswissfrench.iso.acc)		echo ch-fr.acc;;
8655714Skrisswissfrench.*)			echo ch-fr;;
8755714Skrisce.iso2)			echo centraleuropean.qwerty;;
8855714Skriscolemak.iso15.acc)		echo colemak.acc;;
89160814Ssimoncs.*|cz.*)			echo cz;;
9055714Skrisgerman.iso.acc)			echo de.acc;;
9155714Skrisgerman.*)			echo de;;
92194206Ssimondanish.iso.acc)			echo dk.acc;;
93194206Ssimondanish.iso.macbook)		echo dk.macbook;;
94194206Ssimondanish.*)			echo dk;;
95194206Ssimonestonian.*)			echo ee;;
96109998Smarkmspanish.dvorak)			echo es.dvorak;;
9755714Skrisspanish.iso*.acc)		echo es.acc;;
9868651Skrisspanish.iso)			echo es;;
9968651Skrisfinnish.*)			echo fi;;
10068651Skrisfr.macbook.acc)			echo fr.macbook;;
10168651Skrisfr.iso.acc)			echo fr.acc;;
10268651Skrisfr.iso)				echo fr;;
10355714Skrisel.iso07)			echo gr;;
10455714Skrisgr.us101.acc)			echo gr.101.acc;;
10555714Skrishr.iso)				echo hr;;
10655714Skrishu.iso2.101keys)		echo hu.101;;
10755714Skrishu.iso2.102keys)		echo hu.102;;
10855714Skrisiw.iso8)			echo il;;
10955714Skrisicelandic.iso.acc)		echo is.acc;;
11055714Skrisicelandic.iso)			echo is;;
11155714Skrisit.iso)				echo it;;
11255714Skrisjp.106x)			echo jp.capsctrl;;
11355714Skrisjp.106)				echo jp;;
11455714Skris#?? jp.pc98.iso)		echo jp.pc98;;
11555714Skriskk.pt154.io)			echo kz.io;;
11659191Skriskk.pt154.kst)			echo kz.kst;;
11755714Skrislatinamerican.iso.acc)		echo latinamerican.acc;;
11855714Skrislt.iso4)			echo lt;;
11955714Skrisnorwegian.iso)			echo no;;
12055714Skrisnorwegian.dvorak)		echo no.dvorak;;
12155714Skrisdutch.iso.acc)			echo nl;;
12255714Skriseee_nordic)			echo nordic.asus-eee;;
12355714Skrispl_PL.dvorak)			echo pl.dvorak;;
12455714Skrispl_PL.ISO8859-2)		echo pl;;
12555714Skrispt.iso.acc)			echo pt.acc;;
12655714Skrispt.iso)				echo pt;;
12755714Skrisru.koi8-r.shift)		echo ru.shift;;
128109998Smarkmru.koi8-r.win)			echo ru.win;;
129109998Smarkmru.*)				echo ru;;
130109998Smarkmswedish.*)			echo se;;
131109998Smarkmsi.iso)				echo si;;
13255714Skrissk.iso2)			echo sk;;
13355714Skristr.iso9.q)			echo tr;;
13455714Skrisua.koi8-u.shift.alt)		echo ua.shift.alt;;
135160814Ssimonua.*)				echo ua;;
136160814Ssimonuk.*-ctrl)			echo uk.capsctrl;;
13755714Skrisuk.dvorak)			echo uk.dvorak;;
138160814Ssimonuk.*)				echo uk;;
13955714Skrisus.iso.acc)			echo us.acc;;
140160814Ssimonus.pc-ctrl)			echo us.ctrl;;
14155714Skrisus.iso)				echo us;;
14255714Skris    esac
14355714Skris}
14455714Skris
14555714Skriskbdcontrol_load_keymap()
14655714Skris{
14755714Skris	errmsg=`kbdcontrol < ${kbddev} -l ${keymap} 2>&1`
14855714Skris	if [ -n "${errmsg}" -a "${_sc_console}" = "vt" ]; then
14955714Skris		_sc_keymap_msg="${errmsg}"
15055714Skris		keymap_vt=`lookup_keymap_for_vt ${keymap}`
15155714Skris		if [ -n "${keymap_vt}" ]; then
152160814Ssimon			errmsg=`kbdcontrol < ${kbddev} -l ${keymap_vt} 2>&1`
15355714Skris			if [ -z "${errmsg}" ]; then
15455714Skris		    		_sc_keymap_msg="New keymap: In /etc/rc.conf replace 'keymap=${keymap}' by 'keymap=${keymap_vt}'"
15555714Skris			fi
15655714Skris		else
15755714Skris			_sc_keymap_msg="No replacement found for keymap '${keymap}'.
15855714SkrisYou may try to convert your keymap file using 'convert-keymap.pl', which is
15955714Skrispart of the system sources and located in /usr/src/tools/tools/vt/keymaps/"
16055714Skris		fi
16155714Skris	fi
16255714Skris}
16355714Skris
16455714Skris# helper
16555714Skrissyscons_configure_keyboard()
16655714Skris{
167160814Ssimon	# keymap
16855714Skris	#
16955714Skris	case ${keymap} in
17055714Skris	[Nn][Oo] | '')
17155714Skris		;;
17255714Skris	*)
17355714Skris		sc_init
17455714Skris		echo -n ' keymap';	kbdcontrol_load_keymap
17555714Skris		;;
17655714Skris	esac
17755714Skris
178160814Ssimon	# keyrate
179160814Ssimon	#
180160814Ssimon	case ${keyrate} in
181160814Ssimon	[Nn][Oo] | '')
18255714Skris		;;
183160814Ssimon	*)
18455714Skris		sc_init
18555714Skris		echo -n ' keyrate';	kbdcontrol < ${kbddev} -r ${keyrate}
18655714Skris		;;
18755714Skris	esac
18855714Skris
18955714Skris	# keybell
19055714Skris	#
19155714Skris	case ${keybell} in
19255714Skris	[Nn][Oo] | '')
19355714Skris		;;
19455714Skris	*)
19555714Skris		sc_init
196160814Ssimon		echo -n ' keybell';	kbdcontrol < ${kbddev} -b ${keybell}
197160814Ssimon		;;
198160814Ssimon	esac
199160814Ssimon
200160814Ssimon	# change function keys
201109998Smarkm	#
202109998Smarkm	case ${keychange} in
203109998Smarkm	[Nn][Oo] | '')
204109998Smarkm		;;
205109998Smarkm	*)
20655714Skris		sc_init
20755714Skris		echo -n ' keychange'
20855714Skris		set -- ${keychange}
20955714Skris		while [ $# -gt 0 ]; do
21068651Skris			kbdcontrol <${kbddev} -f "$1" "$2"
21155714Skris			shift; shift
21255714Skris		done
21355714Skris		;;
21455714Skris	esac
21555714Skris
216160814Ssimon	# set this keyboard mode for all virtual terminals
217160814Ssimon	#
218160814Ssimon	if [ -n "${allscreens_kbdflags}" ]; then
219160814Ssimon		sc_init
220160814Ssimon		echo -n ' allscreens_kbd'
22155714Skris		for ttyv in /dev/ttyv*; do
22255714Skris			kbdcontrol ${allscreens_kbdflags} < ${ttyv} > ${ttyv} 2>&1
22359191Skris		done
22455714Skris	fi
22555714Skris}
22655714Skris
22755714Skrissyscons_setkeyboard()
22855714Skris{
22955714Skris	kbd=$1
23068651Skris
23155714Skris	if [ -z "${kbd}" ]; then
23255714Skris		return 1
23355714Skris	fi
23455714Skris
23555714Skris	# Check if the kbdmux(4) is the current active keyboard
23655714Skris	kbdcontrol -i < ${kbddev} | grep kbdmux > /dev/null 2>&1
23755714Skris	if [ $? -ne 0 ]; then
23855714Skris		kbdcontrol -k ${kbd} < ${kbddev} > /dev/null 2>&1
23955714Skris	fi
24055714Skris
241160814Ssimon	_sc_config="keyboard"
242160814Ssimon	syscons_configure_keyboard
243160814Ssimon
244160814Ssimon	# Terminate keyboard configuration line and reset global variables.
24555714Skris	#
24655714Skris	if [ -n "${_sc_initdone}" ]; then
247160814Ssimon		echo '.'
248160814Ssimon		_sc_config="${_sc_console}"
249160814Ssimon		_sc_initdone=
250160814Ssimon	fi
25155714Skris}
25255714Skris
25355714Skrissyscons_precmd()
254160814Ssimon{
255160814Ssimon	if [ ! -c $kbddev ]
256160814Ssimon	then
257160814Ssimon		return 1
25855714Skris	fi
25955714Skris	return 0
26055714Skris}
26155714Skris
262160814Ssimonsyscons_start()
26355714Skris{
264160814Ssimon	# keyboard
265160814Ssimon	#
266160814Ssimon	if [ -n "${keyboard}" ]; then
267160814Ssimon		syscons_setkeyboard ${keyboard}
268160814Ssimon	fi
269160814Ssimon
270160814Ssimon	syscons_configure_keyboard
271160814Ssimon
272160814Ssimon	# cursor type
273160814Ssimon	#
274160814Ssimon	case ${cursor} in
275160814Ssimon	[Nn][Oo] | '')
276160814Ssimon		;;
277160814Ssimon	*)
278160814Ssimon		sc_init
279160814Ssimon		echo -n ' cursor';	vidcontrol < ${viddev} -c ${cursor}
280142425Snectar		;;
281120631Snectar	esac
282194206Ssimon
28355714Skris	# screen mapping
284142425Snectar	#
28555714Skris	case ${scrnmap} in
286142425Snectar	[Nn][Oo] | '')
287160814Ssimon		;;
288160814Ssimon	*)
289160814Ssimon		sc_init
290160814Ssimon		echo -n ' scrnmap';	vidcontrol < ${viddev} -l ${scrnmap}
291160814Ssimon		;;
292194206Ssimon	esac
293160814Ssimon
294194206Ssimon	# font 8x16
295120631Snectar	#
296120631Snectar	case ${font8x16} in
297120631Snectar	[Nn][Oo] | '')
298120631Snectar		;;
299120631Snectar	*)
300120631Snectar		sc_init
301120631Snectar		echo -n ' font8x16';	vidcontrol < ${viddev} -f 8x16 ${font8x16}
302120631Snectar		;;
303120631Snectar	esac
304120631Snectar
305120631Snectar	# font 8x14
306120631Snectar	#
307120631Snectar	case ${font8x14} in
308120631Snectar	[Nn][Oo] | '')
309120631Snectar		;;
310120631Snectar	*)
311109998Smarkm		sc_init
312142425Snectar		echo -n ' font8x14';	vidcontrol < ${viddev} -f 8x14 ${font8x14}
313109998Smarkm		;;
314142425Snectar	esac
315109998Smarkm
316142425Snectar	# font 8x8
31755714Skris	#
318142425Snectar	case ${font8x8} in
31955714Skris	[Nn][Oo] | '')
32055714Skris		;;
32155714Skris	*)
32255714Skris		sc_init
32355714Skris		echo -n ' font8x8';	vidcontrol < ${viddev} -f 8x8 ${font8x8}
32455714Skris		;;
32555714Skris	esac
326127128Snectar
327127128Snectar	# blank time
32855714Skris	#
32955714Skris	case ${blanktime} in
330127128Snectar	[Nn][Oo] | '')
33155714Skris		;;
332127128Snectar	*)
33355714Skris		sc_init
334127128Snectar		echo -n ' blanktime';	vidcontrol < ${viddev} -t ${blanktime}
33555714Skris		;;
33655714Skris	esac
33755714Skris
33855714Skris	# screen saver
33955714Skris	#
34055714Skris	case ${saver} in
341160814Ssimon	[Nn][Oo] | '')
34255714Skris		;;
34355714Skris	*)
34455714Skris		sc_init
34555714Skris		echo -n ' screensaver'
34655714Skris		for i in `kldstat | awk '$5 ~ "_saver\.ko$" { print $5 }'`; do
347160814Ssimon			kldunload ${i}
348160814Ssimon		done
349160814Ssimon		load_kld -e _saver ${saver}_saver
350160814Ssimon		;;
351160814Ssimon	esac
352160814Ssimon
35355714Skris	# set this mode for all virtual screens
35455714Skris	#
35555714Skris	if [ -n "${allscreens_flags}" ]; then
35655714Skris		sc_init
35755714Skris		echo -n ' allscreens'
35855714Skris		for ttyv in /dev/ttyv*; do
35955714Skris			vidcontrol ${allscreens_flags} < ${ttyv} > ${ttyv} 2>&1
36055714Skris		done
36155714Skris	fi
362160814Ssimon
36355714Skris	[ -n "${_sc_initdone}" ] && echo '.'
364160814Ssimon	if [ -n "${_sc_keymap_msg}" ]; then
36555714Skris		echo
36655714Skris		echo "WARNING:"
36755714Skris		echo "${_sc_keymap_msg}."
36855714Skris		echo
36955714Skris	fi
37055714Skris}
37155714Skris
37255714Skrisload_rc_config $name
37355714Skrisrun_rc_command $*
37455714Skris
37555714Skris