syscons revision 271958
1290650Shselasky#!/bin/sh -
2347819Shselasky#
3290650Shselasky# Copyright (c) 2000  The FreeBSD Project
4290650Shselasky# All rights reserved.
5290650Shselasky#
6290650Shselasky# Redistribution and use in source and binary forms, with or without
7290650Shselasky# modification, are permitted provided that the following conditions
8290650Shselasky# are met:
9290650Shselasky# 1. Redistributions of source code must retain the above copyright
10290650Shselasky#    notice, this list of conditions and the following disclaimer.
11290650Shselasky# 2. Redistributions in binary form must reproduce the above copyright
12290650Shselasky#    notice, this list of conditions and the following disclaimer in the
13290650Shselasky#    documentation and/or other materials provided with the distribution.
14290650Shselasky#
15290650Shselasky# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
16290650Shselasky# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17290650Shselasky# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18290650Shselasky# ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
19290650Shselasky# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
20290650Shselasky# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
21290650Shselasky# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
22290650Shselasky# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
23290650Shselasky# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
24290650Shselasky# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
25290650Shselasky# SUCH DAMAGE.
26290650Shselasky#
27290650Shselasky# $FreeBSD: head/etc/rc.d/syscons 271958 2014-09-22 11:54:13Z se $
28290650Shselasky#
29290650Shselasky
30290650Shselasky# PROVIDE: syscons
31290650Shselasky# REQUIRE: LOGIN
32290650Shselasky# KEYWORD: nojail
33290650Shselasky
34290650Shselasky. /etc/rc.subr
35290650Shselasky
36347802Shselaskyname="syscons"
37290650Shselaskyextra_commands="setkeyboard"
38290650Shselaskysetkeyboard_cmd="syscons_setkeyboard"
39290650Shselaskystart_precmd="syscons_precmd"
40290650Shselaskystart_cmd="syscons_start"
41290650Shselaskystop_cmd=":"
42290650Shselasky
43341958Shselasky# stdin must be redirected because it might be for a serial console
44341958Shselasky#
45290650Shselaskykbddev=/dev/ttyv0
46329200Shselaskyviddev=/dev/ttyv0
47290650Shselasky
48341948Shselasky_sc_config=
49341948Shselasky_sc_console=
50290650Shselasky_sc_initdone=
51290650Shselasky_sc_keymap_msg=
52290650Shselaskysc_init()
53290650Shselasky{
54347839Shselasky	if [ -z "${_sc_initdone}" ]; then
55347847Shselasky		if [ -z "${_sc_console}" ]; then
56290650Shselasky			if [ x`sysctl -n kern.vty` = x"vt" ]; then
57290650Shselasky				_sc_console="vt"
58347835Shselasky			else
59347835Shselasky				_sc_console="syscons"
60290650Shselasky			fi
61347835Shselasky			_sc_config="${_sc_console}"
62347835Shselasky		fi
63347835Shselasky		echo -n "Configuring ${_sc_config}:"
64290650Shselasky		_sc_initdone=yes
65290650Shselasky	fi
66347835Shselasky}
67347835Shselasky
68347835Shselasky# syscons to vt migration helper
69347835Shselaskylookup_keymap_for_vt()
70290650Shselasky{
71347819Shselasky	keymap=`basename $1 .kbd`
72347819Shselasky	case $keymap in
73347819Shselaskyhy.armscii-8)			echo am;;
74347819Shselaskybe.iso.acc)			echo be.acc;;
75347819Shselaskybe.iso)				echo be;;
76290650Shselaskybg.bds.ctrlcaps)		echo bg.bds;;
77290650Shselaskybg.phonetic.ctrlcaps)		echo bg.phonetic;;
78290650Shselaskybr275.iso.acc)			echo br;;
79290650Shselaskybr275.*)			echo br.noacc;;
80290650Shselaskyby.*)				echo by;;
81290650Shselaskyfr_CA.iso.acc)			echo ca-fr;;
82290650Shselaskyswissgerman.macbook.acc)	echo ch.macbook.acc;;
83290650Shselaskyswissgerman.iso.acc)		echo ch.acc;;
84290650Shselaskyswissgerman.*)			echo ch;;
85290650Shselaskyswissfrench.iso.acc)		echo ch-fr.acc;;
86290650Shselaskyswissfrench.*)			echo ch-fr;;
87290650Shselaskyce.iso2)			echo centraleuropean.qwerty;;
88329209Shselaskycolemak.iso15.acc)		echo colemak.acc;;
89329209Shselaskycs.*|cz.*)			echo cz;;
90329209Shselaskygerman.iso.acc)			echo de.acc;;
91329209Shselaskygerman.*)			echo de;;
92329209Shselaskydanish.iso.acc)			echo dk.acc;;
93290650Shselaskydanish.iso.macbook)		echo dk.macbook;;
94290650Shselaskydanish.*)			echo dk;;
95290650Shselaskyestonian.*)			echo ee;;
96290650Shselaskyspanish.dvorak)			echo es.dvorak;;
97290650Shselaskyspanish.iso*.acc)		echo es.acc;;
98290650Shselaskyspanish.iso)			echo es;;
99290650Shselaskyfinnish.*)			echo fi;;
100290650Shselaskyfr.macbook.acc)			echo fr.macbook;;
101290650Shselaskyfr.iso.acc)			echo fr.acc;;
102290650Shselaskyfr.iso)				echo fr;;
103290650Shselaskyel.iso07)			echo gr;;
104290650Shselaskygr.us101.acc)			echo gr.101.acc;;
105290650Shselaskyhr.iso)				echo hr;;
106290650Shselaskyhu.iso2.101keys)		echo hu.101;;
107290650Shselaskyhu.iso2.102keys)		echo hu.102;;
108290650Shselaskyiw.iso8)			echo il;;
109290650Shselaskyicelandic.iso.acc)		echo is.acc;;
110290650Shselaskyicelandic.iso)			echo is;;
111290650Shselaskyit.iso)				echo it;;
112290650Shselaskyjp.106x)			echo jp.capsctrl;;
113290650Shselaskyjp.106)				echo jp;;
114290650Shselasky#?? jp.pc98.iso)		echo jp.pc98;;
115290650Shselaskykk.pt154.io)			echo kz.io;;
116290650Shselaskykk.pt154.kst)			echo kz.kst;;
117290650Shselaskylatinamerican.iso.acc)		echo latinamerican.acc;;
118290650Shselaskylt.iso4)			echo lt;;
119290650Shselaskynorwegian.iso)			echo no;;
120290650Shselaskynorwegian.dvorak)		echo no.dvorak;;
121290650Shselaskydutch.iso.acc)			echo nl;;
122290650Shselaskyeee_nordic)			echo nordic.asus-eee;;
123290650Shselaskypl_PL.dvorak)			echo pl.dvorak;;
124290650Shselaskypl_PL.ISO8859-2)		echo pl;;
125290650Shselaskypt.iso.acc)			echo pt.acc;;
126290650Shselaskypt.iso)				echo pt;;
127290650Shselaskyru.koi8-r.shift)		echo ru.shift;;
128290650Shselaskyru.koi8-r.win)			echo ru.win;;
129290650Shselaskyru.*)				echo ru;;
130290650Shselaskyswedish.*)			echo se;;
131290650Shselaskysi.iso)				echo si;;
132290650Shselaskysk.iso2)			echo sk;;
133290650Shselaskytr.iso9.q)			echo tr;;
134290650Shselaskyua.koi8-u.shift.alt)		echo ua.shift.alt;;
135290650Shselaskyua.*)				echo ua;;
136290650Shselaskyuk.*-ctrl)			echo uk.capsctrl;;
137290650Shselaskyuk.dvorak)			echo uk.dvorak;;
138290650Shselaskyuk.*)				echo uk;;
139290650Shselaskyus.iso.acc)			echo us.acc;;
140290650Shselaskyus.pc-ctrl)			echo us.ctrl;;
141290650Shselaskyus.iso)				echo us;;
142290650Shselasky    esac
143290650Shselasky}
144290650Shselasky
145290650Shselaskykbdcontrol_load_keymap()
146290650Shselasky{
147290650Shselasky	errmsg=`kbdcontrol < ${kbddev} -l ${keymap} 2>&1`
148290650Shselasky	if [ -n "${errmsg}" -a "${_sc_console}" = "vt" ]; then
149290650Shselasky		_sc_keymap_msg="${errmsg}"
150290650Shselasky		keymap_vt=`lookup_keymap_for_vt ${keymap}`
151290650Shselasky		if [ -n "${keymap_vt}" ]; then
152290650Shselasky			errmsg=`kbdcontrol < ${kbddev} -l ${keymap_vt} 2>&1`
153290650Shselasky			if [ -z "${errmsg}" ]; then
154290650Shselasky		    		_sc_keymap_msg="New keymap: In /etc/rc.conf replace 'keymap=${keymap}' by 'keymap=${keymap_vt}'"
155290650Shselasky			fi
156290650Shselasky		else
157290650Shselasky			_sc_keymap_msg="No replacement found for keymap '${keymap}'.
158290650ShselaskyYou may try to convert your keymap file using 'convert-keymap.pl', which is
159290650Shselaskypart of the system sources and located in /usr/src/tools/tools/vt/keymaps/"
160290650Shselasky		fi
161290650Shselasky	fi
162290650Shselasky}
163290650Shselasky
164290650Shselasky# helper
165290650Shselaskysyscons_configure_keyboard()
166290650Shselasky{
167290650Shselasky	# keymap
168290650Shselasky	#
169290650Shselasky	case ${keymap} in
170290650Shselasky	NO | '')
171290650Shselasky		;;
172290650Shselasky	*)
173290650Shselasky		sc_init
174290650Shselasky		echo -n ' keymap';	kbdcontrol_load_keymap
175290650Shselasky		;;
176290650Shselasky	esac
177290650Shselasky
178290650Shselasky	# keyrate
179290650Shselasky	#
180290650Shselasky	case ${keyrate} in
181290650Shselasky	[Nn][Oo] | '')
182290650Shselasky		;;
183290650Shselasky	*)
184290650Shselasky		sc_init
185290650Shselasky		echo -n ' keyrate';	kbdcontrol < ${kbddev} -r ${keyrate}
186290650Shselasky		;;
187290650Shselasky	esac
188290650Shselasky
189290650Shselasky	# keybell
190290650Shselasky	#
191290650Shselasky	case ${keybell} in
192290650Shselasky	[Nn][Oo] | '')
193290650Shselasky		;;
194290650Shselasky	*)
195290650Shselasky		sc_init
196290650Shselasky		echo -n ' keybell';	kbdcontrol < ${kbddev} -b ${keybell}
197290650Shselasky		;;
198290650Shselasky	esac
199290650Shselasky
200347862Shselasky	# change function keys
201347862Shselasky	#
202347862Shselasky	case ${keychange} in
203347862Shselasky	[Nn][Oo] | '')
204347862Shselasky		;;
205347862Shselasky	*)
206347862Shselasky		sc_init
207347862Shselasky		echo -n ' keychange'
208347862Shselasky		set -- ${keychange}
209347862Shselasky		while [ $# -gt 0 ]; do
210347862Shselasky			kbdcontrol <${kbddev} -f "$1" "$2"
211347862Shselasky			shift; shift
212347862Shselasky		done
213347862Shselasky		;;
214347862Shselasky	esac
215331580Shselasky
216331580Shselasky	# set this keyboard mode for all virtual terminals
217331580Shselasky	#
218331580Shselasky	if [ -n "${allscreens_kbdflags}" ]; then
219331580Shselasky		sc_init
220331580Shselasky		echo -n ' allscreens_kbd'
221331580Shselasky		for ttyv in /dev/ttyv*; do
222331580Shselasky			kbdcontrol ${allscreens_kbdflags} < ${ttyv} > ${ttyv} 2>&1
223331580Shselasky		done
224331580Shselasky	fi
225331580Shselasky}
226331580Shselasky
227331580Shselaskysyscons_setkeyboard()
228331580Shselasky{
229331580Shselasky	kbd=$1
230331580Shselasky
231331580Shselasky	if [ -z "${kbd}" ]; then
232331580Shselasky		return 1
233331580Shselasky	fi
234331580Shselasky
235331580Shselasky	# Check if the kbdmux(4) is the current active keyboard
236331580Shselasky	kbdcontrol -i < ${kbddev} | grep kbdmux > /dev/null 2>&1
237331580Shselasky	if [ $? -ne 0 ]; then
238331580Shselasky		kbdcontrol -k ${kbd} < ${kbddev} > /dev/null 2>&1
239331580Shselasky	fi
240331580Shselasky
241331580Shselasky	_sc_config="keyboard"
242331580Shselasky	syscons_configure_keyboard
243290650Shselasky
244290650Shselasky	# Terminate keyboard configuration line and reset global variables.
245290650Shselasky	#
246290650Shselasky	if [ -n "${_sc_initdone}" ]; then
247290650Shselasky		echo '.'
248290650Shselasky		_sc_config="${_sc_console}"
249290650Shselasky		_sc_initdone=
250290650Shselasky	fi
251290650Shselasky}
252290650Shselasky
253290650Shselaskysyscons_precmd()
254290650Shselasky{
255290650Shselasky	if [ ! -c $kbddev ]
256290650Shselasky	then
257290650Shselasky		return 1
258290650Shselasky	fi
259290650Shselasky	return 0
260290650Shselasky}
261290650Shselasky
262290650Shselaskysyscons_start()
263290650Shselasky{
264290650Shselasky	# keyboard
265290650Shselasky	#
266290650Shselasky	if [ -n "${keyboard}" ]; then
267290650Shselasky		syscons_setkeyboard ${keyboard}
268290650Shselasky	fi
269338554Shselasky
270337112Shselasky	syscons_configure_keyboard
271290650Shselasky
272290650Shselasky	# cursor type
273337112Shselasky	#
274337112Shselasky	case ${cursor} in
275337112Shselasky	[Nn][Oo] | '')
276337112Shselasky		;;
277337112Shselasky	*)
278353189Shselasky		sc_init
279353189Shselasky		echo -n ' cursor';	vidcontrol < ${viddev} -c ${cursor}
280353189Shselasky		;;
281353189Shselasky	esac
282290650Shselasky
283290650Shselasky	# screen mapping
284290650Shselasky	#
285290650Shselasky	case ${scrnmap} in
286290650Shselasky	[Nn][Oo] | '')
287290650Shselasky		;;
288290650Shselasky	*)
289290650Shselasky		sc_init
290290650Shselasky		echo -n ' scrnmap';	vidcontrol < ${viddev} -l ${scrnmap}
291290650Shselasky		;;
292290650Shselasky	esac
293290650Shselasky
294290650Shselasky	# font 8x16
295290650Shselasky	#
296290650Shselasky	case ${font8x16} in
297290650Shselasky	[Nn][Oo] | '')
298290650Shselasky		;;
299290650Shselasky	*)
300290650Shselasky		sc_init
301290650Shselasky		echo -n ' font8x16';	vidcontrol < ${viddev} -f 8x16 ${font8x16}
302290650Shselasky		;;
303290650Shselasky	esac
304290650Shselasky
305290650Shselasky	# font 8x14
306290650Shselasky	#
307290650Shselasky	case ${font8x14} in
308290650Shselasky	[Nn][Oo] | '')
309290650Shselasky		;;
310290650Shselasky	*)
311290650Shselasky		sc_init
312290650Shselasky		echo -n ' font8x14';	vidcontrol < ${viddev} -f 8x14 ${font8x14}
313290650Shselasky		;;
314290650Shselasky	esac
315290650Shselasky
316290650Shselasky	# font 8x8
317290650Shselasky	#
318290650Shselasky	case ${font8x8} in
319290650Shselasky	[Nn][Oo] | '')
320290650Shselasky		;;
321290650Shselasky	*)
322306233Shselasky		sc_init
323306233Shselasky		echo -n ' font8x8';	vidcontrol < ${viddev} -f 8x8 ${font8x8}
324290650Shselasky		;;
325290650Shselasky	esac
326290650Shselasky
327290650Shselasky	# blank time
328290650Shselasky	#
329290650Shselasky	case ${blanktime} in
330290650Shselasky	[Nn][Oo] | '')
331290650Shselasky		;;
332290650Shselasky	*)
333290650Shselasky		sc_init
334290650Shselasky		echo -n ' blanktime';	vidcontrol < ${viddev} -t ${blanktime}
335290650Shselasky		;;
336290650Shselasky	esac
337290650Shselasky
338290650Shselasky	# screen saver
339290650Shselasky	#
340290650Shselasky	case ${saver} in
341290650Shselasky	[Nn][Oo] | '')
342290650Shselasky		;;
343290650Shselasky	*)
344290650Shselasky		sc_init
345290650Shselasky		echo -n ' screensaver'
346290650Shselasky		for i in `kldstat | awk '$5 ~ "_saver\.ko$" { print $5 }'`; do
347331807Shselasky			kldunload ${i}
348331807Shselasky		done
349331807Shselasky		load_kld -e _saver ${saver}_saver
350290650Shselasky		;;
351290650Shselasky	esac
352290650Shselasky
353290650Shselasky	# set this mode for all virtual screens
354290650Shselasky	#
355290650Shselasky	if [ -n "${allscreens_flags}" ]; then
356290650Shselasky		sc_init
357290650Shselasky		echo -n ' allscreens'
358290650Shselasky		for ttyv in /dev/ttyv*; do
359290650Shselasky			vidcontrol ${allscreens_flags} < ${ttyv} > ${ttyv} 2>&1
360290650Shselasky		done
361290650Shselasky	fi
362290650Shselasky
363290650Shselasky	[ -n "${_sc_initdone}" ] && echo '.'
364290650Shselasky	if [ -n "${_sc_keymap_msg}" ]; then
365290650Shselasky		echo
366290650Shselasky		echo "WARNING:"
367290650Shselasky		echo "${_sc_keymap_msg}."
368290650Shselasky		echo
369290650Shselasky	fi
370290650Shselasky}
371290650Shselasky
372290650Shselaskyload_rc_config $name
373290650Shselaskyrun_rc_command $*
374290650Shselasky
375290650Shselasky