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>
