1#!/bin/sh -
2#
3# Copyright (c) 2000  The FreeBSD Project
4# All rights reserved.
5#
6# Redistribution and use in source and binary forms, with or without
7# modification, are permitted provided that the following conditions
8# are met:
9# 1. Redistributions of source code must retain the above copyright
10#    notice, this list of conditions and the following disclaimer.
11# 2. Redistributions in binary form must reproduce the above copyright
12#    notice, this list of conditions and the following disclaimer in the
13#    documentation and/or other materials provided with the distribution.
14#
15# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
16# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18# ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
19# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
20# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
21# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
22# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
23# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
24# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
25# SUCH DAMAGE.
26#
27# $FreeBSD$
28#
29
30# PROVIDE: syscons
31# REQUIRE: LOGIN
32# KEYWORD: nojail
33
34. /etc/rc.subr
35
36name="syscons"
37desc="Configure the system console"
38extra_commands="setkeyboard"
39setkeyboard_cmd="syscons_setkeyboard"
40start_precmd="syscons_precmd"
41start_cmd="syscons_start"
42stop_cmd=":"
43
44# stdin must be redirected because it might be for a serial console
45#
46kbddev=/dev/ttyv0
47viddev=/dev/ttyv0
48
49_sc_config=
50_sc_console=
51_sc_initdone=
52_sc_keymap_msg=
53sc_init()
54{
55	if [ -z "${_sc_initdone}" ]; then
56		if [ -z "${_sc_console}" ]; then
57			if [ x`sysctl -n kern.vty` = x"vt" ]; then
58				_sc_console="vt"
59			else
60				_sc_console="syscons"
61			fi
62			_sc_config="${_sc_console}"
63		fi
64		echo -n "Configuring ${_sc_config}:"
65		_sc_initdone=yes
66	fi
67}
68
69# syscons to vt migration helper
70lookup_keymap_for_vt()
71{
72	keymap=`basename $1 .kbd`
73	case $keymap in
74hy.armscii-8)			echo am;;
75be.iso.acc)			echo be.acc;;
76be.iso)				echo be;;
77bg.bds.ctrlcaps)		echo bg.bds;;
78bg.phonetic.ctrlcaps)		echo bg.phonetic;;
79br275.iso.acc)			echo br;;
80br275.*)			echo br.noacc;;
81by.*)				echo by;;
82fr_CA.iso.acc)			echo ca-fr;;
83swissgerman.macbook.acc)	echo ch.macbook.acc;;
84swissgerman.iso.acc)		echo ch.acc;;
85swissgerman.*)			echo ch;;
86swissfrench.iso.acc)		echo ch-fr.acc;;
87swissfrench.*)			echo ch-fr;;
88ce.iso2)			echo centraleuropean.qwerty;;
89colemak.iso15.acc)		echo colemak.acc;;
90cs.*|cz.*)			echo cz;;
91german.iso.acc)			echo de.acc;;
92german.*)			echo de;;
93danish.iso.acc)			echo dk.acc;;
94danish.iso.macbook)		echo dk.macbook;;
95danish.*)			echo dk;;
96estonian.*)			echo ee;;
97spanish.dvorak)			echo es.dvorak;;
98spanish.iso*.acc)		echo es.acc;;
99spanish.iso)			echo es;;
100finnish.*)			echo fi;;
101fr.macbook.acc)			echo fr.macbook;;
102fr.iso.acc)			echo fr.acc;;
103fr.iso)				echo fr;;
104el.iso07)			echo gr;;
105gr.us101.acc)			echo gr.101.acc;;
106hr.iso)				echo hr;;
107hu.iso2.101keys)		echo hu.101;;
108hu.iso2.102keys)		echo hu.102;;
109iw.iso8)			echo il;;
110icelandic.iso.acc)		echo is.acc;;
111icelandic.iso)			echo is;;
112it.iso)				echo it;;
113jp.106x)			echo jp.capsctrl;;
114jp.106)				echo jp;;
115#?? jp.pc98.iso)		echo jp.pc98;;
116kk.pt154.io)			echo kz.io;;
117kk.pt154.kst)			echo kz.kst;;
118latinamerican.iso.acc)		echo latinamerican.acc;;
119lt.iso4)			echo lt;;
120norwegian.iso)			echo no;;
121norwegian.dvorak)		echo no.dvorak;;
122dutch.iso.acc)			echo nl;;
123eee_nordic)			echo nordic.asus-eee;;
124pl_PL.dvorak)			echo pl.dvorak;;
125pl_PL.ISO8859-2)		echo pl;;
126pt.iso.acc)			echo pt.acc;;
127pt.iso)				echo pt;;
128ru.koi8-r.shift)		echo ru.shift;;
129ru.koi8-r.win)			echo ru.win;;
130ru.*)				echo ru;;
131swedish.*)			echo se;;
132si.iso)				echo si;;
133sk.iso2)			echo sk;;
134tr.iso9.q)			echo tr;;
135ua.koi8-u.shift.alt)		echo ua.shift.alt;;
136ua.*)				echo ua;;
137uk.*-ctrl)			echo uk.capsctrl;;
138uk.dvorak)			echo uk.dvorak;;
139uk.*)				echo uk;;
140us.iso.acc)			echo us.acc;;
141us.pc-ctrl)			echo us.ctrl;;
142us.iso)				echo us;;
143	esac
144}
145
146kbdcontrol_load_keymap()
147{
148	errmsg=`kbdcontrol < ${kbddev} -l ${keymap} 2>&1`
149	if [ -n "${errmsg}" -a "${_sc_console}" = "vt" ]; then
150		_sc_keymap_msg="${errmsg}"
151		keymap_vt=`lookup_keymap_for_vt ${keymap}`
152		if [ -n "${keymap_vt}" ]; then
153			errmsg=`kbdcontrol < ${kbddev} -l ${keymap_vt} 2>&1`
154			if [ -z "${errmsg}" ]; then
155		    		_sc_keymap_msg="New keymap: In /etc/rc.conf replace 'keymap=${keymap}' by 'keymap=${keymap_vt}'"
156			fi
157		else
158			_sc_keymap_msg="No replacement found for keymap '${keymap}'.
159You may try to convert your keymap file using 'convert-keymap.pl', which is
160part of the system sources and located in /usr/src/tools/tools/vt/keymaps/"
161		fi
162	fi
163}
164
165# helper
166syscons_configure_keyboard()
167{
168	# keymap
169	#
170	case ${keymap} in
171	NO | '')
172		;;
173	*)
174		sc_init
175		echo -n ' keymap';	kbdcontrol_load_keymap
176		;;
177	esac
178
179	# keyrate
180	#
181	case ${keyrate} in
182	[Nn][Oo] | '')
183		;;
184	*)
185		sc_init
186		echo -n ' keyrate';	kbdcontrol < ${kbddev} -r ${keyrate}
187		;;
188	esac
189
190	# keybell
191	#
192	case ${keybell} in
193	[Nn][Oo] | '')
194		;;
195	*)
196		sc_init
197		echo -n ' keybell';	kbdcontrol < ${kbddev} -b ${keybell}
198		;;
199	esac
200
201	# change function keys
202	#
203	case ${keychange} in
204	[Nn][Oo] | '')
205		;;
206	*)
207		sc_init
208		echo -n ' keychange'
209		set -- ${keychange}
210		while [ $# -gt 0 ]; do
211			kbdcontrol <${kbddev} -f "$1" "$2"
212			shift; shift
213		done
214		;;
215	esac
216
217	# set this keyboard mode for all virtual terminals
218	#
219	if [ -n "${allscreens_kbdflags}" ]; then
220		sc_init
221		echo -n ' allscreens_kbd'
222		for ttyv in /dev/ttyv*; do
223			kbdcontrol ${allscreens_kbdflags} < ${ttyv} > ${ttyv} 2>&1
224		done
225	fi
226}
227
228syscons_setkeyboard()
229{
230	kbd=$1
231
232	if [ -z "${kbd}" ]; then
233		return 1
234	fi
235
236	# Check if the kbdmux(4) is the current active keyboard
237	kbdcontrol -i < ${kbddev} | grep kbdmux > /dev/null 2>&1
238	if [ $? -ne 0 ]; then
239		kbdcontrol -k ${kbd} < ${kbddev} > /dev/null 2>&1
240	fi
241
242	_sc_config="keyboard"
243	syscons_configure_keyboard
244
245	# Terminate keyboard configuration line and reset global variables.
246	#
247	if [ -n "${_sc_initdone}" ]; then
248		echo '.'
249		_sc_config="${_sc_console}"
250		_sc_initdone=
251	fi
252}
253
254syscons_precmd()
255{
256	if [ ! -c $kbddev ]
257	then
258		return 1
259	fi
260	return 0
261}
262
263syscons_start()
264{
265	# keyboard
266	#
267	if [ -n "${keyboard}" ]; then
268		syscons_setkeyboard ${keyboard}
269	fi
270
271	syscons_configure_keyboard
272
273	# cursor type
274	#
275	case ${cursor} in
276	[Nn][Oo] | '')
277		;;
278	*)
279		sc_init
280		echo -n ' cursor';	vidcontrol < ${viddev} -c ${cursor}
281		;;
282	esac
283
284	# screen mapping
285	#
286	case ${scrnmap} in
287	[Nn][Oo] | '')
288		;;
289	*)
290		sc_init
291		echo -n ' scrnmap';	vidcontrol < ${viddev} -l ${scrnmap}
292		;;
293	esac
294
295	# font 8x16
296	#
297	case ${font8x16} in
298	[Nn][Oo] | '')
299		;;
300	*)
301		sc_init
302		echo -n ' font8x16';	vidcontrol < ${viddev} -f 8x16 ${font8x16}
303		;;
304	esac
305
306	# font 8x14
307	#
308	case ${font8x14} in
309	[Nn][Oo] | '')
310		;;
311	*)
312		sc_init
313		echo -n ' font8x14';	vidcontrol < ${viddev} -f 8x14 ${font8x14}
314		;;
315	esac
316
317	# font 8x8
318	#
319	case ${font8x8} in
320	[Nn][Oo] | '')
321		;;
322	*)
323		sc_init
324		echo -n ' font8x8';	vidcontrol < ${viddev} -f 8x8 ${font8x8}
325		;;
326	esac
327
328	# blank time
329	#
330	case ${blanktime} in
331	[Nn][Oo] | '')
332		;;
333	*)
334		sc_init
335		echo -n ' blanktime';	vidcontrol < ${viddev} -t ${blanktime}
336		;;
337	esac
338
339	# screen saver
340	#
341	case ${saver} in
342	[Nn][Oo] | '')
343		;;
344	*)
345		sc_init
346		echo -n ' screensaver'
347		for i in `kldstat | awk '$5 ~ "_saver\.ko$" { print $5 }'`; do
348			kldunload ${i}
349		done
350		load_kld -e _saver ${saver}_saver
351		;;
352	esac
353
354	# set this mode for all virtual screens
355	#
356	if [ -n "${allscreens_flags}" ]; then
357		sc_init
358		echo -n ' allscreens'
359		for ttyv in /dev/ttyv*; do
360			vidcontrol ${allscreens_flags} < ${ttyv} > ${ttyv} 2>&1
361		done
362	fi
363
364	[ -n "${_sc_initdone}" ] && echo '.'
365	if [ -n "${_sc_keymap_msg}" ]; then
366		echo
367		echo "WARNING:"
368		echo "${_sc_keymap_msg}."
369		echo
370	fi
371}
372
373load_rc_config $name
374run_rc_command $*
375
376