1#!/bin/sh - 2# 3# Copyright (c) 2000 The FreeBSD Project 4# All rights reserved. 5# 6# Redistribution and use in source and binary forms, with or without 7# modification, are permitted provided that the following conditions 8# are met: 9# 1. Redistributions of source code must retain the above copyright 10# notice, this list of conditions and the following disclaimer. 11# 2. Redistributions in binary form must reproduce the above copyright 12# notice, this list of conditions and the following disclaimer in the 13# documentation and/or other materials provided with the distribution. 14# 15# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 16# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 17# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 18# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 19# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 20# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 21# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 22# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 23# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 24# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 25# SUCH DAMAGE. 26# 27# $FreeBSD$ 28# 29 30# PROVIDE: syscons 31# REQUIRE: LOGIN 32# KEYWORD: nojail 33 34. /etc/rc.subr 35 36name="syscons" 37desc="Configure the system console" 38extra_commands="setkeyboard" 39setkeyboard_cmd="syscons_setkeyboard" 40start_precmd="syscons_precmd" 41start_cmd="syscons_start" 42stop_cmd=":" 43 44# stdin must be redirected because it might be for a serial console 45# 46kbddev=/dev/ttyv0 47viddev=/dev/ttyv0 48 49_sc_config= 50_sc_console= 51_sc_initdone= 52_sc_keymap_msg= 53sc_init() 54{ 55 if [ -z "${_sc_initdone}" ]; then 56 if [ -z "${_sc_console}" ]; then 57 if [ x`sysctl -n kern.vty` = x"vt" ]; then 58 _sc_console="vt" 59 else 60 _sc_console="syscons" 61 fi 62 _sc_config="${_sc_console}" 63 fi 64 echo -n "Configuring ${_sc_config}:" 65 _sc_initdone=yes 66 fi 67} 68 69# syscons to vt migration helper 70lookup_keymap_for_vt() 71{ 72 keymap=`basename $1 .kbd` 73 case $keymap in 74hy.armscii-8) echo am;; 75be.iso.acc) echo be.acc;; 76be.iso) echo be;; 77bg.bds.ctrlcaps) echo bg.bds;; 78bg.phonetic.ctrlcaps) echo bg.phonetic;; 79br275.iso.acc) echo br;; 80br275.*) echo br.noacc;; 81by.*) echo by;; 82fr_CA.iso.acc) echo ca-fr;; 83swissgerman.macbook.acc) echo ch.macbook.acc;; 84swissgerman.iso.acc) echo ch.acc;; 85swissgerman.*) echo ch;; 86swissfrench.iso.acc) echo ch-fr.acc;; 87swissfrench.*) echo ch-fr;; 88ce.iso2) echo centraleuropean.qwerty;; 89colemak.iso15.acc) echo colemak.acc;; 90cs.*|cz.*) echo cz;; 91german.iso.acc) echo de.acc;; 92german.*) echo de;; 93danish.iso.acc) echo dk.acc;; 94danish.iso.macbook) echo dk.macbook;; 95danish.*) echo dk;; 96estonian.*) echo ee;; 97spanish.dvorak) echo es.dvorak;; 98spanish.iso*.acc) echo es.acc;; 99spanish.iso) echo es;; 100finnish.*) echo fi;; 101fr.macbook.acc) echo fr.macbook;; 102fr.iso.acc) echo fr.acc;; 103fr.iso) echo fr;; 104el.iso07) echo gr;; 105gr.us101.acc) echo gr.101.acc;; 106hr.iso) echo hr;; 107hu.iso2.101keys) echo hu.101;; 108hu.iso2.102keys) echo hu.102;; 109iw.iso8) echo il;; 110icelandic.iso.acc) echo is.acc;; 111icelandic.iso) echo is;; 112it.iso) echo it;; 113jp.106x) echo jp.capsctrl;; 114jp.106) echo jp;; 115#?? jp.pc98.iso) echo jp.pc98;; 116kk.pt154.io) echo kz.io;; 117kk.pt154.kst) echo kz.kst;; 118latinamerican.iso.acc) echo latinamerican.acc;; 119lt.iso4) echo lt;; 120norwegian.iso) echo no;; 121norwegian.dvorak) echo no.dvorak;; 122dutch.iso.acc) echo nl;; 123eee_nordic) echo nordic.asus-eee;; 124pl_PL.dvorak) echo pl.dvorak;; 125pl_PL.ISO8859-2) echo pl;; 126pt.iso.acc) echo pt.acc;; 127pt.iso) echo pt;; 128ru.koi8-r.shift) echo ru.shift;; 129ru.koi8-r.win) echo ru.win;; 130ru.*) echo ru;; 131swedish.*) echo se;; 132si.iso) echo si;; 133sk.iso2) echo sk;; 134tr.iso9.q) echo tr;; 135ua.koi8-u.shift.alt) echo ua.shift.alt;; 136ua.*) echo ua;; 137uk.*-ctrl) echo uk.capsctrl;; 138uk.dvorak) echo uk.dvorak;; 139uk.*) echo uk;; 140us.iso.acc) echo us.acc;; 141us.pc-ctrl) echo us.ctrl;; 142us.iso) echo us;; 143 esac 144} 145 146kbdcontrol_load_keymap() 147{ 148 errmsg=`kbdcontrol < ${kbddev} -l ${keymap} 2>&1` 149 if [ -n "${errmsg}" -a "${_sc_console}" = "vt" ]; then 150 _sc_keymap_msg="${errmsg}" 151 keymap_vt=`lookup_keymap_for_vt ${keymap}` 152 if [ -n "${keymap_vt}" ]; then 153 errmsg=`kbdcontrol < ${kbddev} -l ${keymap_vt} 2>&1` 154 if [ -z "${errmsg}" ]; then 155 _sc_keymap_msg="New keymap: In /etc/rc.conf replace 'keymap=${keymap}' by 'keymap=${keymap_vt}'" 156 fi 157 else 158 _sc_keymap_msg="No replacement found for keymap '${keymap}'. 159You may try to convert your keymap file using 'convert-keymap.pl', which is 160part of the system sources and located in /usr/src/tools/tools/vt/keymaps/" 161 fi 162 fi 163} 164 165# helper 166syscons_configure_keyboard() 167{ 168 # keymap 169 # 170 case ${keymap} in 171 NO | '') 172 ;; 173 *) 174 sc_init 175 echo -n ' keymap'; kbdcontrol_load_keymap 176 ;; 177 esac 178 179 # keyrate 180 # 181 case ${keyrate} in 182 [Nn][Oo] | '') 183 ;; 184 *) 185 sc_init 186 echo -n ' keyrate'; kbdcontrol < ${kbddev} -r ${keyrate} 187 ;; 188 esac 189 190 # keybell 191 # 192 case ${keybell} in 193 [Nn][Oo] | '') 194 ;; 195 *) 196 sc_init 197 echo -n ' keybell'; kbdcontrol < ${kbddev} -b ${keybell} 198 ;; 199 esac 200 201 # change function keys 202 # 203 case ${keychange} in 204 [Nn][Oo] | '') 205 ;; 206 *) 207 sc_init 208 echo -n ' keychange' 209 set -- ${keychange} 210 while [ $# -gt 0 ]; do 211 kbdcontrol <${kbddev} -f "$1" "$2" 212 shift; shift 213 done 214 ;; 215 esac 216 217 # set this keyboard mode for all virtual terminals 218 # 219 if [ -n "${allscreens_kbdflags}" ]; then 220 sc_init 221 echo -n ' allscreens_kbd' 222 for ttyv in /dev/ttyv*; do 223 kbdcontrol ${allscreens_kbdflags} < ${ttyv} > ${ttyv} 2>&1 224 done 225 fi 226} 227 228syscons_setkeyboard() 229{ 230 kbd=$1 231 232 if [ -z "${kbd}" ]; then 233 return 1 234 fi 235 236 # Check if the kbdmux(4) is the current active keyboard 237 kbdcontrol -i < ${kbddev} | grep kbdmux > /dev/null 2>&1 238 if [ $? -ne 0 ]; then 239 kbdcontrol -k ${kbd} < ${kbddev} > /dev/null 2>&1 240 fi 241 242 _sc_config="keyboard" 243 syscons_configure_keyboard 244 245 # Terminate keyboard configuration line and reset global variables. 246 # 247 if [ -n "${_sc_initdone}" ]; then 248 echo '.' 249 _sc_config="${_sc_console}" 250 _sc_initdone= 251 fi 252} 253 254syscons_precmd() 255{ 256 if [ ! -c $kbddev ] 257 then 258 return 1 259 fi 260 return 0 261} 262 263syscons_start() 264{ 265 # keyboard 266 # 267 if [ -n "${keyboard}" ]; then 268 syscons_setkeyboard ${keyboard} 269 fi 270 271 syscons_configure_keyboard 272 273 # cursor type 274 # 275 case ${cursor} in 276 [Nn][Oo] | '') 277 ;; 278 *) 279 sc_init 280 echo -n ' cursor'; vidcontrol < ${viddev} -c ${cursor} 281 ;; 282 esac 283 284 # screen mapping 285 # 286 case ${scrnmap} in 287 [Nn][Oo] | '') 288 ;; 289 *) 290 sc_init 291 echo -n ' scrnmap'; vidcontrol < ${viddev} -l ${scrnmap} 292 ;; 293 esac 294 295 # font 8x16 296 # 297 case ${font8x16} in 298 [Nn][Oo] | '') 299 ;; 300 *) 301 sc_init 302 echo -n ' font8x16'; vidcontrol < ${viddev} -f 8x16 ${font8x16} 303 ;; 304 esac 305 306 # font 8x14 307 # 308 case ${font8x14} in 309 [Nn][Oo] | '') 310 ;; 311 *) 312 sc_init 313 echo -n ' font8x14'; vidcontrol < ${viddev} -f 8x14 ${font8x14} 314 ;; 315 esac 316 317 # font 8x8 318 # 319 case ${font8x8} in 320 [Nn][Oo] | '') 321 ;; 322 *) 323 sc_init 324 echo -n ' font8x8'; vidcontrol < ${viddev} -f 8x8 ${font8x8} 325 ;; 326 esac 327 328 # blank time 329 # 330 case ${blanktime} in 331 [Nn][Oo] | '') 332 ;; 333 *) 334 sc_init 335 echo -n ' blanktime'; vidcontrol < ${viddev} -t ${blanktime} 336 ;; 337 esac 338 339 # screen saver 340 # 341 case ${saver} in 342 [Nn][Oo] | '') 343 ;; 344 *) 345 sc_init 346 echo -n ' screensaver' 347 for i in `kldstat | awk '$5 ~ "_saver\.ko$" { print $5 }'`; do 348 kldunload ${i} 349 done 350 load_kld -e _saver ${saver}_saver 351 ;; 352 esac 353 354 # set this mode for all virtual screens 355 # 356 if [ -n "${allscreens_flags}" ]; then 357 sc_init 358 echo -n ' allscreens' 359 for ttyv in /dev/ttyv*; do 360 vidcontrol ${allscreens_flags} < ${ttyv} > ${ttyv} 2>&1 361 done 362 fi 363 364 [ -n "${_sc_initdone}" ] && echo '.' 365 if [ -n "${_sc_keymap_msg}" ]; then 366 echo 367 echo "WARNING:" 368 echo "${_sc_keymap_msg}." 369 echo 370 fi 371} 372 373load_rc_config $name 374run_rc_command $* 375 376