D7net Mini Sh3LL v1
Current File : //proc/562/../3086842/../29/../84/../558/../562/../600/../../bin/setupcon |
#!/bin/sh
# setupcon -- setup the font and keyboard on the Linux console
# Copyright (C) 2011 Anton Zinoviev <anton@lml.bas.bg>
# Permission is hereby granted, free of charge, to any person
# obtaining a copy of this file (the "Program"), to deal in the
# Program without restriction, including without limitation the
# rights to use, copy, modify, merge, publish, distribute,
# sublicense, and/or sell copies of the Program, and to permit
# persons to whom the Program is furnished to do so, subject to
# the following conditions: The above copyright notice and this
# permission notice shall be included in all copies or substantial
# portions of the Program.
# THE PROGRAM IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
# OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
# HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
# FROM, OUT OF OR IN CONNECTION WITH THE PROGRAM OR THE USE OR
# OTHER DEALINGS IN THE PROGRAM.
###########################################################################
do_font='' # configure font
do_kbd='' # configure the keyboard
do_term='' # configure the terminal
do_check=yes # test whether we are on the console
do_verbose='' # explain what is being doing
do_save='' # save the required files in /etc/console-setup
do_saveonly='' # save the required files, do not configure anything
do_currenttty='' # configure only current tty
savekbdfile='' # save the keyboard map in $savekbdfile
do_printonly='' # only print the configuration commands
setupdir='' # directory for --setup-dir
SETUP=''
# The same as /usr/bin/which - in order to make "which" available before
# /usr is mounted
which () {
local IFS
IFS=:
for i in $PATH; do
if [ -f "$i/$1" -a -x "$i/$1" ]; then
echo "$i/$1"
return 0
fi
done
return 1
}
# Create a temporary file name and set TMPFILE to its name. Early in
# the boot process /tmp is mounted read-only, so lets have some other
# options... I am not sure all non-GNU versions of mktemp understand
# the -q option so redirections of stderr are used instead.
tempfiles=''
trap 'rm -f $tempfiles >/dev/null 2>&1' 0
trap "exit 2" 1 2 3 13 15
tempfile () {
if \
TMPFILE=`mktemp /run/tmpkbd.XXXXXX 2>/dev/null` \
|| TMPFILE=`mktemp /tmp/tmpkbd.XXXXXX 2>/dev/null`
then
tempfiles="$tempfiles $TMPFILE"
return 0
else
TMPFILE=''
return 1
fi
}
# Print the arguments to stderr if $do_verbose is yes
report () {
local nl
case "$1" in
-n)
shift
nl=''
;;
*)
nl='
'
;;
esac
if [ "$do_verbose" ]; then
echo -n "$@" "$nl" >&2
fi
}
# Execute a command on every console terminal screen specified in
# $ACTIVE_CONSOLES.
#
# 1st argument: plain=execute only once with no tty change,
# out=execute with standard output redirected to the tty, in=the same
# but the standard input is being redirected, 'other argument'=do not
# redirect the standard input or output but use this as a tty option.
#
# 2nd argument: option(s) for verbose output. NONE=no output,
# FORK=run the command in background, 'other argument'=give this
# option to the executed command.
#
# 3rd argument: command to run; other arguments: other options
#
# Example 1: run '-C ' -v setfont font.psf
# If ACTIVE_CONSOLES='/dev/tty1 /dev/tty2 /dev/tty3', then this results in
#
# setfont -C /dev/tty1 font.psf -v
# setfont -C /dev/tty2 font.psf -v
# setfont -C /dev/tty3 font.psf -v
#
# or
#
# setfont -C /dev/tty1 font.psf >/dev/null 2>&1
# setfont -C /dev/tty2 font.psf >/dev/null 2>&1
# setfont -C /dev/tty3 font.psf >/dev/null 2>&1
#
# depending on the value of $do_verbose
#
# Example 2: `run plain FORK echo hello` results in `echo hello`
# regardless of the value of $do_verbose.
#
# Example 3: `run plain NONE echo hello` results in `echo hello` or
# `echo hello >/dev/null 2>&1` depending on the value of $do_verbose.
run () {
local ttyarg cmd verbose tty x
ttyarg="$1"
verbose="$2"
cmd="$3"
shift; shift; shift
if [ -z "$ACTIVE_CONSOLES" -o -n "$do_currenttty" ]; then
ttyarg=plain
fi
case "$ttyarg" in
plain)
if [ "$setupdir$do_printonly" ]; then
if [ "$verbose" = NONE ]; then
# keep the space after >
SETUP="$SETUP$cmd $@ > /dev/null
"
else
SETUP="$SETUP$cmd $@
"
fi
elif [ "$do_verbose" ]; then
case "$verbose" in
NONE)
report executing $cmd "$@".
$cmd "$@"
;;
FORK)
# no arguments to suppress '\033%%@' and '\033%%G'
report executing $cmd.
$cmd "$@" &
;;
*)
report executing $cmd "$@".
$cmd "$@" $verbose
;;
esac
else
case "$verbose" in
NONE)
report executing $cmd "$@".
$cmd "$@" >/dev/null 2>&1
;;
FORK)
# no arguments to suppress '\033%%@' and '\033%%G'
report executing $cmd.
$cmd "$@" &
;;
*)
report executing $cmd "$@".
$cmd "$@"
;;
esac
fi
;;
in)
for tty in $ACTIVE_CONSOLES; do
if [ "$setupdir$do_printonly" ]; then
# keep the space around > and <
if [ "$verbose" = NONE ]; then
SETUP="$SETUP$cmd $@ < $tty > /dev/null
"
else
SETUP="$SETUP$cmd $@ < $tty
"
fi
elif [ -r $tty ]; then
report -n on $tty ''
run plain "$verbose" "$cmd" "$@" <$tty
else
report No read access from $tty. Can not execute $cmd.
fi
done
;;
out)
for tty in $ACTIVE_CONSOLES; do
if [ "$setupdir$do_printonly" ]; then
# keep the space between > and $tty
SETUP="$SETUP$cmd $@ > $tty
"
elif [ -w $tty ]; then
report -n on $tty ''
run plain "$verbose" "$cmd" "$@" >$tty
else
report No write access to $tty. Can not execute $cmd.
fi
done
;;
*)
for tty in $ACTIVE_CONSOLES; do
x="${ttyarg}$tty"
run plain "$verbose" "$cmd" $x "$@"
done
;;
esac
}
# Search a file and return the full file name if found.
# The filename may include wildcards and may not include space.
# Example: findfile share/consolefonts Uni3-*.psf.gz
# Result: /usr/share/consolefonts/Uni3-Fixed13.psf.gz
findfile () {
local f
case "$2" in
/*)
if [ -f "$2" ]; then
echo "$2"
return 0
fi
;;
esac
for f in "$installdir"/$1/$2 \
/usr/local/$1/$2 \
/usr/$1/$2 \
/etc/console-setup/cached_$2 \
/etc/console-setup/$2 \
"$installdir"/etc/console-setup/cached_$2 \
"$installdir"/etc/console-setup/$2
do
if [ -f "$f" ]; then
echo "$f"
return 0
fi
done
report Unable to find "$2".
}
# Return code 0: we are on the console; 1: we are not on the console
test_console () {
local ok
ok=0
if which tty >/dev/null; then
case "`tty`" in
/dev/tty[1-9]*|/dev/vc/[0-9]*|/dev/console|/dev/ttyv[0-9]*)
return 0
;;
esac
ok=1
fi
if which kbd_mode >/dev/null; then
mode="`(LC_ALL=C; export LC_ALL; kbd_mode) 2>&1`"
mode=${mode#The keyboard is in }
case "$mode" in
Unicode*|default*|xlate*) return 0 ;;
esac
ok=1
fi
if which vidcontrol >/dev/null; then
if vidcontrol -i adapter >&- 2>&-; then
return 0
fi
ok=1
fi
return $ok
}
###########################################################################
### PROCESS THE COMMAND LINE ARGUMENTS
###########################################################################
while [ "$1" ]; do
case "$1" in
-k|--keyboard-only)
do_kbd=yes
;;
-f|--font-only)
do_font=yes
;;
-t|--terminal-only)
do_term=yes
;;
--current-tty)
do_currenttty=yes
;;
-v|--verbose)
do_verbose=yes
;;
--force)
do_check=''
;;
--save)
do_save=yes
;;
--save-only)
do_save=yes
do_saveonly=yes
do_check=''
;;
--save-keyboard)
shift
savekbdfile="$1"
do_saveonly=yes
do_check=''
;;
--print-commands-only)
do_printonly=yes
do_check=''
;;
--setup-dir)
shift
do_kbd=yes
do_currenttty=yes
setupdir="$1"
do_check=''
;;
-h|--help)
cat >&2 <<EOF
Usage: setupcon [OPTION] [VARIANT]
Sets up the font and the keyboard on Linux console.
-k, --keyboard-only setup the keyboard only, do not setup the font
-f, --font-only setup the font only, do not setup the keyboard
-t, --terminal-only setup the terminal only
--current-tty setup only the current virtual terminal
--force do not check whether we are on the console
-v, --verbose explain what is being doing, try it if s.t. goes wrong
--save copy the font and the console map in /etc/console-setup,
update /etc/console-setup/cached.*
--save-only only save; don't setup keyboard/font immediately
(implies --force)
--print-commands-only
print the configuration commands, do not configure
--save-keyboard FILE, --setup-dir DIR options for initrd builders
-h, --help display this help and exit
If VARIANT is not specified setupcon looks for the configuration files
(in this order) ~/.console-setup and if this doesn't exist then the
combination /etc/default/keyboard + /etc/default/console-setup. When
a VARIANT is specified then setupcon looks for the configuration files
~/.console-setup.VARIANT and /etc/default/console-setup.VARIANT.
EOF
exit 0
;;
-*)
echo "setupcon: Unrecognised option $1" >&2
exit 1
;;
*)
if [ -z "$VARIANT" ]; then
VARIANT="$1"
else
echo "setupcon: Two variants specified: $VARIANT and $1" >&2
exit 1
fi
;;
esac
shift
done
if [ -z "$do_saveonly$do_kbd$do_font$do_term" ]; then
do_kbd=yes
do_font=yes
do_term=yes
fi
# installdir
installdir=${0%/*}
case "$installdir" in
*/bin) installdir=${installdir%/bin} ;;
*) installdir=$installdir/.. ;;
esac
[ -n "$installdir" -a -d "$installdir"/bin ] || installdir=/usr
case "$installdir" in
/*) ;;
*) installdir="`pwd`\$installdir" ;;
esac
###########################################################################
### READ THE CONFIGURATION FILES
###########################################################################
if [ "$VARIANT" ]; then
VARIANT=".$VARIANT"
fi
USER_CONFIG=${HOME}/.console-setup"$VARIANT"
USER_CONFIG2=${HOME}/.keyboard"$VARIANT"
MAIN_CONFIG=/etc/default/keyboard"$VARIANT"
[ -f "$MAIN_CONFIG" ] \
|| [ ! -f "$installdir"/etc/default/keyboard"$VARIANT" ] \
|| MAIN_CONFIG="$installdir"/etc/default/keyboard"$VARIANT"
MAIN_CONFIG2=/etc/default/console-setup"$VARIANT"
[ -f "$MAIN_CONFIG2" ] \
|| [ ! -f "$installdir"/etc/default/console-setup"$VARIANT" ] \
|| MAIN_CONFIG2="$installdir"/etc/default/console-setup"$VARIANT"
if [ -f "$USER_CONFIG" -o -f "$USER_CONFIG2" ]; then
CONFIG="$USER_CONFIG"
CONFIG2="$USER_CONFIG2"
elif [ -f "$MAIN_CONFIG" -o -f "$MAIN_CONFIG2" ]; then
CONFIG="$MAIN_CONFIG"
CONFIG2="$MAIN_CONFIG2"
else
echo "setupcon: None of $MAIN_CONFIG, $MAIN_CONFIG2, $USER_CONFIG, $USER_CONFIG2 exists." >&2
exit 1
fi
if [ -f "$CONFIG2" ]; then
. "$CONFIG2"
else
# in order to permit "if [ cached.kmap.gz -ot $CONFIG2 ]; then ... fi"
CONFIG2="$CONFIG"
fi
if [ -f "$CONFIG" ]; then
. "$CONFIG"
fi
###########################################################################
### INITIALIZATION AND DEFAULT VALUES
###########################################################################
# do_verbose
# The variable VERBOSE_OUTPUT is obsoleted in favour of the option --verbose
if [ "$VERBOSE_OUTPUT" = yes ]; then
do_verbose=yes
fi
# kernel
kernel=unknown
if which uname >/dev/null; then
case "`uname`" in
*Linux*) kernel=linux ;;
*FreeBSD*) kernel=freebsd ;;
*)
echo 'setupcon: Unknown kernel (only Linux and FreeBSD are supported).' >&2
exit 1
;;
esac
fi
# do_save
if [ -n "$do_save" ]; then
if [ ! -d /usr/share ]; then
echo setupcon: It seems /usr is not mounted. Will not save files in /etc. >&2
do_save=''
fi
fi
# ACTIVE_CONSOLES
# When ACTIVE_CONSOLES=guess the following will result in ACTIVE_CONSOLES=''
ACTIVE_CONSOLES=$(
for tty in $ACTIVE_CONSOLES; do
if [ -e $tty ]; then
echo $tty
fi
done
)
if [ -z "$ACTIVE_CONSOLES" ]; then
# Some crude guess
# Conf. files:
# BSD: /etc/ttys
# Sys V init: /etc/inittab
# Upstart: /etc/init/*
# Devices:
# Linux: /dev/tty[1-9][0-9]*
# FreeBSD: /dev/ttyv[0-9a-f]
for tty in \
$(cat /etc/inittab /etc/init/* /etc/ttys 2>/dev/null \
| grep getty \
| egrep '([[:blank:]]|^)tty([1-9][0-9]*|v[0-9a-f])([[:blank:]]|$)' \
| sed -e '/^ *#/d' \
-e 's/.*[[:blank:]]\(tty[1-9][0-9]*\).*/\1/' \
-e 's/.*[[:blank:]]\(ttyv[0-9a-f]\).*/\1/')
do
if [ -e /dev/$tty ]; then
ACTIVE_CONSOLES="$ACTIVE_CONSOLES /dev/$tty"
fi
done
fi
if [ -z "$ACTIVE_CONSOLES" ]; then
case "$kernel" in
linux) ACTIVE_CONSOLES=$(ls /dev/tty[1-6] 2>/dev/null) ;;
freebsd) ACTIVE_CONSOLES=$(ls /dev/ttyv[0-3] 2>/dev/null) ;;
esac
report Can not find the active virtual consoles, \
assuming ACTIVE_CONSOLES=\"$ACTIVE_CONSOLES\" >&2
else
report Configuring $ACTIVE_CONSOLES
fi
# CHARMAP
if [ "$CHARMAP" = guess -o -z "$CHARMAP" ]; then
CHARMAP=''
if which locale >/dev/null; then
CHARMAP=`locale charmap`
fi
fi
CHARMAP=${CHARMAP:-UTF-8}
# FreeBSD uses ISO8859-1, GNU uses ISO-8859-1, we use the GNU names
case "$CHARMAP" in
ISO8859-*) CHARMAP="ISO-8859-${CHARMAP#ISO8859-}" ;;
US-ASCII|ANSI*) CHARMAP=ISO-8859-1 ;;
esac
report The charmap is $CHARMAP
# unicode
if \
[ "$CHARMAP" = UTF-8 ]
then
unicode=yes
else
unicode=''
fi
# do_font
if [ "$do_font" ]; then
case "$kernel" in
linux)
if which consolechars >/dev/null ; then
do_font=linuxct
elif which setfont >/dev/null ; then
do_font=linuxkbd
else
echo "setupcon: Neither setfont nor consolechars is accessible. No font will be configured." >&2
do_font=''
fi
;;
freebsd)
if which vidcontrol >/dev/null ; then
do_font=freebsd
else
echo "setupcon: vidcontrol is not accessible. No font will be configured." >&2
do_font=''
fi
;;
esac
fi
# Due to bug in splashy and usplash: do not load fonts (#540314)
if which pidof >/dev/null; then
if pidof splashy > /dev/null || pidof usplash > /dev/null; then
do_font=''
fi
fi
# CODESET
[ "$CODESET" != guess ] || CODESET=''
if [ -z "$CODESET" ]; then
case "$CHARMAP" in
UTF-8) CODESET=Uni2;;
ARMSCII-8) CODESET=Armenian ;;
CP1251) CODESET=CyrSlav ;;
CP1255) CODESET=Hebrew ;;
CP1256) CODESET=Arabic ;;
GEORGIAN-ACADEMY) CODESET=Georgian ;;
GEORGIAN-PS) CODESET=Georgian ;;
IBM1133) CODESET=Lao ;;
ISIRI-3342) CODESET=Arabic ;;
ISO-8859-1) CODESET=Lat15 ;;
ISO-8859-2) CODESET=Lat2 ;;
ISO-8859-3) CODESET=Lat38 ;;
ISO-8859-4) CODESET=Lat7 ;; # sometimes Lat15
ISO-8859-5) CODESET=CyrSlav ;;
ISO-8859-6) CODESET=Arabic ;;
ISO-8859-7) CODESET=Greek ;;
ISO-8859-8) CODESET=Hebrew ;;
ISO-8859-9) CODESET=Lat15 ;;
ISO-8859-10) CODESET=Lat15 ;;
ISO-8859-11) CODESET=Thai ;;
ISO-8859-13) CODESET=Lat7 ;;
ISO-8859-14) CODESET=Lat38 ;;
ISO-8859-15) CODESET=Lat15 ;;
ISO-8859-16) CODESET=Lat2 ;;
KOI8-R) CODESET=CyrKoi ;;
KOI8-U) CODESET=CyrKoi ;;
TIS-620) CODESET=Thai ;;
VISCII) CODESET=Vietnamese ;;
*)
if [ "$do_font" ]; then
echo Unsupported charmap $CHARMAP >&2
exit 1
fi
;;
esac
if [ "$kernel" = freebsd ]; then
# 512 character fonts are not supported on FreeBSD
case "$CODESET" in
Uni*|Vietnamese|Arabic|Ethiopian) CODESET=Lat15 ;;
esac
fi
fi
if [ "$CHARMAP" != UTF-8 -a "$kernel" = freebsd ]; then
if \
[ -z "`findfile share/syscons/scrnmaps ${CHARMAP}_${CODESET}.scm`" ]
then
report "Ignoring the CODESET specification ($CODESET)."
CODESET=`findfile share/syscons/scrnmaps ${CHARMAP}_*.scm`
if [ -n "$do_font" -a -z "$CODESET" ]; then
echo setupcon: Unsupported charmap $CHARMAP >&2
exit 1
fi
CODESET=${CODESET%%*/}
CODESET=${CODESET#.scm*}
CODESET=${CODESET%*_}
report Using $CODESET instead.
fi
fi
# FONTSIZE
if [ -z "$FONTSIZE" -o "$FONTSIZE" = guess ]; then
FONTSIZE=16
fi
case "$FONTSIZE" in
8x*)
FONTSIZE=${FONTSIZE#*x}
;;
*x8)
FONTSIZE=${FONTSIZE%x*}
;;
*x*)
a=${FONTSIZE%x*}
b=${FONTSIZE#*x}
if [ "$a" -lt "$b" ]; then
FONTSIZE=${b}x${a}
fi
;;
esac
# mapdir, fontdir, stdfont, stdfontfallback
case "$kernel" in
linux)
mapdir=share/consoletrans
stdmap=$CHARMAP.acm.gz
fontdir=share/consolefonts
stdfont=$CODESET-$FONTFACE$FONTSIZE.psf.gz
# [A-WXYZa-wyz] is a funny way to say [A-Za-wyz]. In some locales
# [A-Z] includes x and we don't want this.
stdfontfallback=$CODESET-*[A-WXYZa-wyz]$FONTSIZE.psf.gz
;;
freebsd)
mapdir=share/syscons/scrnmaps
stdmap=${CHARMAP}_${CODESET}.scm
fontdir=share/syscons/fonts
stdfont16=$CODESET-${FONTFACE}16.fnt
stdfont14=$CODESET-${FONTFACE}14.fnt
stdfont8=$CODESET-${FONTFACE}8.fnt
stdfontfallback16=$CODESET-*[A-WXYZa-wyz]16.fnt
stdfontfallback14=$CODESET-*[A-WXYZa-wyz]14.fnt
stdfontfallback8=$CODESET-*[A-WXYZa-wyz]8.fnt
;;
esac
# CONSOLE_MAP
CONSOLE_MAP=${CONSOLE_MAP:-$ACM}
[ -z "$CONSOLE_MAP" ] || CONSOLE_MAP=`findfile $mapdir "$CONSOLE_MAP"`
[ -n "$CONSOLE_MAP" -o "$CHARMAP" = UTF-8 ] || CONSOLE_MAP=`findfile $mapdir $stdmap`
[ -n "$CONSOLE_MAP" -o "$CHARMAP" = UTF-8 ] || CONSOLE_MAP=`findfile $mapdir ${stdmap%.gz}`
# FONTFILES
FONTFILES=''
if [ "$FONT" ]; then
for f in $FONT; do
FONTFILES="$FONTFILES `findfile $fontdir $f`"
RES=`findfile $fontdir $f`
if [ -z "$RES" ]; then
fdec="${f%.gz}"
RES=`findfile $fontdir $fdec`
fi
FONTFILES="$FONTFILES $RES"
done
fi
FONTFILES=`echo $FONTFILES` # remove extra spaces
if [ -n "$FONTFACE" -a -z "$FONTFILES" ]; then
case "$kernel" in
linux)
# the following will fail if FONTFACE=guess ($stdfont will
# match nothing)
FONTFILES=`findfile $fontdir $stdfont`
[ "$FONTFILES" ] || FONTFILES=`findfile $fontdir $stdfontfallback`
case "$FONTFILES" in
*[0-9]x[1-9]*.psf.gz)
if which consolechars >/dev/null; then
echo "\
The consolechars utility from the \"console-tools\" package can load only fonts
with 8 pixel width matrix. Please install the setfont utility from the package
\"kbd\" or reconfigure the font size." >&2
fi
;;
esac
;;
freebsd)
FONTFILES=`findfile $fontdir $stdfont16`
[ "$FONTFILES" ] || FONTFILES=`findfile $fontdir $stdfontfallback16`
font=`findfile $fontdir $stdfont14`
[ "$font" ] || font=`findfile $fontdir $stdfontfallback14`
[ -z "$font" ] || FONTFILES="$FONTFILES $font"
font=`findfile $fontdir $stdfont8`
[ "$font" ] || font=`findfile $fontdir $stdfontfallback8`
[ -z "$font" ] || FONTFILES="$FONTFILES $font"
;;
esac
if [ -n "$do_font" -a -z "$FONTFILES" ]; then
echo setupcon: Unable to find the required font. No font will be configured. >&2
do_font=''
fi
fi
# FONTMAPFILE
FONTMAPFILE=''
if [ "$kernel" = linux -a -n "$FONT_MAP" ]; then
FONTMAPFILE=`findfile share/consoletrans "$FONT_MAP"`
fi
# XKBMODEL
if \
[ -n "$do_kbd$do_save$savekbdfile$setupdir$do_printonly" \
-a -z "$XKBMODEL" ]
then
echo setupcon: The keyboard model is unknown, assuming \'pc105\'. Keyboard may be configured incorrectly. >&2
XKBMODEL='pc105'
fi
[ -n "$XKBMODEL" -o -z "$savekbdfile" ] || exit 1
# Backwards-compatibility with Ubuntu-specific preseeding
if [ "$XKBMODEL" = SKIP ]; then
XKBMODEL=
fi
# do_kbd
[ "$XKBMODEL$KMAP" ] || do_kbd=''
if [ "$do_kbd" ]; then
case "$kernel" in
linux)
if which loadkeys >/dev/null; then
do_kbd=linux
else
echo setupcon: loadkeys is not accessible. Keyboard will not be configured.>&2
do_kbd=''
fi
;;
freebsd)
if which kbdcontrol >/dev/null; then
do_kbd=freebsd
else
echo setupcon: kbdcontrol is not accessible. Keyboard will not be configured.>&2
do_kbd=''
fi
;;
esac
fi
# acm_option
if [ "$CHARMAP" != UTF-8 ]; then
acm_option="-charmap $CHARMAP"
elif [ "$kernel" = freebsd ]; then
acm_option='-charmap ISO-8859-1'
else
acm_option=''
fi
# rules_option
if [ "$XKBRULES" ]; then
rules_option="-rules $XKBRULES"
else
rules_option=''
fi
# backspace
case "$kernel" in
linux) backspace='del' ;;
freebsd) backspace='bs' ;;
esac
case \
"`(stty -a \
| egrep '(^| )erase *=' \
| sed -e 's/.* erase *= *//' -e 's/^erase *= *//' -e 's/[; ].*//') \
2>/dev/null`"
in
^\?) backspace='del' ;;
^h|^H) backspace='bs' ;;
esac
case "$BACKSPACE" in
del) backspace='del' ;;
bs) backspace='bs' ;;
esac
case "$backspace" in
del) report BackSpace is ^? ;;
bs) report BackSpace is ^h ;;
*) echo setupcon: Wrong BackSpace option >&2 ;;
esac
# do_term
if [ "$do_term" ]; then
case "$kernel" in
linux)
do_term=linux
;;
freebsd)
do_term=freebsd
;;
esac
fi
# cached
case "$kernel" in
linux)
cached=/etc/console-setup/cached_${CHARMAP}_$backspace$VARIANT.kmap.gz
;;
freebsd)
cached=/etc/console-setup/cached_${CHARMAP}_$backspace$VARIANT.kbd
;;
esac
# savekbdfile
if \
[ -z "$savekbdfile" -a -n "$do_save" ] \
&& [ ! -f "$cached" \
-o ! "$CONFIG" -ot "$cached" \
-o ! "$CONFIG2" -ot "$cached" ]
then
savekbdfile="$cached"
fi
[ "$XKBMODEL" ] || savekbdfile=''
if [ "$kernel" = linux ] && ! which gzip >/dev/null; then
savekbdfile=''
echo setupcon: gzip is not accessible. Will not save cached keyboard map. >&2
fi
# KMAP
if [ -n "$KMAP" -a ! -f "$KMAP" ]; then
echo setupcon: $KMAP does not exist. >&2
KMAP=''
fi
###########################################################################
### SAVE THE FILES IN /etc
###########################################################################
for i in /etc/console-setup $CONSOLE_MAP $FONTFILES $FONTMAPFILE $savekbdfile; do
if [ "$i" = "${i#/etc/console-setup}" -a -n "$do_save" ]; then
if \
! touch /etc/console-setup/cached_rwtest 2>/dev/null \
|| ! rm /etc/console-setup/cached_rwtest 2>/dev/null
then
echo setupcon: /etc/console-setup is not writable. No files will be saved there. >&2
do_save=''
fi
break
fi
done
if [ -n "$do_save" ]; then
case "$CONSOLE_MAP" in
/etc/console-setup/*) ;;
?*)
console_map_dec="${CONSOLE_MAP%.gz}"
if [ "$console_map_dec" = "$CONSOLE_MAP" ]; then
cp "$CONSOLE_MAP" /etc/console-setup/
else
gunzip -c "$CONSOLE_MAP" >"/etc/console-setup/${console_map_dec##*/}"
fi
rm -f "/etc/console-setup/${console_map_dec##*/}.gz"
;;
esac
for font in $FONTFILES; do
case "$font" in
/etc/console-setup/*) ;;
?*) cp "$font" /etc/console-setup/ ;;
esac
done
case "$FONTMAPFILE" in
/etc/console-setup/*) ;;
?*) cp "$FONTMAPFILE" /etc/console-setup/ ;;
esac
fi
if [ "$savekbdfile" ]; then
case "$kernel" in
linux)
tempfile || { echo setupcon: Can not create temporary file >&2; exit 1; }
{
$installdir/bin/ckbcomp -backspace "$backspace" $acm_option \
$rules_option -model "$XKBMODEL" \
"$XKBLAYOUT" "$XKBVARIANT" "$XKBOPTIONS" >$TMPFILE \
&& gzip -9n <$TMPFILE >"$savekbdfile"
} || exit 1
;;
freebsd)
$installdir/bin/ckbcomp -freebsd -backspace "$backspace" \
$acm_option $rules_option -model "$XKBMODEL" \
"$XKBLAYOUT" "$XKBVARIANT" "$XKBOPTIONS" >"$savekbdfile" \
|| exit 1
;;
esac
fi
if [ -n "$do_save" ]; then
case "$CONSOLE_MAP" in
/etc/console-setup/*) ;;
?*) cp "$CONSOLE_MAP" /etc/console-setup/cached_"${CONSOLE_MAP##*/}" ;;
esac
for font in $FONTFILES; do
case "$font" in
/etc/console-setup/*) ;;
?*) cp "$font" /etc/console-setup/cached_"${font##*/}" ;;
esac
done
case "$FONTMAPFILE" in
/etc/console-setup/*) ;;
?*) cp "$FONTMAPFILE" /etc/console-setup/cached_"${FONTMAPFILE##*/}" ;;
esac
if [ "$kernel" = linux ]; then
commands_k=$($0 -k --print-commands-only)
commands_f=$($0 -f --current-tty --print-commands-only)
commands_t=$($0 -t --current-tty --print-commands-only)
cat >/etc/console-setup/cached_setup_keyboard.sh <<EOF
#!/bin/sh
if [ -f /run/console-setup/keymap_loaded ]; then
rm /run/console-setup/keymap_loaded
exit 0
fi
$commands_k
EOF
cat >/etc/console-setup/cached_setup_font.sh <<EOF
#!/bin/sh
$commands_f
if ls /dev/fb* >/dev/null 2>/dev/null; then
for i in /dev/vcs[0-9]*; do
{ :
$commands_f
} < /dev/tty\${i#/dev/vcs} > /dev/tty\${i#/dev/vcs}
done
fi
mkdir -p /run/console-setup
> /run/console-setup/font-loaded
for i in /dev/vcs[0-9]*; do
{ :
$commands_t
} < /dev/tty\${i#/dev/vcs} > /dev/tty\${i#/dev/vcs}
done
EOF
cat >/etc/console-setup/cached_setup_terminal.sh <<EOF
#!/bin/sh
{ :
$commands_t
} < /dev/tty\${1#vcs} > /dev/tty\${1#vcs}
EOF
chmod +x /etc/console-setup/cached_setup_keyboard.sh \
/etc/console-setup/cached_setup_font.sh \
/etc/console-setup/cached_setup_terminal.sh
fi
fi
###########################################################################
### ARE WE ON THE CONSOLE?
###########################################################################
if [ "$do_check" ]; then
if ! test_console; then
echo setupcon: We are not on the console, the console is left unconfigured. >&2
exit 0
fi
fi
###########################################################################
### OUTPUT
###########################################################################
# Video mode
if [ "$VIDEOMODE" ]; then
case "$do_font" in
freebsd)
run in '' vidcontrol "$VIDEOMODE"
;;
linux*)
# this is a bit pointless as vesafb doesn't support changing mode
if which fbset >/dev/null; then
run plain '' fbset -a "$VIDEOMODE"
else
report fbset is not installed
fi
;;
esac
fi
# Load the font(s)
if [ "$FONTFILES" ]; then
case "$do_font" in
freebsd)
if [ -z "$unicode" ]; then
for font in $FONTFILES; do
run plain '' vidcontrol -f $font
done
if [ "$CONSOLE_MAP" ]; then
run plain '' vidcontrol -l "$CONSOLE_MAP"
fi
fi
;;
linuxkbd)
if [ "$FONTMAPFILE" ]; then
if [ "$CONSOLE_MAP" ]; then
run '-C ' -v setfont $FONTFILES -u "$FONTMAPFILE" -m "$CONSOLE_MAP"
else
run '-C ' -v setfont $FONTFILES -u "$FONTMAPFILE"
fi
else
if [ "$CONSOLE_MAP" ]; then
run '-C ' -v setfont $FONTFILES -m "$CONSOLE_MAP"
else
run '-C ' -v setfont $FONTFILES
fi
fi
;;
linuxct)
if [ "$FONTMAPFILE" ]; then
if [ "$CONSOLE_MAP" ]; then
run --tty= -v consolechars -f ${FONTFILES%% *} \
-u "$FONTMAPFILE" --acm "$CONSOLE_MAP"
else
run --tty= -v consolechars -f ${FONTFILES%% *} -u "$FONTMAPFILE"
fi
else
if [ "$CONSOLE_MAP" ]; then
run --tty= -v consolechars -f ${FONTFILES%% *} --acm "$CONSOLE_MAP"
else
run --tty= -v consolechars -f ${FONTFILES%% *}
fi
fi
;;
esac
fi
# Setup unicode/non-unicode mode
case "$do_term" in
# So far the FreeBSD kernel doesn't support changes of the mode from
# utf to 8-bit and vice versa (its a compile time option).
linux*)
# FORK because of #678897
if [ "$unicode" ]; then
run out FORK printf '\033%%G'
else
run out FORK printf '\033%%@'
fi
;;
esac
# Setup the terminal width and height
if [ "$do_term" ]; then
STTY=''
[ -z "$SCREEN_WIDTH" ] || STTY="$STTY cols $SCREEN_WIDTH"
[ -z "$SCREEN_HEIGHT" ] || STTY="$STTY rows $SCREEN_HEIGHT"
if [ "$STTY" ]; then
run in '' stty $STTY
fi
fi
# Setup the system beep
case "$do_term" in
linux*)
SETTERM=''
if [ -n "$BEEP" ]; then
# we use hardcoded ESC sequences instead of setterm
# because we TERM is unset in scripts run by udev
case "$BEEP" in
default) ;;
standard)
# --bfreq 750 --blength 100
SETTERM='\033[11;100]\033[10;750]' ;;
short)
# --bfreq 750 --blength 40
SETTERM='\033[11;40]\033[10;750]' ;;
shortest)
# --bfreq 750 --blength 9
SETTERM='\033[11;9]\033[10;750]' ;;
polite)
# --bfreq 130 --blength 9
SETTERM='\033[11;9]\033[10;130]' ;;
attention)
# --bfreq 130 --blength 600
SETTERM='\033[11;600]\033[10;130]' ;;
annoying)
# --bfreq 550 --blength 1000
SETTERM='\033[11;1000]\033[10;550]' ;;
off)
# --blength 0
SETTERM='\033[11;0]' ;;
*)
echo setupcon: Unrecognised setting BEEP="$BEEP" >&2 ;;
esac
if [ "$SETTERM" ]; then
run out FORK printf "$SETTERM"
fi
fi
;;
esac
###########################################################################
### INPUT
###########################################################################
# On Mac PPC machines, we may need to set kernel vars first. We need
# to mount /proc to do that, but we need it set up before sulogin may
# be run in checkroot, which will need the keyboard to log in...
# This code was borrowed from the keymap.sh script of console-common
# Copyright © 2001 Yann Dirson
# Copyright © 2001 Alcove http://www.alcove.fr/
if [ "$do_kbd" = linux ]; then
if [ -x /sbin/sysctl -a -r /etc/sysctl.conf ]; then
if grep -v '^\#' /etc/sysctl.conf | grep -q keycodes ; then
grep keycodes /etc/sysctl.conf | grep -v "^#" \
| while read -r d ; do
/sbin/sysctl -w $d 2> /dev/null || true
done
fi
fi
fi
# Setup unicode/non-unicode mode
# The following had to be [ "$do_kbd" = linux -o "$do_term" = linux ].
# Unfortunately, that way the X keyboard will be damaged when
# console-setup modifies the keyboard mode of X.
if [ "$do_kbd" = linux ]; then
if which kbd_mode >/dev/null; then
if [ "$unicode" ]; then
run in '' kbd_mode -u
else
run in '' kbd_mode -a
fi
else
report kbd_mode is not accessible. Unable to setup unicode/non-unicode keyboard mode.
fi
fi
if \
[ -z "$KMAP" -a -f "$cached" ] \
&& [ "$CONFIG" -ot "$cached" -a "$CONFIG2" -ot "$cached" ]
then
KMAP="$cached"
fi
if [ "$KMAP" ]; then
case "$do_kbd" in
linux) run plain NONE loadkeys "$KMAP" ;;
freebsd) run in '' kbdcontrol -l "$KMAP" ;;
esac
else
tempfile || { echo setupcon: Can not create temporary file >&2; exit 1; }
case "$do_kbd" in
linux)
$installdir/bin/ckbcomp -backspace "$backspace" $acm_option \
$rules_option -model "$XKBMODEL" \
"$XKBLAYOUT" "$XKBVARIANT" "$XKBOPTIONS" >$TMPFILE
run plain NONE loadkeys $TMPFILE
;;
freebsd)
$installdir/bin/ckbcomp -freebsd -backspace "$backspace" \
$acm_option $rules_option -model "$XKBMODEL" \
"$XKBLAYOUT" "$XKBVARIANT" "$XKBOPTIONS" >$TMPFILE
run in '' kbdcontrol -l $TMPFILE
run in '' kbdcontrol -f 70 "`printf '\033[3~'`"
;;
esac
fi
###########################################################################
### PRINTONLY
###########################################################################
if [ "$do_printonly" ]; then
fileargs () {
local arg args f
if [ "$1" ]; then
printf "%s" "$1" | {
read -r arg args
case "$arg" in
\>|\<)
echo -n "$arg"
;;
*)
echo -n "'"
# printf instead of echo because different versions of
# echo process backslashes differently.
printf "%s" "$arg" \
| sed "s/'/\'\\\\\'\'/g"
echo -n "'"
;;
esac
echo -n ' '
fileargs "$args"
}
fi
}
printf "%s" "$SETUP" |
while read -r cmd args; do
printf "%s " "$cmd"
fileargs "$args"
echo
done
fi
###########################################################################
### SETUPDIR
###########################################################################
if [ "$setupdir" ]; then
fileargs () {
local arg args f
if [ "$1" ]; then
printf "%s" "$1" | {
read -r arg args
case "$arg" in
\>|\<)
echo -n "$arg"
;;
/*)
echo -n "'"
if [ -e "$arg" ]; then
f="${arg##*/}"
f="${f%.gz}"
case "$arg" in
*.gz) zcat "$arg" >"$setupdir/etc/console-setup/$f" ;;
*) cp -a "$arg" "$setupdir/etc/console-setup/$f" ;;
esac
printf "%s" "/etc/console-setup/$f" \
| sed "s/'/\'\\\\\'\'/g"
else
printf "%s" "$arg" \
| sed "s/'/\'\\\\\'\'/g"
fi
echo -n "'"
;;
*)
echo -n "'"
# printf instead of echo because different versions of
# echo process backslashes differently.
printf "%s" "$arg" \
| sed "s/'/\'\\\\\'\'/g"
echo -n "'"
;;
esac
echo -n ' '
fileargs "$args"
}
fi
}
mkdir -p "$setupdir"/bin
mkdir -p "$setupdir"/etc/console-setup
echo '#!/bin/sh' >"$setupdir"/bin/setupcon
echo '# A micro-version of setupcon with static configuration.' >>"$setupdir"/bin/setupcon
chmod +x "$setupdir"/bin/setupcon
tempfile || { echo setupcon: Can not create temporary file >&2; exit 1; }
printf "%s" "$SETUP" |
while read -r cmd args; do
which "$cmd" >>$TMPFILE || true
printf "%s " "$cmd"
fileargs "$args"
echo
done >>"$setupdir"/bin/setupcon
echo 'mkdir /run/console-setup' >>"$setupdir"/bin/setupcon
echo '>/run/console-setup/keymap_loaded' >>"$setupdir"/bin/setupcon
echo exit 0 >>"$setupdir"/bin/setupcon
sort $TMPFILE | uniq | grep -v 'printf$' >"$setupdir"/morefiles
fi
exit 0
AnonSec - 2021 | Recode By D7net