ttys revision 244675
1#!/bin/sh
2#-
3# Copyright (c) 2012 Devin Teske
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 (INLUDING, 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: head/usr.sbin/bsdconfig/console/ttys 244675 2012-12-25 10:47:45Z dteske $
28#
29############################################################ INCLUDES
30
31BSDCFG_SHARE="/usr/share/bsdconfig"
32. $BSDCFG_SHARE/common.subr || exit 1
33f_dprintf "%s: loading includes..." "$0"
34f_include $BSDCFG_SHARE/dialog.subr
35f_include $BSDCFG_SHARE/mustberoot.subr
36f_include $BSDCFG_SHARE/sysrc.subr
37
38BSDCFG_LIBE="/usr/libexec/bsdconfig" APP_DIR="080.console"
39f_include_lang $BSDCFG_LIBE/$APP_DIR/include/messages.subr
40
41ipgm=$( f_index_menusel_keyword $BSDCFG_LIBE/$APP_DIR/INDEX "$pgm" )
42[ $? -eq $SUCCESS -a "$ipgm" ] && pgm="$ipgm"
43
44############################################################ CONFIGURATION
45
46#
47# Location of ttys(5)
48#
49ETC_TTYS=/etc/ttys
50
51############################################################ GLOBALS
52
53#
54# Terminal-type map/menu-item list
55#
56TTY_MENU_LIST="
57	'1 $msg_none'                '$msg_none_ttys_desc'
58	'2 $msg_ibm_437_vga_default' 'cons25'
59	'3 $msg_iso_8859_1'          'cons25l1'
60	'4 $msg_iso_8859_2'          'cons25l2'
61	'5 $msg_iso_8859_7'          'cons25l7'
62	'6 $msg_koi8_r'              'cons25r'
63	'7 $msg_koi8_u'              'cons25u'
64	'8 $msg_us_ascii'            'cons25w'
65" # END-QUOTE
66
67############################################################ FUNCTIONS
68
69# dialog_menu_main
70#
71# Display the dialog(1)-based application main menu.
72#
73dialog_menu_main()
74{
75	local size
76	local hline="$hline_choose_a_terminal_type"
77	local prompt="$msg_ttys_menu_text"
78
79	size=$( eval f_dialog_menu_size \
80	        	\"\$DIALOG_TITLE\"     \
81	        	\"\$DIALOG_BACKTITLE\" \
82	                \"\$prompt\"           \
83	        	\"\$hline\"            \
84	        	$TTY_MENU_LIST         )
85
86	local dialog_menu
87	dialog_menu=$( eval $DIALOG \
88		--clear --title \"\$DIALOG_TITLE\" \
89		--backtitle \"\$DIALOG_BACKTITLE\" \
90		--hline \"\$hline\"                \
91		--ok-label \"\$msg_ok\"            \
92		--cancel-label \"\$msg_cancel\"    \
93		--menu \"\$prompt\" $size          \
94		$TTY_MENU_LIST                     \
95		2>&1 >&$DIALOG_TERMINAL_PASSTHRU_FD
96	)
97	local retval=$?
98	setvar DIALOG_MENU_$$ "$dialog_menu"
99	return $retval
100}
101
102# ttys_set_type $consterm
103#
104# Set terminal type of `ttyv*' and `cons[0-9]' entries in ttys(5) to $consterm.
105#
106ttys_set_type()
107{
108	local consterm="$1"
109
110	#
111	# Create new temporary file to write our ttys(5) update with new types.
112	#
113	local tmpfile="$( mktemp -t "pgm" )"
114	[ "$tmpfile" ] || return $FAILURE
115
116	#
117	# Fixup permissions and ownership (mktemp(1) creates the temporary file
118	# with 0600 permissions -- change the permissions and ownership to
119	# match ttys(5) before we write it out and mv(1) it into place).
120	#
121	local mode="$( stat -f '%#Lp' "$ETC_TTYS" 2> /dev/null )"
122	local owner="$( stat -f '%u:%g' "$ETC_TTYS" 2> /dev/null )"
123	f_quietly chmod "${mode:-0644}" "$tmpfile"
124	f_quietly chown "${owner:-root:wheel}" "$tmpfile"
125
126	#
127	# Operate on ttys(5), replacing only the types of `ttyv*' and
128	# `cons[0-9]' terminals with the new type.
129	#
130	awk -v consterm="$consterm" '
131	BEGIN {
132	}
133	{
134		# "Skip" blank-lines, lines containing only whitespace, and
135		# lines containing only a comment or whitespace-then-comment.
136		#
137		if ( $0 ~ /^[[:space:]]*(#|$)/ ) { print; next }
138
139		# "Skip" terminal types other than those supported
140		#
141		if ( $1 !~ /^(ttyv.*|cons[0-9])$/ ) { print; next }
142
143		# Change the terminal type to the new value
144		#
145		match($0, /[[:alnum:]\.\+-_]+[[:space:]]+(on|off).*$/)
146		if ( ! RSTART ) { print; next }
147		left = substr($0, 0, RSTART - 1)
148		match($0, /[[:space:]]+(on|off).*$/)
149		right = substr($0, RSTART)
150		printf "%s%s%s\n", left, consterm, right
151	}
152	' "$ETC_TTYS" > "$tmpfile" || return $FAILURE
153	f_quietly mv "$tmpfile" "$ETC_TTYS" || return $FAILURE
154
155	return $SUCCESS
156}
157
158############################################################ MAIN
159
160# Incorporate rc-file if it exists
161[ -f "$HOME/.bsdconfigrc" ] && f_include "$HOME/.bsdconfigrc"
162
163#
164# Process command-line arguments
165#
166while getopts hSX flag; do
167	case "$flag" in
168	h|\?) f_usage $BSDCFG_LIBE/$APP_DIR/USAGE "PROGRAM_NAME" "$pgm";;
169	esac
170done
171shift $(( $OPTIND - 1 ))
172
173#
174# Initialize
175#
176f_dialog_title "$msg_system_console_terminal_type"
177f_dialog_backtitle "${ipgm:+bsdconfig }$pgm"
178f_mustberoot_init
179
180#
181# Launch application main menu
182#
183while :; do
184	dialog_menu_main
185	retval=$?
186	mtag=$( f_dialog_menutag )
187
188	[ $retval -eq 0 ] || f_die
189	[ "$mtag" = "1 $msg_none" ] && break
190
191	consterm=$( eval f_dialog_menutag2item \"\$mtag\" $TTY_MENU_LIST )
192	err=$( ttys_set_type "$consterm" 2>&1 )
193	[ "$err" ] || break
194
195	f_show_msg "%s" "$err"
196done
197
198exit $SUCCESS
199
200################################################################################
201# END
202################################################################################
203