Add ability to configure console terminal type in /etc/ttys

Reviewed by:	audit, jkh's silence
This commit is contained in:
Andrey A. Chernov 2001-07-17 04:09:50 +00:00
parent 17462195a8
commit 3670a10826
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=79813
11 changed files with 217 additions and 4 deletions

View file

@ -11,8 +11,8 @@ SRCS= anonFTP.c cdrom.c command.c config.c devices.c dhcp.c kget.c \
ftp.c globals.c http.c index.c install.c installUpgrade.c keymap.c \
label.c main.c makedevs.c media.c menus.c misc.c modules.c \
mouse.c msg.c network.c nfs.c options.c package.c pccard.c \
system.c tape.c tcpip.c termcap.c ufs.c usb.c user.c variable.c \
wizard.c keymap.h
system.c tape.c tcpip.c termcap.c ttys.c ufs.c usb.c user.c \
variable.c wizard.c keymap.h
CFLAGS+= -Wall -I${.CURDIR}/../../gnu/lib/libdialog -I.
.if ${MACHINE} == "pc98"

View file

@ -383,6 +383,7 @@ configRC_conf(void)
char *cp;
static int did_marker = 0;
configTtys();
write_header = !file_readable("/etc/rc.conf");
rcSite = fopen("/etc/rc.conf", "a");
if (!rcSite)

View file

@ -1075,6 +1075,7 @@ installVarDefaults(dialogMenuItem *self)
else
variable_set2(SYSTEM_STATE, "init", 0);
variable_set2(VAR_NEWFS_ARGS, "-b 8192 -f 1024 -c 22", 0);
variable_set2(VAR_CONSTERM, "NO", 0);
return DITEM_SUCCESS;
}

View file

