Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 28 May 2002 08:54:20 +0000
From:      Dima Dorfman <dima@trit.org>
To:        audit@freebsd.org
Subject:   VT_LOCKSWITCH
Message-ID:  <20020528085420.348AC3E5E@turbine.trit.org>

next in thread | raw e-mail | index | archive | help
The attached patch adds an -S option to vidcontrol(1) that allows the
user to disallow vty switching.  It is implemented using a new
VT_LOCKSWITCH ioctl.  Although it is possible to implement something
like this by VT_SETMODEing to VT_PROCESS and never releasing the vty,
that method has a number of downsides, the biggest of which is that
some program has to stay resident for the lock to be in effect.

Please review.

Thanks.

P.S.: This patch makes the usage output pretty ugly; I'll fix that in
a separate commit (I don't want to put unrelated, cosmetic stuff in
this diff).

Index: sys/sys/consio.h
===================================================================
RCS file: /ref/cvsf/src/sys/sys/consio.h,v
retrieving revision 1.14
diff -u -r1.14 consio.h
--- sys/sys/consio.h	16 May 2002 10:57:10 -0000	1.14
+++ sys/sys/consio.h	27 May 2002 23:09:46 -0000
@@ -335,6 +335,9 @@
 /* get the index of the vty */
 #define VT_GETINDEX	_IOR('v', 8, int)
 
+/* prevent switching vtys */
+#define VT_LOCKSWITCH	_IOW('v', 9, int)
+
 /*
  * Video mode switching ioctl.  See sys/fbio.h for mode numbers.
  */
Index: sys/dev/syscons/syscons.c
===================================================================
RCS file: /ref/cvsf/src/sys/dev/syscons/syscons.c,v
retrieving revision 1.384
diff -u -r1.384 syscons.c
--- sys/dev/syscons/syscons.c	4 May 2002 15:42:38 -0000	1.384
+++ sys/dev/syscons/syscons.c	27 May 2002 23:15:36 -0000
@@ -981,6 +981,13 @@
 	*(int *)data = scp->index + 1;
 	return 0;
 
+    case VT_LOCKSWITCH:		/* prevent vty switching */
+	if ((*(int *)data) & 0x01)
+	    sc->flags |= SC_SCRN_VTYLOCK;
+	else
+	    sc->flags &= ~SC_SCRN_VTYLOCK;
+	return 0;
+
     case KDENABIO:      	/* allow io operations */
 	error = suser(td);
 	if (error != 0)
@@ -2074,6 +2081,13 @@
     int s;
 
     DPRINTF(5, ("sc0: sc_switch_scr() %d ", next_scr + 1));
