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