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# 28 29# PROVIDE: syscons 30# REQUIRE: LOGIN 31# KEYWORD: nojail 32 33. /etc/rc.subr 34 35name="syscons" 36desc="Configure the system console" 37extra_commands="setkeyboard" 38setkeyboard_cmd="syscons_setkeyboard" 39start_precmd="syscons_precmd" 40start_cmd="syscons_start" 41stop_cmd=":" 42 43# stdin must be redirected because it might be for a serial console 44# 45kbddev=/dev/ttyv0 46viddev=/dev/ttyv0 47 48_sc_config= 49_sc_console= 50_sc_initdone= 51_sc_keymap_msg= 52_sc_bootmethod= 53sc_init() 54{ 55 local bootmethod 56 57 if [ -z "${_sc_initdone}" ]; then 58 if [ -z "${_sc_console}" ]; then 59 if [ x`sysctl -n kern.vty` = x"vt" ]; then 60 _sc_console="vt" 61 else 62 _sc_console="syscons" 63 fi 64 _sc_config="${_sc_console}" 65 fi 66 if [ -z "${_sc_bootmethod}" ]; then 67 bootmethod=$(sysctl -qn machdep.bootmethod) 68 case ${bootmethod} in 69 UEFI) 70 _sc_bootmethod="uefi" 71 ;; 72 BIOS) 73 _sc_bootmethod="bios" 74 ;; 75 PVH) 76 _sc_bootmethod="pvh" 77 ;; 78 *) 79 _sc_bootmethod="uefi" # Default to UEFI 80 ;; 81 esac 82 fi 83 echo -n "Configuring ${_sc_config}:" 84 _sc_initdone=yes 85 fi 86} 87 88# syscons to vt migration helper 89lookup_keymap_for_vt() 90{ 91 keymap=`basename $1 .kbd` 92 case $keymap in 93hy.armscii-8) echo am;; 94be.iso.acc) echo be.acc;; 95be.iso) echo be;; 96bg.bds.ctrlcaps) echo bg.bds;; 97bg.phonetic.ctrlcaps) echo bg.phonetic;; 98br275.iso.acc) echo br;; 99br275.*) echo br.noacc;; 100by.*) echo by;; 101fr_CA.iso.acc) echo ca-fr;; 102swissgerman.macbook.acc) echo ch.macbook.acc;; 103swissgerman.iso.acc) echo ch.acc;; 104swissgerman.*) echo ch;; 105swissfrench.iso.acc) echo ch-fr.acc;; 106swissfrench.*) echo ch-fr;; 107ce.iso2) echo centraleuropean.qwerty;; 108colemak.iso15.acc) echo colemak.acc;; 109cs.*|cz.*) echo cz;; 110german.iso.acc) echo de.acc;; 111german.*) echo de;; 112danish.iso.acc) echo dk.acc;; 113danish.iso.macbook) echo dk.macbook;; 114danish.*) echo dk;; 115estonian.*) echo ee;; 116spanish.dvorak) echo es.dvorak;; 117spanish.iso*.acc) echo es.acc;; 118spanish.iso) echo es;; 119finnish.*) echo fi;; 120fr.macbook.acc) echo fr.macbook;; 121fr.iso.acc) echo fr.acc;; 122fr.iso) echo fr;; 123el.iso07) echo gr;; 124gr.us101.acc) echo gr.101.acc;; 125hr.iso) echo hr;; 126hu.iso2.101keys) echo hu.101;; 127hu.iso2.102keys) echo hu.102;; 128iw.iso8) echo il;; 129icelandic.iso.acc) echo is.acc;; 130icelandic.iso) echo is;; 131it.iso) echo it;; 132jp.106x) echo jp.capsctrl;; 133jp.106) echo jp;; 134kk.pt154.io) echo kz.io;; 135kk.pt154.kst) echo kz.kst;; 136latinamerican.iso.acc) echo latinamerican.acc;; 137lt.iso4) echo lt;; 138norwegian.iso) echo no;; 139norwegian.dvorak) echo no.dvorak;; 140dutch.iso.acc) echo nl;; 141eee_nordic) echo nordic.asus-eee;; 142pl_PL.dvorak) echo pl.dvorak;; 143pl_PL.ISO8859-2) echo pl;; 144pt.iso.acc) echo pt.acc;; 145pt.iso) echo pt;; 146ru.koi8-r.shift) echo ru.shift;; 147ru.koi8-r.win) echo ru.win;; 148ru.*) echo ru;; 149swedish.*) echo se;; 150si.iso) echo si;; 151sk.iso2) echo sk;; 152tr.iso9.q) echo tr;; 153ua.koi8-u.shift.alt) echo ua.shift.alt;; 154ua.*) echo ua;; 155uk.*-ctrl) echo uk.capsctrl;; 156uk.dvorak) echo uk.dvorak;; 157uk.*) echo uk;; 158us.iso.acc) echo us.acc;; 159us.pc-ctrl) echo us.ctrl;; 160us.iso) echo us;; 161 esac 162} 163 164kbdcontrol_load_keymap() 165{ 166 errmsg=`kbdcontrol < ${kbddev} -l ${keymap} 2>&1` 167 if [ -n "${errmsg}" -a "${_sc_console}" = "vt" ]; then 168 _sc_keymap_msg="${errmsg}" 169 keymap_vt=`lookup_keymap_for_vt ${keymap}` 170 if [ -n "${keymap_vt}" ]; then 171 errmsg=`kbdcontrol < ${kbddev} -l ${keymap_vt} 2>&1` 172 if [ -z "${errmsg}" ]; then 173 _sc_keymap_msg="New keymap: In /etc/rc.conf replace 'keymap=${keymap}' by 'keymap=${keymap_vt}'" 174 fi 175 else 176 _sc_keymap_msg="No replacement found for keymap '${keymap}'. 177You may try to convert your keymap file using 'convert-keymap.pl', which is 178part of the system sources and located in /usr/src/tools/tools/vt/keymaps/" 179 fi 180 fi 181} 182 183# helper 184syscons_configure_keyboard() 185{ 186 # keymap 187 # 188 case ${keymap} in 189 NO | '') 190 ;; 191 *) 192 sc_init 193 echo -n ' keymap'; kbdcontrol_load_keymap 194 ;; 195 esac 196 197 # keyrate 198 # 199 case ${keyrate} in 200 [Nn][Oo] | '') 201 ;; 202 *) 203 sc_init 204 echo -n ' keyrate'; kbdcontrol < ${kbddev} -r ${keyrate} 205 ;; 206 esac 207 208 # keybell 209 # 210 case ${keybell} in 211 [Nn][Oo] | '') 212 ;; 213 *) 214 sc_init 215 echo -n ' keybell'; kbdcontrol < ${kbddev} -b ${keybell} 216 ;; 217 esac 218 219 # change function keys 220 # 221 case ${keychange} in 222 [Nn][Oo] | '') 223 ;; 224 *) 225 sc_init 226 echo -n ' keychange' 227 set -- ${keychange} 228 while [ $# -gt 0 ]; do 229 kbdcontrol <${kbddev} -f "$1" "$2" 230 shift; shift 231 done 232 ;; 233 esac 234 235 # set this keyboard mode for all virtual terminals 236 # 237 if [ -n "${allscreens_kbdflags}" ]; then 238 sc_init 239 echo -n ' allscreens_kbd' 240 for ttyv in /dev/ttyv*; do 241 kbdcontrol ${allscreens_kbdflags} < ${ttyv} > ${ttyv} 2>&1 242 done 243 fi 244} 245 246syscons_setkeyboard() 247{ 248 kbd=$1 249 250 if [ -z "${kbd}" ]; then 251 return 1 252 fi 253 254 # Check if the kbdmux(4) is the current active keyboard 255 kbdcontrol -i < ${kbddev} | grep kbdmux > /dev/null 2>&1 256 if [ $? -ne 0 ]; then 257 kbdcontrol -k ${kbd} < ${kbddev} > /dev/null 2>&1 258 fi 259 260 _sc_config="keyboard" 261 syscons_configure_keyboard 262 263 # Terminate keyboard configuration line and reset global variables. 264 # 265 if [ -n "${_sc_initdone}" ]; then 266 echo '.' 267 _sc_config="${_sc_console}" 268 _sc_initdone= 269 fi 270} 271 272syscons_precmd() 273{ 274 if [ ! -c $kbddev ] 275 then 276 return 1 277 fi 278 return 0 279} 280 281syscons_bios_start() 282{ 283 # cursor type 284 # 285 case ${cursor} in 286 [Nn][Oo] | '') 287 ;; 288 *) 289 sc_init 290 echo -n ' cursor'; vidcontrol < ${viddev} -c ${cursor} 291 ;; 292 esac 293 294 # screen mapping 295 # 296 case ${scrnmap} in 297 [Nn][Oo] | '') 298 ;; 299 *) 300 sc_init 301 echo -n ' scrnmap'; vidcontrol < ${viddev} -l ${scrnmap} 302 ;; 303 esac 304 305 # blank time 306 # 307 case ${blanktime} in 308 [Nn][Oo] | '') 309 ;; 310 *) 311 sc_init 312 echo -n ' blanktime'; vidcontrol < ${viddev} -t ${blanktime} 313 ;; 314 esac 315 316 # screen saver 317 # 318 case ${saver} in 319 [Nn][Oo] | '') 320 ;; 321 *) 322 sc_init 323 echo -n ' screensaver' 324 for i in `kldstat | awk '$5 ~ "_saver\.ko$" { print $5 }'`; do 325 kldunload ${i} 326 done 327 load_kld -e _saver ${saver}_saver 328 ;; 329 esac 330} 331 332syscons_start() 333{ 334 # keyboard 335 # 336 if [ -n "${keyboard}" ]; then 337 syscons_setkeyboard ${keyboard} 338 fi 339 340 syscons_configure_keyboard 341 342 if [ "${_sc_bootmethod}" = "bios" ]; then 343 syscons_bios_start 344 fi 345 346 # font 8x16 347 # 348 case ${font8x16} in 349 [Nn][Oo] | '') 350 ;; 351 *) 352 sc_init 353 echo -n ' font8x16'; vidcontrol < ${viddev} -f 8x16 ${font8x16} 354 ;; 355 esac 356 357 # font 8x14 358 # 359 case ${font8x14} in 360 [Nn][Oo] | '') 361 ;; 362 *) 363 sc_init 364 echo -n ' font8x14'; vidcontrol < ${viddev} -f 8x14 ${font8x14} 365 ;; 366 esac 367 368 # font 8x8 369 # 370 case ${font8x8} in 371 [Nn][Oo] | '') 372 ;; 373 *) 374 sc_init 375 echo -n ' font8x8'; vidcontrol < ${viddev} -f 8x8 ${font8x8} 376 ;; 377 esac 378 379 # set this mode for all virtual screens 380 # 381 if [ -n "${allscreens_flags}" ]; then 382 sc_init 383 echo -n ' allscreens' 384 for ttyv in /dev/ttyv*; do 385 vidcontrol ${allscreens_flags} < ${ttyv} > ${ttyv} 2>&1 386 done 387 fi 388 389 [ -n "${_sc_initdone}" ] && echo '.' 390 if [ -n "${_sc_keymap_msg}" ]; then 391 echo 392 echo "WARNING:" 393 echo "${_sc_keymap_msg}." 394 echo 395 fi 396} 397 398load_rc_config $name 399 400# doesn't make sense to run in a svcj: config setting 401syscons_svcj="NO" 402 403run_rc_command $* 404 405