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$
2870856Sjhb#
2970856Sjhb
30100280Sgordon# PROVIDE: syscons
31153430Siedowse# REQUIRE: LOGIN
32136224Smtm# KEYWORD: nojail
33100280Sgordon
34100280Sgordon. /etc/rc.subr
35100280Sgordon
36100280Sgordonname="syscons"
37298514Slmedesc="Configure the system console"
38156331Semaxextra_commands="setkeyboard"
39156331Semaxsetkeyboard_cmd="syscons_setkeyboard"
40102993Sfennerstart_precmd="syscons_precmd"
41102993Sfennerstart_cmd="syscons_start"
42165389Syarstop_cmd=":"
43100280Sgordon
4470856Sjhb# stdin must be redirected because it might be for a serial console
4570856Sjhb#
4670856Sjhbkbddev=/dev/ttyv0
4770856Sjhbviddev=/dev/ttyv0
4870856Sjhb
49270935Sse_sc_config=
50270935Sse_sc_console=
51179981Smtm_sc_initdone=
52270935Sse_sc_keymap_msg=
53179981Smtmsc_init()
54179981Smtm{
55179981Smtm	if [ -z "${_sc_initdone}" ]; then
56270935Sse		if [ -z "${_sc_console}" ]; then
57270935Sse			if [ x`sysctl -n kern.vty` = x"vt" ]; then
58270935Sse				_sc_console="vt"
59270935Sse			else
60270935Sse				_sc_console="syscons"
61270935Sse			fi
62270935Sse			_sc_config="${_sc_console}"
63270935Sse		fi
64179981Smtm		echo -n "Configuring ${_sc_config}:"
65179981Smtm		_sc_initdone=yes
66179981Smtm	fi
67179981Smtm}
68179981Smtm
69270935Sse# syscons to vt migration helper
70270935Sselookup_keymap_for_vt()
71270935Sse{
72270935Sse	keymap=`basename $1 .kbd`
73270935Sse	case $keymap in
74270935Ssehy.armscii-8)			echo am;;
75270935Ssebe.iso.acc)			echo be.acc;;
76270935Ssebe.iso)				echo be;;
77270935Ssebg.bds.ctrlcaps)		echo bg.bds;;
78270935Ssebg.phonetic.ctrlcaps)		echo bg.phonetic;;
79270935Ssebr275.iso.acc)			echo br;;
80270935Ssebr275.*)			echo br.noacc;;
81270935Sseby.*)				echo by;;
82270935Ssefr_CA.iso.acc)			echo ca-fr;;
83270935Sseswissgerman.macbook.acc)	echo ch.macbook.acc;;
84270935Sseswissgerman.iso.acc)		echo ch.acc;;
85270935Sseswissgerman.*)			echo ch;;
86270935Sseswissfrench.iso.acc)		echo ch-fr.acc;;
87270935Sseswissfrench.*)			echo ch-fr;;
88270935Ssece.iso2)			echo centraleuropean.qwerty;;
89270935Ssecolemak.iso15.acc)		echo colemak.acc;;
90270935Ssecs.*|cz.*)			echo cz;;
91270935Ssegerman.iso.acc)			echo de.acc;;
92270935Ssegerman.*)			echo de;;
93270935Ssedanish.iso.acc)			echo dk.acc;;
94270935Ssedanish.iso.macbook)		echo dk.macbook;;
95270935Ssedanish.*)			echo dk;;
96270935Sseestonian.*)			echo ee;;
97270935Ssespanish.dvorak)			echo es.dvorak;;
98270935Ssespanish.iso*.acc)		echo es.acc;;
99270935Ssespanish.iso)			echo es;;
100270935Ssefinnish.*)			echo fi;;
101270935Ssefr.macbook.acc)			echo fr.macbook;;
102270935Ssefr.iso.acc)			echo fr.acc;;
103270935Ssefr.iso)				echo fr;;
104270935Sseel.iso07)			echo gr;;
105270935Ssegr.us101.acc)			echo gr.101.acc;;
106270935Ssehr.iso)				echo hr;;
107270935Ssehu.iso2.101keys)		echo hu.101;;
108270935Ssehu.iso2.102keys)		echo hu.102;;
109270935Sseiw.iso8)			echo il;;
110270935Sseicelandic.iso.acc)		echo is.acc;;
111270935Sseicelandic.iso)			echo is;;
112270935Sseit.iso)				echo it;;
113270935Ssejp.106x)			echo jp.capsctrl;;
114270935Ssejp.106)				echo jp;;
115270935Sse#?? jp.pc98.iso)		echo jp.pc98;;
116270935Ssekk.pt154.io)			echo kz.io;;
117270935Ssekk.pt154.kst)			echo kz.kst;;
118270935Sselatinamerican.iso.acc)		echo latinamerican.acc;;
119270935Sselt.iso4)			echo lt;;
120270935Ssenorwegian.iso)			echo no;;
121270935Ssenorwegian.dvorak)		echo no.dvorak;;
122270935Ssedutch.iso.acc)			echo nl;;
123270935Sseeee_nordic)			echo nordic.asus-eee;;
124270935Ssepl_PL.dvorak)			echo pl.dvorak;;
125270935Ssepl_PL.ISO8859-2)		echo pl;;
126270935Ssept.iso.acc)			echo pt.acc;;
127270935Ssept.iso)				echo pt;;
128270935Sseru.koi8-r.shift)		echo ru.shift;;
129270935Sseru.koi8-r.win)			echo ru.win;;
130270935Sseru.*)				echo ru;;
131270935Sseswedish.*)			echo se;;
132270935Ssesi.iso)				echo si;;
133270935Ssesk.iso2)			echo sk;;
134270935Ssetr.iso9.q)			echo tr;;
135270935Sseua.koi8-u.shift.alt)		echo ua.shift.alt;;
136270935Sseua.*)				echo ua;;
137270935Sseuk.*-ctrl)			echo uk.capsctrl;;
138270935Sseuk.dvorak)			echo uk.dvorak;;
139270935Sseuk.*)				echo uk;;
140270935Sseus.iso.acc)			echo us.acc;;
141270935Sseus.pc-ctrl)			echo us.ctrl;;
142270935Sseus.iso)				echo us;;
143274059Sjmg	esac
144270935Sse}
145270935Sse
146270935Ssekbdcontrol_load_keymap()
147270935Sse{
148270935Sse	errmsg=`kbdcontrol < ${kbddev} -l ${keymap} 2>&1`
149270935Sse	if [ -n "${errmsg}" -a "${_sc_console}" = "vt" ]; then
150270935Sse		_sc_keymap_msg="${errmsg}"
151270935Sse		keymap_vt=`lookup_keymap_for_vt ${keymap}`
152270935Sse		if [ -n "${keymap_vt}" ]; then
153270935Sse			errmsg=`kbdcontrol < ${kbddev} -l ${keymap_vt} 2>&1`
154270935Sse			if [ -z "${errmsg}" ]; then
155270935Sse		    		_sc_keymap_msg="New keymap: In /etc/rc.conf replace 'keymap=${keymap}' by 'keymap=${keymap_vt}'"
156270935Sse			fi
157270935Sse		else
158270935Sse			_sc_keymap_msg="No replacement found for keymap '${keymap}'.
159270935SseYou may try to convert your keymap file using 'convert-keymap.pl', which is
160270935Ssepart of the system sources and located in /usr/src/tools/tools/vt/keymaps/"
161270935Sse		fi
162270935Sse	fi
163270935Sse}
164270935Sse
165156782Semax# helper
166156782Semaxsyscons_configure_keyboard()
167156331Semax{
168102993Sfenner	# keymap
169102993Sfenner	#
170102993Sfenner	case ${keymap} in
171271958Sse	NO | '')
172102993Sfenner		;;
173102993Sfenner	*)
174179981Smtm		sc_init
175270935Sse		echo -n ' keymap';	kbdcontrol_load_keymap
176102993Sfenner		;;
177102993Sfenner	esac
17870856Sjhb
179102993Sfenner	# keyrate
180102993Sfenner	#
181102993Sfenner	case ${keyrate} in
182102993Sfenner	[Nn][Oo] | '')
183102993Sfenner		;;
184102993Sfenner	*)
185179981Smtm		sc_init
186102993Sfenner		echo -n ' keyrate';	kbdcontrol < ${kbddev} -r ${keyrate}
187102993Sfenner		;;
188102993Sfenner	esac
18970856Sjhb
190102993Sfenner	# keybell
191102993Sfenner	#
192102993Sfenner	case ${keybell} in
193102993Sfenner	[Nn][Oo] | '')
194102993Sfenner		;;
195102993Sfenner	*)
196179981Smtm		sc_init
197102993Sfenner		echo -n ' keybell';	kbdcontrol < ${kbddev} -b ${keybell}
198102993Sfenner		;;
199102993Sfenner	esac
20070856Sjhb
201102993Sfenner	# change function keys
202102993Sfenner	#
203102993Sfenner	case ${keychange} in
204102993Sfenner	[Nn][Oo] | '')
205102993Sfenner		;;
206102993Sfenner	*)
207179981Smtm		sc_init
208102993Sfenner		echo -n ' keychange'
209227366Sjilles		set -- ${keychange}
210102993Sfenner		while [ $# -gt 0 ]; do
211102993Sfenner			kbdcontrol <${kbddev} -f "$1" "$2"
212102993Sfenner			shift; shift
213102993Sfenner		done
214102993Sfenner		;;
215102993Sfenner	esac
21670856Sjhb
217156782Semax	# set this keyboard mode for all virtual terminals
218156782Semax	#
219156782Semax	if [ -n "${allscreens_kbdflags}" ]; then
220179981Smtm		sc_init
221156782Semax		echo -n ' allscreens_kbd'
222156782Semax		for ttyv in /dev/ttyv*; do
223156782Semax			kbdcontrol ${allscreens_kbdflags} < ${ttyv} > ${ttyv} 2>&1
224156782Semax		done
225156782Semax	fi
226156782Semax}
227156782Semax
228156782Semaxsyscons_setkeyboard()
229156782Semax{
230156782Semax	kbd=$1
231208060Sdougb
232156782Semax	if [ -z "${kbd}" ]; then
233156782Semax		return 1
234156782Semax	fi
235156782Semax
236156782Semax	# Check if the kbdmux(4) is the current active keyboard
237156782Semax	kbdcontrol -i < ${kbddev} | grep kbdmux > /dev/null 2>&1
238167889Sbrooks	if [ $? -ne 0 ]; then
239156782Semax		kbdcontrol -k ${kbd} < ${kbddev} > /dev/null 2>&1
240156782Semax	fi
241156782Semax
242179981Smtm	_sc_config="keyboard"
243156782Semax	syscons_configure_keyboard
244179981Smtm
245179981Smtm	# Terminate keyboard configuration line and reset global variables.
246179981Smtm	#
247179981Smtm	if [ -n "${_sc_initdone}" ]; then
248179981Smtm		echo '.'
249270935Sse		_sc_config="${_sc_console}"
250179981Smtm		_sc_initdone=
251179981Smtm	fi
252156782Semax}
253156782Semax
254156782Semaxsyscons_precmd()
255156782Semax{
256156782Semax	if [ ! -c $kbddev ]
257156782Semax	then
258156782Semax		return 1
259156782Semax	fi
260156782Semax	return 0
261156782Semax}
262156782Semax
263156782Semaxsyscons_start()
264156782Semax{
265156782Semax	# keyboard
266156782Semax	#
267156782Semax	if [ -n "${keyboard}" ]; then
268179981Smtm		syscons_setkeyboard ${keyboard}
269156782Semax	fi
270156782Semax
271156782Semax	syscons_configure_keyboard
272156782Semax
273102993Sfenner	# cursor type
274102993Sfenner	#
275102993Sfenner	case ${cursor} in
276102993Sfenner	[Nn][Oo] | '')
277102993Sfenner		;;
278102993Sfenner	*)
279179981Smtm		sc_init
280102993Sfenner		echo -n ' cursor';	vidcontrol < ${viddev} -c ${cursor}
281102993Sfenner		;;
282102993Sfenner	esac
28370856Sjhb
284102993Sfenner	# screen mapping
285102993Sfenner	#
286102993Sfenner	case ${scrnmap} in
287102993Sfenner	[Nn][Oo] | '')
288102993Sfenner		;;
289102993Sfenner	*)
290179981Smtm		sc_init
291102993Sfenner		echo -n ' scrnmap';	vidcontrol < ${viddev} -l ${scrnmap}
292102993Sfenner		;;
293102993Sfenner	esac
29470856Sjhb
295102993Sfenner	# font 8x16
296102993Sfenner	#
297102993Sfenner	case ${font8x16} in
298102993Sfenner	[Nn][Oo] | '')
299102993Sfenner		;;
300102993Sfenner	*)
301179981Smtm		sc_init
302102993Sfenner		echo -n ' font8x16';	vidcontrol < ${viddev} -f 8x16 ${font8x16}
303102993Sfenner		;;
304102993Sfenner	esac
30570856Sjhb
306102993Sfenner	# font 8x14
307102993Sfenner	#
308102993Sfenner	case ${font8x14} in
309102993Sfenner	[Nn][Oo] | '')
310102993Sfenner		;;
311102993Sfenner	*)
312179981Smtm		sc_init
313102993Sfenner		echo -n ' font8x14';	vidcontrol < ${viddev} -f 8x14 ${font8x14}
314102993Sfenner		;;
315102993Sfenner	esac
31670856Sjhb
317102993Sfenner	# font 8x8
318102993Sfenner	#
319102993Sfenner	case ${font8x8} in
320102993Sfenner	[Nn][Oo] | '')
321102993Sfenner		;;
322102993Sfenner	*)
323179981Smtm		sc_init
324102993Sfenner		echo -n ' font8x8';	vidcontrol < ${viddev} -f 8x8 ${font8x8}
325102993Sfenner		;;
326102993Sfenner	esac
32770856Sjhb
328102993Sfenner	# blank time
329102993Sfenner	#
330102993Sfenner	case ${blanktime} in
331102993Sfenner	[Nn][Oo] | '')
332102993Sfenner		;;
333102993Sfenner	*)
334179981Smtm		sc_init
335102993Sfenner		echo -n ' blanktime';	vidcontrol < ${viddev} -t ${blanktime}
336102993Sfenner		;;
337102993Sfenner	esac
33870856Sjhb
339102993Sfenner	# screen saver
340102993Sfenner	#
341102993Sfenner	case ${saver} in
342102993Sfenner	[Nn][Oo] | '')
343102993Sfenner		;;
344102993Sfenner	*)
345179981Smtm		sc_init
346102993Sfenner		echo -n ' screensaver'
347167495Smux		for i in `kldstat | awk '$5 ~ "_saver\.ko$" { print $5 }'`; do
348102993Sfenner			kldunload ${i}
349102993Sfenner		done
350165683Syar		load_kld -e _saver ${saver}_saver
351102993Sfenner		;;
352102993Sfenner	esac
35370856Sjhb
354102993Sfenner	# set this mode for all virtual screens
355102993Sfenner	#
356102993Sfenner	if [ -n "${allscreens_flags}" ]; then
357179981Smtm		sc_init
358102993Sfenner		echo -n ' allscreens'
359102993Sfenner		for ttyv in /dev/ttyv*; do
360102993Sfenner			vidcontrol ${allscreens_flags} < ${ttyv} > ${ttyv} 2>&1
361102993Sfenner		done
362102993Sfenner	fi
363100284Sdougb
364179981Smtm	[ -n "${_sc_initdone}" ] && echo '.'
365270935Sse	if [ -n "${_sc_keymap_msg}" ]; then
366270935Sse		echo
367270935Sse		echo "WARNING:"
368270935Sse		echo "${_sc_keymap_msg}."
369270935Sse		echo
370270935Sse	fi
371102993Sfenner}
372103161Sgordon
373103161Sgordonload_rc_config $name
374156331Semaxrun_rc_command $*
375156331Semax
376