syscons revision 271958
153813Simp#!/bin/sh -
2118063Simp#
3100213Simp# Copyright (c) 2000  The FreeBSD Project
452506Simp# All rights reserved.
552506Simp#
652506Simp# Redistribution and use in source and binary forms, with or without
752506Simp# modification, are permitted provided that the following conditions
852506Simp# are met:
952506Simp# 1. Redistributions of source code must retain the above copyright
1052506Simp#    notice, this list of conditions and the following disclaimer.
1152506Simp# 2. Redistributions in binary form must reproduce the above copyright
1252506Simp#    notice, this list of conditions and the following disclaimer in the
1352506Simp#    documentation and/or other materials provided with the distribution.
1452506Simp#
1552506Simp# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
1652506Simp# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
1752506Simp# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
1852506Simp# ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
1952506Simp# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
2052506Simp# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
2152506Simp# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
2252506Simp# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
2352506Simp# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
2452506Simp# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
2552506Simp# SUCH DAMAGE.
2652506Simp#
2752506Simp# $FreeBSD: head/etc/rc.d/syscons 271958 2014-09-22 11:54:13Z se $
2852506Simp#
2952506Simp
3052506Simp# PROVIDE: syscons
3152506Simp# REQUIRE: LOGIN
3252506Simp# KEYWORD: nojail
3352506Simp
3452506Simp. /etc/rc.subr
3552506Simp
3652506Simpname="syscons"
3752506Simpextra_commands="setkeyboard"
3852506Simpsetkeyboard_cmd="syscons_setkeyboard"
3952506Simpstart_precmd="syscons_precmd"
4052506Simpstart_cmd="syscons_start"
4152506Simpstop_cmd=":"
4286269Simp
4352506Simp# stdin must be redirected because it might be for a serial console
4452506Simp#
4552506Simpkbddev=/dev/ttyv0
46119213Simpviddev=/dev/ttyv0
4758545Simp
4852506Simp_sc_config=
4965039Simp_sc_console=
5065039Simp_sc_initdone=
5152506Simp_sc_keymap_msg=
52118063Simpsc_init()
5352506Simp{
5452506Simp	if [ -z "${_sc_initdone}" ]; then
5552506Simp		if [ -z "${_sc_console}" ]; then
5652506Simp			if [ x`sysctl -n kern.vty` = x"vt" ]; then
5758545Simp				_sc_console="vt"
5852506Simp			else
5986455Simp				_sc_console="syscons"
6079270Simp			fi
61107359Snon			_sc_config="${_sc_console}"
6252506Simp		fi
6386269Simp		echo -n "Configuring ${_sc_config}:"
6486455Simp		_sc_initdone=yes
65119225Simp	fi
6652506Simp}
6786455Simp
6858545Simp# syscons to vt migration helper
69104854Simplookup_keymap_for_vt()
7086269Simp{
71104854Simp	keymap=`basename $1 .kbd`
7252506Simp	case $keymap in
7386455Simphy.armscii-8)			echo am;;
7452506Simpbe.iso.acc)			echo be.acc;;
7586455Simpbe.iso)				echo be;;
7653813Simpbg.bds.ctrlcaps)		echo bg.bds;;
77100213Simpbg.phonetic.ctrlcaps)		echo bg.phonetic;;
7858545Simpbr275.iso.acc)			echo br;;
7989945Simpbr275.*)			echo br.noacc;;
8084514Simpby.*)				echo by;;
8158545Simpfr_CA.iso.acc)			echo ca-fr;;
82119234Simpswissgerman.macbook.acc)	echo ch.macbook.acc;;
8369138Speterswissgerman.iso.acc)		echo ch.acc;;
84118634Simpswissgerman.*)			echo ch;;
8552506Simpswissfrench.iso.acc)		echo ch-fr.acc;;
8658545Simpswissfrench.*)			echo ch-fr;;
8752506Simpce.iso2)			echo centraleuropean.qwerty;;
8853813Simpcolemak.iso15.acc)		echo colemak.acc;;
8965039Simpcs.*|cz.*)			echo cz;;
9071279Simpgerman.iso.acc)			echo de.acc;;
9158545Simpgerman.*)			echo de;;
9265039Simpdanish.iso.acc)			echo dk.acc;;
9392471Simpdanish.iso.macbook)		echo dk.macbook;;
94116207Simpdanish.*)			echo dk;;
9584514Simpestonian.*)			echo ee;;
9679270Simpspanish.dvorak)			echo es.dvorak;;
97119231Simpspanish.iso*.acc)		echo es.acc;;
9879270Simpspanish.iso)			echo es;;
99117438Simpfinnish.*)			echo fi;;
100117602Simpfr.macbook.acc)			echo fr.macbook;;
101118895Simpfr.iso.acc)			echo fr.acc;;
102119240Simpfr.iso)				echo fr;;
103119240Simpel.iso07)			echo gr;;
104119240Simpgr.us101.acc)			echo gr.101.acc;;
105119240Simphr.iso)				echo hr;;
10693620Simphu.iso2.101keys)		echo hu.101;;
10786455Simphu.iso2.102keys)		echo hu.102;;
108119240Simpiw.iso8)			echo il;;
109119240Simpicelandic.iso.acc)		echo is.acc;;
110119240Simpicelandic.iso)			echo is;;
111119240Simpit.iso)				echo it;;
112119240Simpjp.106x)			echo jp.capsctrl;;
113119240Simpjp.106)				echo jp;;
114119240Simp#?? jp.pc98.iso)		echo jp.pc98;;
115119240Simpkk.pt154.io)			echo kz.io;;
116119240Simpkk.pt154.kst)			echo kz.kst;;
117119240Simplatinamerican.iso.acc)		echo latinamerican.acc;;
118119240Simplt.iso4)			echo lt;;
119119240Simpnorwegian.iso)			echo no;;
120119240Simpnorwegian.dvorak)		echo no.dvorak;;
12186455Simpdutch.iso.acc)			echo nl;;
122104854Simpeee_nordic)			echo nordic.asus-eee;;
12394461Simppl_PL.dvorak)			echo pl.dvorak;;
124117614Simppl_PL.ISO8859-2)		echo pl;;
12586455Simppt.iso.acc)			echo pt.acc;;
12686455Simppt.iso)				echo pt;;
12789945Simpru.koi8-r.shift)		echo ru.shift;;
12853813Simpru.koi8-r.win)			echo ru.win;;
12971279Simpru.*)				echo ru;;
13071283Simpswedish.*)			echo se;;
131113667Ssanpeisi.iso)				echo si;;
13253813Simpsk.iso2)			echo sk;;
13352506Simptr.iso9.q)			echo tr;;
13452506Simpua.koi8-u.shift.alt)		echo ua.shift.alt;;
135107359Snonua.*)				echo ua;;
13671283Simpuk.*-ctrl)			echo uk.capsctrl;;
13752506Simpuk.dvorak)			echo uk.dvorak;;
13852506Simpuk.*)				echo uk;;
13986269Simpus.iso.acc)			echo us.acc;;
14086269Simpus.pc-ctrl)			echo us.ctrl;;
14152506Simpus.iso)				echo us;;
14253813Simp    esac
14352506Simp}
14465039Simp
14586269Simpkbdcontrol_load_keymap()
14686269Simp{
14786269Simp	errmsg=`kbdcontrol < ${kbddev} -l ${keymap} 2>&1`
14886269Simp	if [ -n "${errmsg}" -a "${_sc_console}" = "vt" ]; then
14952506Simp		_sc_keymap_msg="${errmsg}"
15052506Simp		keymap_vt=`lookup_keymap_for_vt ${keymap}`
15152506Simp		if [ -n "${keymap_vt}" ]; then
15293893Simp			errmsg=`kbdcontrol < ${kbddev} -l ${keymap_vt} 2>&1`
15386455Simp			if [ -z "${errmsg}" ]; then
15484514Simp		    		_sc_keymap_msg="New keymap: In /etc/rc.conf replace 'keymap=${keymap}' by 'keymap=${keymap_vt}'"
15552506Simp			fi
156104854Simp		else
157104854Simp			_sc_keymap_msg="No replacement found for keymap '${keymap}'.
15894461SimpYou may try to convert your keymap file using 'convert-keymap.pl', which is
15986269Simppart of the system sources and located in /usr/src/tools/tools/vt/keymaps/"
16086269Simp		fi
16186269Simp	fi
16286269Simp}
16386269Simp
16486269Simp# helper
16586269Simpsyscons_configure_keyboard()
16686269Simp{
16786269Simp	# keymap
168117614Simp	#
169117614Simp	case ${keymap} in
170117614Simp	NO | '')
17186269Simp		;;
17286269Simp	*)
17386269Simp		sc_init
17486455Simp		echo -n ' keymap';	kbdcontrol_load_keymap
17586455Simp		;;
17686455Simp	esac
177116207Simp
178116207Simp	# keyrate
179116207Simp	#
180117438Simp	case ${keyrate} in
181117445Ssimokawa	[Nn][Oo] | '')
182117438Simp		;;
18386269Simp	*)
18486269Simp		sc_init
18586269Simp		echo -n ' keyrate';	kbdcontrol < ${kbddev} -r ${keyrate}
18686269Simp		;;
187104854Simp	esac
18886269Simp
18987757Simp	# keybell
19087757Simp	#
19187757Simp	case ${keybell} in
19286455Simp	[Nn][Oo] | '')
19386455Simp		;;
19486455Simp	*)
195119231Simp		sc_init
196119231Simp		echo -n ' keybell';	kbdcontrol < ${kbddev} -b ${keybell}
197119231Simp		;;
198119231Simp	esac
199119231Simp
20086269Simp	# change function keys
201117759Simp	#
20286269Simp	case ${keychange} in
203109455Sshiba	[Nn][Oo] | '')
204104854Simp		;;
20587044Simp	*)
20686269Simp		sc_init
20765039Simp		echo -n ' keychange'
20886269Simp		set -- ${keychange}
20965039Simp		while [ $# -gt 0 ]; do
21065039Simp			kbdcontrol <${kbddev} -f "$1" "$2"
21152506Simp			shift; shift
21286455Simp		done
21352506Simp		;;
21452506Simp	esac
21586269Simp
21686269Simp	# set this keyboard mode for all virtual terminals
21786269Simp	#
21853813Simp	if [ -n "${allscreens_kbdflags}" ]; then
21952506Simp		sc_init
22052506Simp		echo -n ' allscreens_kbd'
22152506Simp		for ttyv in /dev/ttyv*; do
22252506Simp			kbdcontrol ${allscreens_kbdflags} < ${ttyv} > ${ttyv} 2>&1
22352506Simp		done
22452506Simp	fi
22552506Simp}
22679270Simp
22779270Simpsyscons_setkeyboard()
22879270Simp{
229119225Simp	kbd=$1
230119225Simp
231119225Simp	if [ -z "${kbd}" ]; then
232119225Simp		return 1
23386455Simp	fi
23486455Simp
23586455Simp	# Check if the kbdmux(4) is the current active keyboard
23689945Simp	kbdcontrol -i < ${kbddev} | grep kbdmux > /dev/null 2>&1
23789945Simp	if [ $? -ne 0 ]; then
23889945Simp		kbdcontrol -k ${kbd} < ${kbddev} > /dev/null 2>&1
23971279Simp	fi
24071279Simp
24171279Simp	_sc_config="keyboard"
24286269Simp	syscons_configure_keyboard
243100213Simp
24471279Simp	# Terminate keyboard configuration line and reset global variables.
24586269Simp	#
24686269Simp	if [ -n "${_sc_initdone}" ]; then
24786269Simp		echo '.'
24889945Simp		_sc_config="${_sc_console}"
24989945Simp		_sc_initdone=
25089945Simp	fi
25186269Simp}
25286269Simp
25386269Simpsyscons_precmd()
25452506Simp{
25552506Simp	if [ ! -c $kbddev ]
25686269Simp	then
25753813Simp		return 1
25853813Simp	fi
259100213Simp	return 0
260100213Simp}
261100213Simp
26292471Simpsyscons_start()
26392471Simp{
26492471Simp	# keyboard
26552506Simp	#
26671279Simp	if [ -n "${keyboard}" ]; then
26765039Simp		syscons_setkeyboard ${keyboard}
26865039Simp	fi
26965039Simp
27065039Simp	syscons_configure_keyboard
27187044Simp
27265039Simp	# cursor type
27352506Simp	#
27465039Simp	case ${cursor} in
27589103Simp	[Nn][Oo] | '')
27653813Simp		;;
27752506Simp	*)
27865039Simp		sc_init
27986269Simp		echo -n ' cursor';	vidcontrol < ${viddev} -c ${cursor}
28065039Simp		;;
28165039Simp	esac
282119213Simp
283119213Simp	# screen mapping
284119213Simp	#
285119213Simp	case ${scrnmap} in
28652506Simp	[Nn][Oo] | '')
28753813Simp		;;
28879270Simp	*)
289117764Simp		sc_init
29052506Simp		echo -n ' scrnmap';	vidcontrol < ${viddev} -l ${scrnmap}
29186269Simp		;;
29286269Simp	esac
29365039Simp
29486269Simp	# font 8x16
29586269Simp	#
29686269Simp	case ${font8x16} in
29758545Simp	[Nn][Oo] | '')
29871279Simp		;;
29958545Simp	*)
30052506Simp		sc_init
30186269Simp		echo -n ' font8x16';	vidcontrol < ${viddev} -f 8x16 ${font8x16}
30258545Simp		;;
30352506Simp	esac
30452506Simp
30552506Simp	# font 8x14
30686269Simp	#
30786269Simp	case ${font8x14} in
30886269Simp	[Nn][Oo] | '')
30986269Simp		;;
31086269Simp	*)
311107359Snon		sc_init
31286269Simp		echo -n ' font8x14';	vidcontrol < ${viddev} -f 8x14 ${font8x14}
31352506Simp		;;
31486269Simp	esac
31552506Simp
31653813Simp	# font 8x8
31752506Simp	#
31852506Simp	case ${font8x8} in
31958545Simp	[Nn][Oo] | '')
32058545Simp		;;
321118895Simp	*)
32258545Simp		sc_init
323118895Simp		echo -n ' font8x8';	vidcontrol < ${viddev} -f 8x8 ${font8x8}
324118895Simp		;;
325118895Simp	esac
32686269Simp
32786269Simp	# blank time
32886269Simp	#
32986455Simp	case ${blanktime} in
33086269Simp	[Nn][Oo] | '')
33186269Simp		;;
33286269Simp	*)
33386455Simp		sc_init
33486455Simp		echo -n ' blanktime';	vidcontrol < ${viddev} -t ${blanktime}
33586455Simp		;;
336104831Simp	esac
337106891Simp
338106891Simp	# screen saver
33986455Simp	#
34086455Simp	case ${saver} in
34186269Simp	[Nn][Oo] | '')
34286455Simp		;;
343104854Simp	*)
34486455Simp		sc_init
34593620Simp		echo -n ' screensaver'
34686455Simp		for i in `kldstat | awk '$5 ~ "_saver\.ko$" { print $5 }'`; do
34779270Simp			kldunload ${i}
34879270Simp		done
34979270Simp		load_kld -e _saver ${saver}_saver
35058545Simp		;;
351100213Simp	esac
35258545Simp
35358545Simp	# set this mode for all virtual screens
35493620Simp	#
35593620Simp	if [ -n "${allscreens_flags}" ]; then
35693620Simp		sc_init
35793620Simp		echo -n ' allscreens'
35865039Simp		for ttyv in /dev/ttyv*; do
35965039Simp			vidcontrol ${allscreens_flags} < ${ttyv} > ${ttyv} 2>&1
36065039Simp		done
361104854Simp	fi
362104854Simp
363104854Simp	[ -n "${_sc_initdone}" ] && echo '.'
36458545Simp	if [ -n "${_sc_keymap_msg}" ]; then
36558545Simp		echo
36665039Simp		echo "WARNING:"
367107359Snon		echo "${_sc_keymap_msg}."
36886269Simp		echo
36986455Simp	fi
37058545Simp}
371104831Simp
372104854Simpload_rc_config $name
373104831Simprun_rc_command $*
37486455Simp
375120275Simp