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