Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 14 Jul 2001 06:07:06 +0400
From:      "Andrey A. Chernov" <ache@nagual.pp.ru>
To:        jkh@freebsd.org, audit@freebsd.org
Subject:   CFR: add /etc/ttys console tuning to sysinstall
Message-ID:  <20010714060706.A8133@nagual.pp.ru>

next in thread | raw e-mail | index | archive | help
--- /dev/null	Sat Jul 14 05:55:00 2001
+++ ttys.c	Sat Jul 14 05:20:29 2001
@@ -0,0 +1,155 @@
+/*
+ * 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>
+
+void
+configTtys(void)
+{
+    int len, t, tlen, changed;
+    FILE *fp, *np;
+    char sq, *line, *p, *q, *cp, *tptr;
+    char templ[20];
+    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 ".XXXXXX");
+    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;
+    }
+}
--- menus.c.old	Fri Jul 13 23:01:28 2001
+++ menus.c	Sat Jul 14 05:03:38 2001
@@ -264,6 +264,7 @@
       { " 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 @@
       { "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 } },
 };
 
@@ -1585,6 +1587,25 @@
       { "KOI8-R to IBM866",	"Russian KOI8-R to IBM 866 screenmap", dmenuVarCheck, dmenuSetVariable, NULL, "scrnmap=koi8-r2cp866" },
       { "KOI8-U to IBM866u",	"Ukrainian KOI8-U to IBM 866u screenmap", dmenuVarCheck, dmenuSetVariable, NULL, "scrnmap=koi8-u2cp866u" },
       { "ISO 8859-1 to IBM437",	"W-Europe ISO 8859-1 to IBM 437 screenmap", dmenuVarCheck, dmenuSetVariable, NULL, "scrnmap=iso-8859-1_to_cp437" },
+      { 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 } },
 };
 
--- Makefile.old	Mon Jun 18 06:01:11 2001
+++ Makefile	Sat Jul 14 04:06:56 2001
@@ -11,8 +11,8 @@
 	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"
--- install.c.old	Fri Jul 13 23:01:27 2001
+++ install.c	Sat Jul 14 04:29:39 2001
@@ -1075,6 +1075,7 @@
     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;
 }
 
--- sysinstall.h.old	Fri Jul 13 23:01:28 2001
+++ sysinstall.h	Sat Jul 14 04:40:27 2001
@@ -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		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				*/
@@ -744,6 +746,9 @@
 
 /* termcap.c */
 extern int	set_termcap(void);
+
+/* ttys.c */
+extern void     configTtys(void);
 
 /* ufs.c */
 extern void	mediaShutdownUFS(Device *dev);
--- config.c.old	Sat Jul 14 04:06:32 2001
+++ config.c	Sat Jul 14 04:40:27 2001
@@ -383,6 +383,7 @@
     char *cp;
     static int did_marker = 0;
 
+    configTtys();
     write_header = !file_readable("/etc/rc.conf");
     rcSite = fopen("/etc/rc.conf", "a");
     if (!rcSite)

-- 
Andrey A. Chernov
http://ache.pp.ru/

To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-audit" in the body of the message




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20010714060706.A8133>