summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorache <ache@FreeBSD.org>2001-07-17 04:09:50 +0000
committerache <ache@FreeBSD.org>2001-07-17 04:09:50 +0000
commit41f378ca9ed5161199f2b5bb1663a996243cf671 (patch)
treeeea3be9c4cb5ed75e134f6c1b997696608f85585
parentadc22e971c9cafdba08a447ec69dce5f17f530d5 (diff)
downloadFreeBSD-src-41f378ca9ed5161199f2b5bb1663a996243cf671.zip
FreeBSD-src-41f378ca9ed5161199f2b5bb1663a996243cf671.tar.gz
Add ability to configure console terminal type in /etc/ttys
Reviewed by: audit, jkh's silence
-rw-r--r--usr.sbin/sade/Makefile4
-rw-r--r--usr.sbin/sade/config.c1
-rw-r--r--usr.sbin/sade/install.c1
-rw-r--r--usr.sbin/sade/menus.c21
-rw-r--r--usr.sbin/sade/sade.h5
-rw-r--r--usr.sbin/sysinstall/Makefile4
-rw-r--r--usr.sbin/sysinstall/config.c1
-rw-r--r--usr.sbin/sysinstall/install.c1
-rw-r--r--usr.sbin/sysinstall/menus.c21
-rw-r--r--usr.sbin/sysinstall/sysinstall.h5
-rw-r--r--usr.sbin/sysinstall/ttys.c157
11 files changed, 217 insertions, 4 deletions
diff --git a/usr.sbin/sade/Makefile b/usr.sbin/sade/Makefile
index 946df64..bef7239 100644
--- a/usr.sbin/sade/Makefile
+++ b/usr.sbin/sade/Makefile
@@ -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"
diff --git a/usr.sbin/sade/config.c b/usr.sbin/sade/config.c
index 7b7e78c..41a8907 100644
--- a/usr.sbin/sade/config.c
+++ b/usr.sbin/sade/config.c
@@ -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)
diff --git a/usr.sbin/sade/install.c b/usr.sbin/sade/install.c
index ae3b7bb..b53cb48 100644
--- a/usr.sbin/sade/install.c
+++ b/usr.sbin/sade/install.c
@@ -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;
}
diff --git a/usr.sbin/sade/menus.c b/usr.sbin/sade/menus.c
index d90b288..8e3a532 100644
--- a/usr.sbin/sade/menus.c
+++ b/usr.sbin/sade/menus.c
@@ -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",
diff --git a/usr.sbin/sade/sade.h b/usr.sbin/sade/sade.h
index 13302a3..6c9ed8f 100644
--- a/usr.sbin/sade/sade.h
+++ b/usr.sbin/sade/sade.h
@@ -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);
diff --git a/usr.sbin/sysinstall/Makefile b/usr.sbin/sysinstall/Makefile
index 946df64..bef7239 100644
--- a/usr.sbin/sysinstall/Makefile
+++ b/usr.sbin/sysinstall/Makefile
@@ -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"
diff --git a/usr.sbin/sysinstall/config.c b/usr.sbin/sysinstall/config.c
index 7b7e78c..41a8907 100644
--- a/usr.sbin/sysinstall/config.c
+++ b/usr.sbin/sysinstall/config.c
@@ -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)
diff --git a/usr.sbin/sysinstall/install.c b/usr.sbin/sysinstall/install.c
index ae3b7bb..b53cb48 100644
--- a/usr.sbin/sysinstall/install.c
+++ b/usr.sbin/sysinstall/install.c
@@ -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;
}
diff --git a/usr.sbin/sysinstall/menus.c b/usr.sbin/sysinstall/menus.c
index d90b288..8e3a532 100644
--- a/usr.sbin/sysinstall/menus.c
+++ b/usr.sbin/sysinstall/menus.c
@@ -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",
diff --git a/usr.sbin/sysinstall/sysinstall.h b/usr.sbin/sysinstall/sysinstall.h
index 13302a3..6c9ed8f 100644
--- a/usr.sbin/sysinstall/sysinstall.h
+++ b/usr.sbin/sysinstall/sysinstall.h
@@ -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);
diff --git a/usr.sbin/sysinstall/ttys.c b/usr.sbin/sysinstall/ttys.c
new file mode 100644
index 0000000..29f83ac
--- /dev/null
+++ b/usr.sbin/sysinstall/ttys.c
@@ -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;
+ }
+}
OpenPOWER on IntegriCloud