mirror of
https://github.com/freebsd/freebsd-src
synced 2024-10-07 09:00:28 +00:00
Add ability to configure console terminal type in /etc/ttys
Reviewed by: audit, jkh's silence
This commit is contained in:
parent
17462195a8
commit
3670a10826
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=79813
|
@ -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"
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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",
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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",
|
||||
|
|
|
@ -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
157
usr.sbin/sysinstall/ttys.c
Normal 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;
|
||||
}
|
||||
}
|
Loading…
Reference in a new issue