syscons revision 274059
170856Sjhb#!/bin/sh -
270856Sjhb#
370856Sjhb# Copyright (c) 2000  The FreeBSD Project
470856Sjhb# All rights reserved.
570856Sjhb#
670856Sjhb# Redistribution and use in source and binary forms, with or without
770856Sjhb# modification, are permitted provided that the following conditions
870856Sjhb# are met:
970856Sjhb# 1. Redistributions of source code must retain the above copyright
1070856Sjhb#    notice, this list of conditions and the following disclaimer.
1170856Sjhb# 2. Redistributions in binary form must reproduce the above copyright
1270856Sjhb#    notice, this list of conditions and the following disclaimer in the
1370856Sjhb#    documentation and/or other materials provided with the distribution.
1470856Sjhb#
1570856Sjhb# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
1670856Sjhb# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
1770856Sjhb# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
1870856Sjhb# ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
1970856Sjhb# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
2070856Sjhb# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
2170856Sjhb# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
2270856Sjhb# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
2370856Sjhb# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
2470856Sjhb# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
2570856Sjhb# SUCH DAMAGE.
2670856Sjhb#
2770856Sjhb# $FreeBSD: head/etc/rc.d/syscons 274059 2014-11-03 19:23:49Z jmg $
2870856Sjhb#
2970856Sjhb
30100280Sgordon# PROVIDE: syscons
31153430Siedowse# REQUIRE: LOGIN
32136224Smtm# KEYWORD: nojail
33100280Sgordon
34100280Sgordon. /etc/rc.subr
35100280Sgordon
36100280Sgordonname="syscons"
37156331Semaxextra_commands="setkeyboard"
38156331Semaxsetkeyboard_cmd="syscons_setkeyboard"
39102993Sfennerstart_precmd="syscons_precmd"
40102993Sfennerstart_cmd="syscons_start"
41165389Syarstop_cmd=":"
42100280Sgordon
4370856Sjhb# stdin must be redirected because it might be for a serial console
4470856Sjhb#
4570856Sjhbkbddev=/dev/ttyv0
4670856Sjhbviddev=/dev/ttyv0
4770856Sjhb
48270935Sse_sc_config=
49270935Sse_sc_console=
50179981Smtm_sc_initdone=
51270935Sse_sc_keymap_msg=
52179981Smtmsc_init()
53179981Smtm{
54179981Smtm	if [ -z "${_sc_initdone}" ]; then
55270935Sse		if [ -z "${_sc_console}" ]; then
56270935Sse			if [ x`sysctl -n kern.vty` = x"vt" ]; then
57270935Sse				_sc_console="vt"
58270935Sse			else
59270935Sse				_sc_console="syscons"
60270935Sse			fi
61270935Sse			_sc_config="${_sc_console}"
62270935Sse		fi
63179981Smtm		echo -n "Configuring ${_sc_config}:"
64179981Smtm		_sc_initdone=yes
65179981Smtm	fi
66179981Smtm}
67179981Smtm
68270935Sse# syscons to vt migration helper
69270935Sselookup_keymap_for_vt()
70270935Sse{
71270935Sse	keymap=`basename $1 .kbd`
72270935Sse	case $keymap in
73270935Ssehy.armscii-8)			echo am;;
74270935Ssebe.iso.acc)			echo be.acc;;
75270935Ssebe.iso)				echo be;;
76270935Ssebg.bds.ctrlcaps)		echo bg.bds;;
77270935Ssebg.phonetic.ctrlcaps)		echo bg.phonetic;;
78270935Ssebr275.iso.acc)			echo br;;
79270935Ssebr275.*)			echo br.noacc;;
80270935Sseby.*)				echo by;;
81270935Ssefr_CA.iso.acc)			echo ca-fr;;
82270935Sseswissgerman.macbook.acc)	echo ch.macbook.acc;;
83270935Sseswissgerman.iso.acc)		echo ch.acc;;
84270935Sseswissgerman.*)			echo ch;;
85270935Sseswissfrench.iso.acc)		echo ch-fr.acc;;
86270935Sseswissfrench.*)			echo ch-fr;;
87270935Ssece.iso2)			echo centraleuropean.qwerty;;
88270935Ssecolemak.iso15.acc)		echo colemak.acc;;
89270935Ssecs.*|cz.*)			echo cz;;
90270935Ssegerman.iso.acc)			echo de.acc;;
91270935Ssegerman.*)			echo de;;
92270935Ssedanish.iso.acc)			echo dk.acc;;
93270935Ssedanish.iso.macbook)		echo dk.macbook;;
94270935Ssedanish.*)			echo dk;;
95270935Sseestonian.*)			echo ee;;
96270935Ssespanish.dvorak)			echo es.dvorak;;
97270935Ssespanish.iso*.acc)		echo es.acc;;
98270935Ssespanish.iso)			echo es;;
99270935Ssefinnish.*)			echo fi;;
100270935Ssefr.macbook.acc)			echo fr.macbook;;
101270935Ssefr.iso.acc)			echo fr.acc;;
102270935Ssefr.iso)				echo fr;;
103270935Sseel.iso07)			echo gr;;
104270935Ssegr.us101.acc)			echo gr.101.acc;;
105270935Ssehr.iso)				echo hr;;
106270935Ssehu.iso2.101keys)		echo hu.101;;
107270935Ssehu.iso2.102keys)		echo hu.102;;
108270935Sseiw.iso8)			echo il;;
109270935Sseicelandic.iso.acc)		echo is.acc;;
110270935Sseicelandic.iso)			echo is;;
111270935Sseit.iso)				echo it;;
112270935Ssejp.106x)			echo jp.capsctrl;;
113270935Ssejp.106)				echo jp;;
114270935Sse#?? jp.pc98.iso)		echo jp.pc98;;
115270935Ssekk.pt154.io)			echo kz.io;;
116270935Ssekk.pt154.kst)			echo kz.kst;;
117270935Sselatinamerican.iso.acc)		echo latinamerican.acc;;
118270935Sselt.iso4)			echo lt;;
119270935Ssenorwegian.iso)			echo no;;
120270935Ssenorwegian.dvorak)		echo no.dvorak;;
121270935Ssedutch.iso.acc)			echo nl;;
122270935Sseeee_nordic)			echo nordic.asus-eee;;
123270935Ssepl_PL.dvorak)			echo pl.dvorak;;
124270935Ssepl_PL.ISO8859-2)		echo pl;;
125270935Ssept.iso.acc)			echo pt.acc;;
126270935Ssept.iso)				echo pt;;
127270935Sseru.koi8-r.shift)		echo ru.shift;;
128270935Sseru.koi8-r.win)			echo ru.win;;
129270935Sseru.*)				echo ru;;
130270935Sseswedish.*)			echo se;;
131270935Ssesi.iso)				echo si;;
132270935Ssesk.iso2)			echo sk;;
133270935Ssetr.iso9.q)			echo tr;;
134270935Sseua.koi8-u.shift.alt)		echo ua.shift.alt;;
135270935Sseua.*)				echo ua;;
136270935Sseuk.*-ctrl)			echo uk.capsctrl;;
137270935Sseuk.dvorak)			echo uk.dvorak;;
138270935Sseuk.*)				echo uk;;
139270935Sseus.iso.acc)			echo us.acc;;
140270935Sseus.pc-ctrl)			echo us.ctrl;;
141270935Sseus.iso)				echo us;;
142274059Sjmg	esac
143270935Sse}
144270935Sse
145270935Ssekbdcontrol_load_keymap()
146270935Sse{
147270935Sse	errmsg=`kbdcontrol < ${kbddev} -l ${keymap} 2>&1`
148270935Sse	if [ -n "${errmsg}" -a "${_sc_console}" = "vt" ]; then
149270935Sse		_sc_keymap_msg="${errmsg}"
150270935Sse		keymap_vt=`lookup_keymap_for_vt ${keymap}`
151270935Sse		if [ -n "${keymap_vt}" ]; then
152270935Sse			errmsg=`kbdcontrol < ${kbddev} -l ${keymap_vt} 2>&1`
153270935Sse			if [ -z "${errmsg}" ]; then
154270935Sse		    		_sc_keymap_msg="New keymap: In /etc/rc.conf replace 'keymap=${keymap}' by 'keymap=${keymap_vt}'"
155270935Sse			fi
156270935Sse		else
157270935Sse			_sc_keymap_msg="No replacement found for keymap '${keymap}'.
158270935SseYou may try to convert your keymap file using 'convert-keymap.pl', which is
159270935Ssepart of the system sources and located in /usr/src/tools/tools/vt/keymaps/"
160270935Sse		fi
161270935Sse	fi
162270935Sse}
163270935Sse
164156782Semax# helper
165156782Semaxsyscons_configure_keyboard()
166156331Semax{
167102993Sfenner	# keymap
168102993Sfenner	#
169102993Sfenner	case ${keymap} in
170271958Sse	NO | '')
171102993Sfenner		;;
172102993Sfenner	*)
173179981Smtm		sc_init
174270935Sse		echo -n ' keymap';	kbdcontrol_load_keymap
175102993Sfenner		;;
176102993Sfenner	esac
17770856Sjhb
178102993Sfenner	# keyrate
179102993Sfenner	#
180102993Sfenner	case ${keyrate} in
181102993Sfenner	[Nn][Oo] | '')
182102993Sfenner		;;
183102993Sfenner	*)
184179981Smtm		sc_init
185102993Sfenner		echo -n ' keyrate';	kbdcontrol < ${kbddev} -r ${keyrate}
186102993Sfenner		;;
187102993Sfenner	esac
18870856Sjhb
189102993Sfenner	# keybell
190102993Sfenner	#
191102993Sfenner	case ${keybell} in
192102993Sfenner	[Nn][Oo] | '')
193102993Sfenner		;;
194102993Sfenner	*)
195179981Smtm		sc_init
196102993Sfenner		echo -n ' keybell';	kbdcontrol < ${kbddev} -b ${keybell}
197102993Sfenner		;;
198102993Sfenner	esac
19970856Sjhb
200102993Sfenner	# change function keys
201102993Sfenner	#
202102993Sfenner	case ${keychange} in
203102993Sfenner	[Nn][Oo] | '')
204102993Sfenner		;;
205102993Sfenner	*)
206179981Smtm		sc_init
207102993Sfenner		echo -n ' keychange'
208227366Sjilles		set -- ${keychange}
209102993Sfenner		while [ $# -gt 0 ]; do
210102993Sfenner			kbdcontrol <${kbddev} -f "$1" "$2"
211102993Sfenner			shift; shift
212102993Sfenner		done
213102993Sfenner		;;
214102993Sfenner	esac
21570856Sjhb
216156782Semax	# set this keyboard mode for all virtual terminals
217156782Semax	#
218156782Semax	if [ -n "${allscreens_kbdflags}" ]; then
219179981Smtm		sc_init
220156782Semax		echo -n ' allscreens_kbd'
221156782Semax		for ttyv in /dev/ttyv*; do
222156782Semax			kbdcontrol ${allscreens_kbdflags} < ${ttyv} > ${ttyv} 2>&1
223156782Semax		done
224156782Semax	fi
225156782Semax}
226156782Semax
227156782Semaxsyscons_setkeyboard()
228156782Semax{
229156782Semax	kbd=$1
230208060Sdougb
231156782Semax	if [ -z "${kbd}" ]; then
232156782Semax		return 1
233156782Semax	fi
234156782Semax
235156782Semax	# Check if the kbdmux(4) is the current active keyboard
236156782Semax	kbdcontrol -i < ${kbddev} | grep kbdmux > /dev/null 2>&1
237167889Sbrooks	if [ $? -ne 0 ]; then
238156782Semax		kbdcontrol -k ${kbd} < ${kbddev} > /dev/null 2>&1
239156782Semax	fi
240156782Semax
241179981Smtm	_sc_config="keyboard"
242156782Semax	syscons_configure_keyboard
243179981Smtm
244179981Smtm	# Terminate keyboard configuration line and reset global variables.
245179981Smtm	#
246179981Smtm	if [ -n "${_sc_initdone}" ]; then
247179981Smtm		echo '.'
248270935Sse		_sc_config="${_sc_console}"
249179981Smtm		_sc_initdone=
250179981Smtm	fi
251156782Semax}
252156782Semax
253156782Semaxsyscons_precmd()
254156782Semax{
255156782Semax	if [ ! -c $kbddev ]
256156782Semax	then
257156782Semax		return 1
258156782Semax	fi
259156782Semax	return 0
260156782Semax}
261156782Semax
262156782Semaxsyscons_start()
263156782Semax{
264156782Semax	# keyboard
265156782Semax	#
266156782Semax	if [ -n "${keyboard}" ]; then
267179981Smtm		syscons_setkeyboard ${keyboard}
268156782Semax	fi
269156782Semax
270156782Semax	syscons_configure_keyboard
271156782Semax
272102993Sfenner	# cursor type
273102993Sfenner	#
274102993Sfenner	case ${cursor} in
275102993Sfenner	[Nn][Oo] | '')
276102993Sfenner		;;
277102993Sfenner	*)
278179981Smtm		sc_init
279102993Sfenner		echo -n ' cursor';	vidcontrol < ${viddev} -c ${cursor}
280102993Sfenner		;;
281102993Sfenner	esac
28270856Sjhb
283102993Sfenner	# screen mapping
284102993Sfenner	#
285102993Sfenner	case ${scrnmap} in
286102993Sfenner	[Nn][Oo] | '')
287102993Sfenner		;;
288102993Sfenner	*)
289179981Smtm		sc_init
290102993Sfenner		echo -n ' scrnmap';	vidcontrol < ${viddev} -l ${scrnmap}
291102993Sfenner		;;
292102993Sfenner	esac
29370856Sjhb
294102993Sfenner	# font 8x16
295102993Sfenner	#
296102993Sfenner	case ${font8x16} in
297102993Sfenner	[Nn][Oo] | '')
298102993Sfenner		;;
299102993Sfenner	*)
300179981Smtm		sc_init
301102993Sfenner		echo -n ' font8x16';	vidcontrol < ${viddev} -f 8x16 ${font8x16}
302102993Sfenner		;;
303102993Sfenner	esac
30470856Sjhb
305102993Sfenner	# font 8x14
306102993Sfenner	#
307102993Sfenner	case ${font8x14} in
308102993Sfenner	[Nn][Oo] | '')
309102993Sfenner		;;
310102993Sfenner	*)
311179981Smtm		sc_init
312102993Sfenner		echo -n ' font8x14';	vidcontrol < ${viddev} -f 8x14 ${font8x14}
313102993Sfenner		;;
314102993Sfenner	esac
31570856Sjhb
316102993Sfenner	# font 8x8
317102993Sfenner	#
318102993Sfenner	case ${font8x8} in
319102993Sfenner	[Nn][Oo] | '')
320102993Sfenner		;;
321102993Sfenner	*)
322179981Smtm		sc_init
323102993Sfenner		echo -n ' font8x8';	vidcontrol < ${viddev} -f 8x8 ${font8x8}
324102993Sfenner		;;
325102993Sfenner	esac
32670856Sjhb
327102993Sfenner	# blank time
328102993Sfenner	#
329102993Sfenner	case ${blanktime} in
330102993Sfenner	[Nn][Oo] | '')
331102993Sfenner		;;
332102993Sfenner	*)
333179981Smtm		sc_init
334102993Sfenner		echo -n ' blanktime';	vidcontrol < ${viddev} -t ${blanktime}
335102993Sfenner		;;
336102993Sfenner	esac
33770856Sjhb
338102993Sfenner	# screen saver
339102993Sfenner	#
340102993Sfenner	case ${saver} in
341102993Sfenner	[Nn][Oo] | '')
342102993Sfenner		;;
343102993Sfenner	*)
344179981Smtm		sc_init
345102993Sfenner		echo -n ' screensaver'
346167495Smux		for i in `kldstat | awk '$5 ~ "_saver\.ko$" { print $5 }'`; do
347102993Sfenner			kldunload ${i}
348102993Sfenner		done
349165683Syar		load_kld -e _saver ${saver}_saver
350102993Sfenner		;;
351102993Sfenner	esac
35270856Sjhb
353102993Sfenner	# set this mode for all virtual screens
354102993Sfenner	#
355102993Sfenner	if [ -n "${allscreens_flags}" ]; then
356179981Smtm		sc_init
357102993Sfenner		echo -n ' allscreens'
358102993Sfenner		for ttyv in /dev/ttyv*; do
359102993Sfenner			vidcontrol ${allscreens_flags} < ${ttyv} > ${ttyv} 2>&1
360102993Sfenner		done
361102993Sfenner	fi
362100284Sdougb
363179981Smtm	[ -n "${_sc_initdone}" ] && echo '.'
364270935Sse	if [ -n "${_sc_keymap_msg}" ]; then
365270935Sse		echo
366270935Sse		echo "WARNING:"
367270935Sse		echo "${_sc_keymap_msg}."
368270935Sse		echo
369270935Sse	fi
370102993Sfenner}
371103161Sgordon
372103161Sgordonload_rc_config $name
373156331Semaxrun_rc_command $*
374156331Semax
375