syscons revision 271095
155714Skris#!/bin/sh - 255714Skris# 355714Skris# Copyright (c) 2000 The FreeBSD Project 455714Skris# All rights reserved. 555714Skris# 655714Skris# Redistribution and use in source and binary forms, with or without 755714Skris# modification, are permitted provided that the following conditions 855714Skris# are met: 955714Skris# 1. Redistributions of source code must retain the above copyright 1055714Skris# notice, this list of conditions and the following disclaimer. 1155714Skris# 2. Redistributions in binary form must reproduce the above copyright 1255714Skris# notice, this list of conditions and the following disclaimer in the 1355714Skris# documentation and/or other materials provided with the distribution. 1455714Skris# 1555714Skris# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 1655714Skris# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 1755714Skris# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 1855714Skris# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 1955714Skris# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 2055714Skris# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 2155714Skris# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 2255714Skris# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 2355714Skris# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 2455714Skris# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 2555714Skris# SUCH DAMAGE. 2655714Skris# 2755714Skris# $FreeBSD: stable/10/etc/rc.d/syscons 271095 2014-09-04 13:45:16Z se $ 2855714Skris# 2955714Skris 3055714Skris# PROVIDE: syscons 3155714Skris# REQUIRE: LOGIN 3255714Skris# KEYWORD: nojail 3355714Skris 3455714Skris. /etc/rc.subr 3555714Skris 3655714Skrisname="syscons" 3755714Skrisextra_commands="setkeyboard" 3855714Skrissetkeyboard_cmd="syscons_setkeyboard" 3955714Skrisstart_precmd="syscons_precmd" 4055714Skrisstart_cmd="syscons_start" 4155714Skrisstop_cmd=":" 4255714Skris 4355714Skris# stdin must be redirected because it might be for a serial console 4455714Skris# 4555714Skriskbddev=/dev/ttyv0 4655714Skrisviddev=/dev/ttyv0 4755714Skris 4855714Skris_sc_config= 4955714Skris_sc_console= 5055714Skris_sc_initdone= 5155714Skris_sc_keymap_msg= 5255714Skrissc_init() 5355714Skris{ 5455714Skris if [ -z "${_sc_initdone}" ]; then 5555714Skris if [ -z "${_sc_console}" ]; then 5655714Skris if [ x`sysctl -n kern.vty` = x"vt" ]; then 5755714Skris _sc_console="vt" 5855714Skris else 5955714Skris _sc_console="syscons" 6055714Skris fi 6155714Skris _sc_config="${_sc_console}" 6255714Skris fi 6355714Skris echo -n "Configuring ${_sc_config}:" 6455714Skris _sc_initdone=yes 6555714Skris fi 6655714Skris} 6755714Skris 68160814Ssimon# syscons to vt migration helper 69160814Ssimonlookup_keymap_for_vt() 70160814Ssimon{ 71160814Ssimon keymap=`basename $1 .kbd` 72160814Ssimon case $keymap in 73160814Ssimonhy.armscii-8) echo am;; 74160814Ssimonbe.iso.acc) echo be.acc;; 75160814Ssimonbe.iso) echo be;; 76160814Ssimonbg.bds.ctrlcaps) echo bg.bds;; 77160814Ssimonbg.phonetic.ctrlcaps) echo bg.phonetic;; 78160814Ssimonbr275.iso.acc) echo br;; 79160814Ssimonbr275.*) echo br.noacc;; 80160814Ssimonby.*) echo by;; 81160814Ssimonfr_CA.iso.acc) echo ca-fr;; 82160814Ssimonswissgerman.macbook.acc) echo ch.macbook.acc;; 83160814Ssimonswissgerman.iso.acc) echo ch.acc;; 84160814Ssimonswissgerman.*) echo ch;; 85160814Ssimonswissfrench.iso.acc) echo ch-fr.acc;; 8655714Skrisswissfrench.*) echo ch-fr;; 8755714Skrisce.iso2) echo centraleuropean.qwerty;; 8855714Skriscolemak.iso15.acc) echo colemak.acc;; 89160814Ssimoncs.*|cz.*) echo cz;; 9055714Skrisgerman.iso.acc) echo de.acc;; 9155714Skrisgerman.*) echo de;; 92194206Ssimondanish.iso.acc) echo dk.acc;; 93194206Ssimondanish.iso.macbook) echo dk.macbook;; 94194206Ssimondanish.*) echo dk;; 95194206Ssimonestonian.*) echo ee;; 96109998Smarkmspanish.dvorak) echo es.dvorak;; 9755714Skrisspanish.iso*.acc) echo es.acc;; 9868651Skrisspanish.iso) echo es;; 9968651Skrisfinnish.*) echo fi;; 10068651Skrisfr.macbook.acc) echo fr.macbook;; 10168651Skrisfr.iso.acc) echo fr.acc;; 10268651Skrisfr.iso) echo fr;; 10355714Skrisel.iso07) echo gr;; 10455714Skrisgr.us101.acc) echo gr.101.acc;; 10555714Skrishr.iso) echo hr;; 10655714Skrishu.iso2.101keys) echo hu.101;; 10755714Skrishu.iso2.102keys) echo hu.102;; 10855714Skrisiw.iso8) echo il;; 10955714Skrisicelandic.iso.acc) echo is.acc;; 11055714Skrisicelandic.iso) echo is;; 11155714Skrisit.iso) echo it;; 11255714Skrisjp.106x) echo jp.capsctrl;; 11355714Skrisjp.106) echo jp;; 11455714Skris#?? jp.pc98.iso) echo jp.pc98;; 11555714Skriskk.pt154.io) echo kz.io;; 11659191Skriskk.pt154.kst) echo kz.kst;; 11755714Skrislatinamerican.iso.acc) echo latinamerican.acc;; 11855714Skrislt.iso4) echo lt;; 11955714Skrisnorwegian.iso) echo no;; 12055714Skrisnorwegian.dvorak) echo no.dvorak;; 12155714Skrisdutch.iso.acc) echo nl;; 12255714Skriseee_nordic) echo nordic.asus-eee;; 12355714Skrispl_PL.dvorak) echo pl.dvorak;; 12455714Skrispl_PL.ISO8859-2) echo pl;; 12555714Skrispt.iso.acc) echo pt.acc;; 12655714Skrispt.iso) echo pt;; 12755714Skrisru.koi8-r.shift) echo ru.shift;; 128109998Smarkmru.koi8-r.win) echo ru.win;; 129109998Smarkmru.*) echo ru;; 130109998Smarkmswedish.*) echo se;; 131109998Smarkmsi.iso) echo si;; 13255714Skrissk.iso2) echo sk;; 13355714Skristr.iso9.q) echo tr;; 13455714Skrisua.koi8-u.shift.alt) echo ua.shift.alt;; 135160814Ssimonua.*) echo ua;; 136160814Ssimonuk.*-ctrl) echo uk.capsctrl;; 13755714Skrisuk.dvorak) echo uk.dvorak;; 138160814Ssimonuk.*) echo uk;; 13955714Skrisus.iso.acc) echo us.acc;; 140160814Ssimonus.pc-ctrl) echo us.ctrl;; 14155714Skrisus.iso) echo us;; 14255714Skris esac 14355714Skris} 14455714Skris 14555714Skriskbdcontrol_load_keymap() 14655714Skris{ 14755714Skris errmsg=`kbdcontrol < ${kbddev} -l ${keymap} 2>&1` 14855714Skris if [ -n "${errmsg}" -a "${_sc_console}" = "vt" ]; then 14955714Skris _sc_keymap_msg="${errmsg}" 15055714Skris keymap_vt=`lookup_keymap_for_vt ${keymap}` 15155714Skris if [ -n "${keymap_vt}" ]; then 152160814Ssimon errmsg=`kbdcontrol < ${kbddev} -l ${keymap_vt} 2>&1` 15355714Skris if [ -z "${errmsg}" ]; then 15455714Skris _sc_keymap_msg="New keymap: In /etc/rc.conf replace 'keymap=${keymap}' by 'keymap=${keymap_vt}'" 15555714Skris fi 15655714Skris else 15755714Skris _sc_keymap_msg="No replacement found for keymap '${keymap}'. 15855714SkrisYou may try to convert your keymap file using 'convert-keymap.pl', which is 15955714Skrispart of the system sources and located in /usr/src/tools/tools/vt/keymaps/" 16055714Skris fi 16155714Skris fi 16255714Skris} 16355714Skris 16455714Skris# helper 16555714Skrissyscons_configure_keyboard() 16655714Skris{ 167160814Ssimon # keymap 16855714Skris # 16955714Skris case ${keymap} in 17055714Skris [Nn][Oo] | '') 17155714Skris ;; 17255714Skris *) 17355714Skris sc_init 17455714Skris echo -n ' keymap'; kbdcontrol_load_keymap 17555714Skris ;; 17655714Skris esac 17755714Skris 178160814Ssimon # keyrate 179160814Ssimon # 180160814Ssimon case ${keyrate} in 181160814Ssimon [Nn][Oo] | '') 18255714Skris ;; 183160814Ssimon *) 18455714Skris sc_init 18555714Skris echo -n ' keyrate'; kbdcontrol < ${kbddev} -r ${keyrate} 18655714Skris ;; 18755714Skris esac 18855714Skris 18955714Skris # keybell 19055714Skris # 19155714Skris case ${keybell} in 19255714Skris [Nn][Oo] | '') 19355714Skris ;; 19455714Skris *) 19555714Skris sc_init 196160814Ssimon echo -n ' keybell'; kbdcontrol < ${kbddev} -b ${keybell} 197160814Ssimon ;; 198160814Ssimon esac 199160814Ssimon 200160814Ssimon # change function keys 201109998Smarkm # 202109998Smarkm case ${keychange} in 203109998Smarkm [Nn][Oo] | '') 204109998Smarkm ;; 205109998Smarkm *) 20655714Skris sc_init 20755714Skris echo -n ' keychange' 20855714Skris set -- ${keychange} 20955714Skris while [ $# -gt 0 ]; do 21068651Skris kbdcontrol <${kbddev} -f "$1" "$2" 21155714Skris shift; shift 21255714Skris done 21355714Skris ;; 21455714Skris esac 21555714Skris 216160814Ssimon # set this keyboard mode for all virtual terminals 217160814Ssimon # 218160814Ssimon if [ -n "${allscreens_kbdflags}" ]; then 219160814Ssimon sc_init 220160814Ssimon echo -n ' allscreens_kbd' 22155714Skris for ttyv in /dev/ttyv*; do 22255714Skris kbdcontrol ${allscreens_kbdflags} < ${ttyv} > ${ttyv} 2>&1 22359191Skris done 22455714Skris fi 22555714Skris} 22655714Skris 22755714Skrissyscons_setkeyboard() 22855714Skris{ 22955714Skris kbd=$1 23068651Skris 23155714Skris if [ -z "${kbd}" ]; then 23255714Skris return 1 23355714Skris fi 23455714Skris 23555714Skris # Check if the kbdmux(4) is the current active keyboard 23655714Skris kbdcontrol -i < ${kbddev} | grep kbdmux > /dev/null 2>&1 23755714Skris if [ $? -ne 0 ]; then 23855714Skris kbdcontrol -k ${kbd} < ${kbddev} > /dev/null 2>&1 23955714Skris fi 24055714Skris 241160814Ssimon _sc_config="keyboard" 242160814Ssimon syscons_configure_keyboard 243160814Ssimon 244160814Ssimon # Terminate keyboard configuration line and reset global variables. 24555714Skris # 24655714Skris if [ -n "${_sc_initdone}" ]; then 247160814Ssimon echo '.' 248160814Ssimon _sc_config="${_sc_console}" 249160814Ssimon _sc_initdone= 250160814Ssimon fi 25155714Skris} 25255714Skris 25355714Skrissyscons_precmd() 254160814Ssimon{ 255160814Ssimon if [ ! -c $kbddev ] 256160814Ssimon then 257160814Ssimon return 1 25855714Skris fi 25955714Skris return 0 26055714Skris} 26155714Skris 262160814Ssimonsyscons_start() 26355714Skris{ 264160814Ssimon # keyboard 265160814Ssimon # 266160814Ssimon if [ -n "${keyboard}" ]; then 267160814Ssimon syscons_setkeyboard ${keyboard} 268160814Ssimon fi 269160814Ssimon 270160814Ssimon syscons_configure_keyboard 271160814Ssimon 272160814Ssimon # cursor type 273160814Ssimon # 274160814Ssimon case ${cursor} in 275160814Ssimon [Nn][Oo] | '') 276160814Ssimon ;; 277160814Ssimon *) 278160814Ssimon sc_init 279160814Ssimon echo -n ' cursor'; vidcontrol < ${viddev} -c ${cursor} 280142425Snectar ;; 281120631Snectar esac 282194206Ssimon 28355714Skris # screen mapping 284142425Snectar # 28555714Skris case ${scrnmap} in 286142425Snectar [Nn][Oo] | '') 287160814Ssimon ;; 288160814Ssimon *) 289160814Ssimon sc_init 290160814Ssimon echo -n ' scrnmap'; vidcontrol < ${viddev} -l ${scrnmap} 291160814Ssimon ;; 292194206Ssimon esac 293160814Ssimon 294194206Ssimon # font 8x16 295120631Snectar # 296120631Snectar case ${font8x16} in 297120631Snectar [Nn][Oo] | '') 298120631Snectar ;; 299120631Snectar *) 300120631Snectar sc_init 301120631Snectar echo -n ' font8x16'; vidcontrol < ${viddev} -f 8x16 ${font8x16} 302120631Snectar ;; 303120631Snectar esac 304120631Snectar 305120631Snectar # font 8x14 306120631Snectar # 307120631Snectar case ${font8x14} in 308120631Snectar [Nn][Oo] | '') 309120631Snectar ;; 310120631Snectar *) 311109998Smarkm sc_init 312142425Snectar echo -n ' font8x14'; vidcontrol < ${viddev} -f 8x14 ${font8x14} 313109998Smarkm ;; 314142425Snectar esac 315109998Smarkm 316142425Snectar # font 8x8 31755714Skris # 318142425Snectar case ${font8x8} in 31955714Skris [Nn][Oo] | '') 32055714Skris ;; 32155714Skris *) 32255714Skris sc_init 32355714Skris echo -n ' font8x8'; vidcontrol < ${viddev} -f 8x8 ${font8x8} 32455714Skris ;; 32555714Skris esac 326127128Snectar 327127128Snectar # blank time 32855714Skris # 32955714Skris case ${blanktime} in 330127128Snectar [Nn][Oo] | '') 33155714Skris ;; 332127128Snectar *) 33355714Skris sc_init 334127128Snectar echo -n ' blanktime'; vidcontrol < ${viddev} -t ${blanktime} 33555714Skris ;; 33655714Skris esac 33755714Skris 33855714Skris # screen saver 33955714Skris # 34055714Skris case ${saver} in 341160814Ssimon [Nn][Oo] | '') 34255714Skris ;; 34355714Skris *) 34455714Skris sc_init 34555714Skris echo -n ' screensaver' 34655714Skris for i in `kldstat | awk '$5 ~ "_saver\.ko$" { print $5 }'`; do 347160814Ssimon kldunload ${i} 348160814Ssimon done 349160814Ssimon load_kld -e _saver ${saver}_saver 350160814Ssimon ;; 351160814Ssimon esac 352160814Ssimon 35355714Skris # set this mode for all virtual screens 35455714Skris # 35555714Skris if [ -n "${allscreens_flags}" ]; then 35655714Skris sc_init 35755714Skris echo -n ' allscreens' 35855714Skris for ttyv in /dev/ttyv*; do 35955714Skris vidcontrol ${allscreens_flags} < ${ttyv} > ${ttyv} 2>&1 36055714Skris done 36155714Skris fi 362160814Ssimon 36355714Skris [ -n "${_sc_initdone}" ] && echo '.' 364160814Ssimon if [ -n "${_sc_keymap_msg}" ]; then 36555714Skris echo 36655714Skris echo "WARNING:" 36755714Skris echo "${_sc_keymap_msg}." 36855714Skris echo 36955714Skris fi 37055714Skris} 37155714Skris 37255714Skrisload_rc_config $name 37355714Skrisrun_rc_command $* 37455714Skris 37555714Skris