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