+
+    /* prevent switch if previously requested */
+    if (sc->flags & SC_SCRN_VTYLOCK) {
+	    sc_bell(sc->cur_scp, sc->cur_scp->bell_pitch,
+		sc->cur_scp->bell_duration);
+	    return EPERM;
+    }
 
     /* delay switch if the screen is blanked or being updated */
     if ((sc->flags & SC_SCRN_BLANKED) || sc->write_in_progress
Index: sys/dev/syscons/syscons.h
===================================================================
RCS file: /ref/cvsf/src/sys/dev/syscons/syscons.h,v
retrieving revision 1.74
diff -u -r1.74 syscons.h
--- sys/dev/syscons/syscons.h	13 Apr 2002 22:34:16 -0000	1.74
+++ sys/dev/syscons/syscons.h	27 May 2002 23:14:16 -0000
@@ -194,6 +194,7 @@
 #define	SC_SCRN_IDLE	(1 << 5)
 #define	SC_SCRN_BLANKED	(1 << 6)
 #define	SC_SAVER_FAILED	(1 << 7)
+#define	SC_SCRN_VTYLOCK	(1 << 8)
 
 #define	SC_INIT_DONE	(1 << 16)
 #define	SC_SPLASH_SCRN	(1 << 17)
Index: usr.sbin/vidcontrol/vidcontrol.1
===================================================================
RCS file: /ref/cvsf/src/usr.sbin/vidcontrol/vidcontrol.1,v
retrieving revision 1.51
diff -u -r1.51 vidcontrol.1
--- usr.sbin/vidcontrol/vidcontrol.1	20 Apr 2002 12:27:15 -0000	1.51
+++ usr.sbin/vidcontrol/vidcontrol.1	27 May 2002 23:35:06 -0000
@@ -13,7 +13,7 @@
 .\"     @(#)vidcontrol.1
 .\" $FreeBSD$
 .\"
-.Dd May 27, 2001
+.Dd May 27, 2002
 .Dt VIDCONTROL 1
 .Os
 .Sh NAME
@@ -36,6 +36,7 @@
 .Op Fl M Ar char
 .Op Fl m Cm on | off
 .Op Fl r Ar foreground Ar background
+.Op Fl S Cm on | off
 .Op Fl s Ar number
 .Op Fl t Ar N | Cm off
 .Op Ar mode
@@ -213,6 +214,11 @@
 .Ar foreground
 and
 .Ar background .
+.It Fl S Cm on | off
+Turn vty switching on or off.
+When vty switching is off,
+attempts to switch to a different virtual terminal will fail.
+(The default is to permit vty switching.)
 .It Fl s Ar number
 Set the current vty to
 .Ar number .
Index: usr.sbin/vidcontrol/vidcontrol.c
===================================================================
RCS file: /ref/cvsf/src/usr.sbin/vidcontrol/vidcontrol.c,v
retrieving revision 1.41
diff -u -r1.41 vidcontrol.c
--- usr.sbin/vidcontrol/vidcontrol.c	16 Mar 2002 23:35:51 -0000	1.41
+++ usr.sbin/vidcontrol/vidcontrol.c	27 May 2002 23:38:02 -0000
@@ -76,7 +76,7 @@
 "usage: vidcontrol [-CdLPpx] [-b color] [-c appearance] [-f [size] file]",
 "                  [-g geometry] [-h size] [-i adapter | mode] [-l screen_map]",
 "                  [-m on | off] [-M char] [-r foreground background] [-s num]",
-"                  [-t N | off] [mode] [foreground [background]] [show]");
+"                  [-S on | off] [-t N | off] [mode] [foreground [background]] [show]");
 	exit(1);
 }
 
@@ -518,6 +518,23 @@
 	ioctl(0, CONS_MOUSECTL, &mouse);
 }
 
+void
+set_lockswitch(char *arg)
+{
+	int data;
+
+	if (!strcmp(arg, "off"))
+		data = 0x01;
+	else if (!strcmp(arg, "on"))
+		data = 0x02;
+	else {
+		warnx("argument to -S must either on or off");
+		return;
+	}
+	if (ioctl(0, VT_LOCKSWITCH, &data) == -1)
+		warn("ioctl(VT_LOCKSWITCH)");
+}
+
 static char
 *adapter_name(int type)
 {
@@ -749,7 +766,7 @@
 		/* Not reached */
 	if (ioctl(0, CONS_GETINFO, &info) < 0)
 		err(1, "must be on a virtual console");
-	while((opt = getopt(argc, argv, "b:Cc:df:g:h:i:l:LM:m:pPr:s:t:x")) != -1)
+	while((opt = getopt(argc, argv, "b:Cc:df:g:h:i:l:LM:m:pPr:S:s:t:x")) != -1)
 		switch(opt) {
 		case 'b':
 			set_border_color(optarg);
@@ -805,6 +822,9 @@
 			break;
 		case 'r':
 			set_reverse_colors(argc, argv, &optind);
+			break;
+		case 'S':
+			set_lockswitch(optarg);
 			break;
 		case 's':
 			set_console(optarg);

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?20020528085420.348AC3E5E>