@ -264,6 +264,7 @@ DMenu MenuIndex = {
{ " Syscons, Keyrate", "The console key rate configuration menu.", NULL, dmenuSubmenu, NULL, &MenuSysconsKeyrate },
{ " Syscons, Saver", "The console screen saver configuration menu.", NULL, dmenuSubmenu, NULL, &MenuSysconsSaver },
{ " Syscons, Screenmap", "The console screenmap configuration menu.", NULL, dmenuSubmenu, NULL, &MenuSysconsScrnmap },
{ " Syscons, Ttys", "The console terminal type menu.", NULL, dmenuSubmenu, NULL, &MenuSysconsTtys },
{ " Time Zone", "Set the system's time zone.", NULL, dmenuSystemCommand, NULL, "tzsetup" },
{ " Upgrade", "Upgrade an existing system.", NULL, installUpgrade },
{ " Usage", "Quick start - How to use this menu system.", NULL, dmenuDisplayFile, NULL, "usage" },
@ -1431,6 +1432,7 @@ DMenu MenuSyscons = {
{ "4 Repeat", "Set the rate at which keys repeat", NULL, dmenuSubmenu, NULL, &MenuSysconsKeyrate },
{ "5 Saver", "Configure the screen saver", NULL, dmenuSubmenu, NULL, &MenuSysconsSaver },
{ "6 Screenmap", "Choose an alternate screenmap", NULL, dmenuSubmenu, NULL, &MenuSysconsScrnmap },
{ "7 Ttys", "Choose console terminal type", NULL, dmenuSubmenu, NULL, &MenuSysconsTtys },
{ NULL } },
};
@ -1588,6 +1590,25 @@ DMenu MenuSysconsScrnmap = {
{ NULL } },
};
DMenu MenuSysconsTtys = {
DMENU_RADIO_TYPE | DMENU_SELECTION_RETURNS,
"System Console Terminal Type",
"For various console encodings corresponding terminal type\n"
"must be choosed in /etc/ttys.\n"
"WARNING: due to compatibility reasons, only entries started with\n"
"ttyv and with terminal type started with cons[0-9] can be changed\n"
"via this menu.\n",
"Choose a terminal type",
NULL,
{ { "1 None", "Don't touch anything", dmenuVarCheck, dmenuSetVariable, NULL, VAR_CONSTERM "=NO" },
{ "2 US-ASCII or IBM437", "cons25", dmenuVarCheck, dmenuSetVariable, NULL, VAR_CONSTERM "=cons25" },
{ "3 ISO 8859-1", "cons25l1", dmenuVarCheck, dmenuSetVariable, NULL, VAR_CONSTERM "=cons25l1" },
{ "4 ISO 8859-2", "cons25l2", dmenuVarCheck, dmenuSetVariable, NULL, VAR_CONSTERM "=cons25l2" },
{ "5 KOI8-R", "cons25r", dmenuVarCheck, dmenuSetVariable, NULL, VAR_CONSTERM "=cons25r" },
{ "6 KOI8-U", "cons25u", dmenuVarCheck, dmenuSetVariable, NULL, VAR_CONSTERM "=cons25u" },
{ NULL } },
};
DMenu MenuSysconsFont = {
DMENU_RADIO_TYPE | DMENU_SELECTION_RETURNS,
"System Console Font",

View file

@ -176,6 +176,7 @@
#define VAR_VAR_SIZE "varSize"
#define VAR_XF86_CONFIG "_xf86config"
#define VAR_TERM "TERM"
#define VAR_CONSTERM "_consterm"
#define DEFAULT_TAPE_BLOCKSIZE "20"
@ -386,6 +387,7 @@ extern DMenu MenuSysconsKeymap; /* System console keymap configuration menu */
extern DMenu MenuSysconsKeyrate; /* System console keyrate configuration menu */
extern DMenu MenuSysconsSaver; /* System console saver configuration menu */
extern DMenu MenuSysconsScrnmap; /* System console screenmap configuration menu */
extern DMenu MenuSysconsTtys; /* System console terminal type menu */
extern DMenu MenuNetworking; /* Network configuration menu */
extern DMenu MenuInstallCustom; /* Custom Installation menu */
extern DMenu MenuDistributions; /* Distribution menu */
@ -745,6 +747,9 @@ extern Device *tcpDeviceSelect(void);
/* termcap.c */
extern int set_termcap(void);
/* ttys.c */
extern void configTtys(void);
/* ufs.c */
extern void mediaShutdownUFS(Device *dev);
extern Boolean mediaInitUFS(Device *dev);

View file

@ -11,8 +11,8 @@ SRCS= anonFTP.c cdrom.c command.c config.c devices.c dhcp.c kget.c \
ftp.c globals.c http.c index.c install.c installUpgrade.c keymap.c \
label.c main.c makedevs.c media.c menus.c misc.c modules.c \
mouse.c msg.c network.c nfs.c options.c package.c pccard.c \
system.c tape.c tcpip.c termcap.c ufs.c usb.c user.c variable.c \
wizard.c keymap.h
system.c tape.c tcpip.c termcap.c ttys.c ufs.c usb.c user.c \
variable.c wizard.c keymap.h
CFLAGS+= -Wall -I${.CURDIR}/../../gnu/lib/libdialog -I.
.if ${MACHINE} == "pc98"

View file

@ -383,6 +383,7 @@ configRC_conf(void)
char *cp;
static int did_marker = 0;
configTtys();
write_header = !file_readable("/etc/rc.conf");
rcSite = fopen("/etc/rc.conf", "a");
if (!rcSite)

View file

@ -1075,6 +1075,7 @@ installVarDefaults(dialogMenuItem *self)
else
variable_set2(SYSTEM_STATE, "init", 0);
variable_set2(VAR_NEWFS_ARGS, "-b 8192 -f 1024 -c 22", 0);
variable_set2(VAR_CONSTERM, "NO", 0);
return DITEM_SUCCESS;
}

View file

@ -264,6 +264,7 @@ DMenu MenuIndex = {
{ " Syscons, Keyrate", "The console key rate configuration menu.", NULL, dmenuSubmenu, NULL, &MenuSysconsKeyrate },
{ " Syscons, Saver", "The console screen saver configuration menu.", NULL, dmenuSubmenu, NULL, &MenuSysconsSaver },
{ " Syscons, Screenmap", "The console screenmap configuration menu.", NULL, dmenuSubmenu, NULL, &MenuSysconsScrnmap },
{ " Syscons, Ttys", "The console terminal type menu.", NULL, dmenuSubmenu, NULL, &MenuSysconsTtys },
{ " Time Zone", "Set the system's time zone.", NULL, dmenuSystemCommand, NULL, "tzsetup" },
{ " Upgrade", "Upgrade an existing system.", NULL, installUpgrade },
{ " Usage", "Quick start - How to use this menu system.", NULL, dmenuDisplayFile, NULL, "usage" },
@ -1431,6 +1432,7 @@ DMenu MenuSyscons = {
{ "4 Repeat", "Set the rate at which keys repeat", NULL, dmenuSubmenu, NULL, &MenuSysconsKeyrate },
{ "5 Saver", "Configure the screen saver", NULL, dmenuSubmenu, NULL, &MenuSysconsSaver },
{ "6 Screenmap", "Choose an alternate screenmap", NULL, dmenuSubmenu, NULL, &MenuSysconsScrnmap },
{ "7 Ttys", "Choose console terminal type", NULL, dmenuSubmenu, NULL, &MenuSysconsTtys },
{ NULL } },
};
@ -1588,6 +1590,25 @@ DMenu MenuSysconsScrnmap = {
{ NULL } },
};
DMenu MenuSysconsTtys = {
DMENU_RADIO_TYPE | DMENU_SELECTION_RETURNS,
"System Console Terminal Type",
"For various console encodings corresponding terminal type\n"
"must be choosed in /etc/ttys.\n"
"WARNING: due to compatibility reasons, only entries started with\n"
"ttyv and with terminal type started with cons[0-9] can be changed\n"
"via this menu.\n",
"Choose a terminal type",
NULL,
{ { "1 None", "Don't touch anything", dmenuVarCheck, dmenuSetVariable, NULL, VAR_CONSTERM "=NO" },
{ "2 US-ASCII or IBM437", "cons25", dmenuVarCheck, dmenuSetVariable, NULL, VAR_CONSTERM "=cons25" },
{ "3 ISO 8859-1", "cons25l1", dmenuVarCheck, dmenuSetVariable, NULL, VAR_CONSTERM "=cons25l1" },
{ "4 ISO 8859-2", "cons25l2", dmenuVarCheck, dmenuSetVariable, NULL, VAR_CONSTERM "=cons25l2" },
{ "5 KOI8-R", "cons25r", dmenuVarCheck, dmenuSetVariable, NULL, VAR_CONSTERM "=cons25r" },
{ "6 KOI8-U", "cons25u", dmenuVarCheck, dmenuSetVariable, NULL, VAR_CONSTERM "=cons25u" },
{ NULL } },
};
DMenu MenuSysconsFont = {
DMENU_RADIO_TYPE | DMENU_SELECTION_RETURNS,
"System Console Font",

View file

@ -176,6 +176,7 @@
#define VAR_VAR_SIZE "varSize"
#define VAR_XF86_CONFIG "_xf86config"
#define VAR_TERM "TERM"
#define VAR_CONSTERM "_consterm"
#define DEFAULT_TAPE_BLOCKSIZE "20"
@ -386,6 +387,7 @@ extern DMenu MenuSysconsKeymap; /* System console keymap configuration menu */
extern DMenu MenuSysconsKeyrate; /* System console keyrate configuration menu */
extern DMenu MenuSysconsSaver; /* System console saver configuration menu */
extern DMenu MenuSysconsScrnmap; /* System console screenmap configuration menu */
extern DMenu MenuSysconsTtys; /* System console terminal type menu */
extern DMenu MenuNetworking; /* Network configuration menu */
extern DMenu MenuInstallCustom; /* Custom Installation menu */
extern DMenu MenuDistributions; /* Distribution menu */
@ -745,6 +747,9 @@ extern Device *tcpDeviceSelect(void);
/* termcap.c */
extern int set_termcap(void);
/* ttys.c */
extern void configTtys(void);
/* ufs.c */
extern void mediaShutdownUFS(Device *dev);
extern Boolean mediaInitUFS(Device *dev);

157
usr.sbin/sysinstall/ttys.c Normal file
View file

@ -0,0 +1,157 @@
/*
* The new sysinstall program.
*
* This is probably the last program in the `sysinstall' line - the next
* generation being essentially a complete rewrite.
*
* $FreeBSD$
*
* Copyright (c) 2001
* Andrey A. Chernov. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer,
* verbatim and that no modifications are made prior to this
* point in the file.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY ANDREY A. CHERNOV ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL JORDAN HUBBARD OR HIS PETS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, LIFE OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
*/
#include "sysinstall.h"
#include <sys/stat.h>
#include <ctype.h>
#include <ttyent.h>
#define _X_EXTENSION ".XXXXXX"
void
configTtys(void)
{
int len, t, tlen, changed;
FILE *fp, *np;
char sq, *line, *p, *q, *cp, *tptr;
char templ[sizeof(_PATH_TTYS) + sizeof(_X_EXTENSION) - 1];
struct ttyent *tnam;
if ((cp = variable_get(VAR_CONSTERM)) == NULL ||
strcmp(cp, "NO") == 0)
return;
if (!file_readable(_PATH_TTYS)) {
msgConfirm("%s not exist or not readable", _PATH_TTYS);
return;
}
if ((fp = fopen(_PATH_TTYS, "r")) == NULL) {
msgConfirm("Can't open %s for read: %s", _PATH_TTYS,
strerror(errno));
return;
}
strcpy(templ, _PATH_TTYS _X_EXTENSION);
if ((t = mkstemp(templ)) < 0) {
msgConfirm("Can't create %s: %s", templ, strerror(errno));
(void)fclose(fp);
return;
}
if (fchmod(t, 0644)) {
msgConfirm("Can't fchmod %s: %s", templ, strerror(errno));
(void)fclose(fp);
return;
}
if ((np = fdopen(t, "w")) == NULL) {
msgConfirm("Can't fdopen %s: %s", templ, strerror(errno));
(void)close(t);
(void)fclose(fp);
(void)unlink(templ);
return;
}
changed = 0;
while ((line = fgetln(fp, &len)) != NULL) {
p = line;
while (p < (line + len) && isspace((unsigned char)*p))
++p;
if (strncmp(p, "ttyv", 4) != 0) {
dump:
if (fwrite(line, len, 1, np) != 1) {
wrerr:
msgConfirm("%s: write error: %s", templ, strerror(errno));
(void)fclose(fp);
(void)fclose(np);
(void)unlink(templ);
return;
}
} else {
q = p;
while(q < (line + len) && !isspace((unsigned char)*q))
++q;
if (!isspace((unsigned char)*q))
goto dump;
sq = *q;
*q = '\0';
tnam = getttynam(p);
*q = sq;
if (tnam == NULL || tnam->ty_type == NULL ||
strcmp(tnam->ty_type, cp) == 0 ||
strncmp(tnam->ty_type, "cons", 4) != 0 ||
!isdigit((unsigned char)tnam->ty_type[4])
)
goto dump;
tlen = strlen(tnam->ty_type);
tptr = NULL;
p = ++q;
while(p < (line + len)) {
if (strncmp(p, tnam->ty_type, tlen) == 0) {
tptr = p;
break;
}
++p;
}
if (tptr == NULL)
goto dump;
changed = 1;
if (fwrite(line, tptr - line, 1, np) != 1 ||
fputs(cp, np) ||
fwrite(tptr + tlen,
len - (tptr + tlen - line), 1, np) != 1)
goto wrerr;
}
}
if (!feof(fp)) {
msgConfirm("%s: read error: %s", _PATH_TTYS, strerror(errno));
(void)fclose(fp);
(void)fclose(np);
(void)unlink(templ);
return;
}
(void)fclose(fp);
if (fclose(np)) {
if (changed)
msgConfirm("%s: close error: %s", templ, strerror(errno));
(void)unlink(templ);
return;
}
if (!changed) {
(void)unlink(templ);
return;
}
if (rename(templ, _PATH_TTYS)) {
msgConfirm("Can't rename %s to %s: %s", templ, _PATH_TTYS,
strerror(errno));
return;
}
}