summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authordd <dd@FreeBSD.org>2002-07-10 03:29:38 +0000
committerdd <dd@FreeBSD.org>2002-07-10 03:29:38 +0000
commit88c4e380c406520b75512d25ec432486acf95ab5 (patch)
tree39fa7986f5fab216eb6bb8f4b69bbba3d88c889a
parentf8ded2c742a1028d76cd1b6c6dafc9d54703cf01 (diff)
downloadFreeBSD-src-88c4e380c406520b75512d25ec432486acf95ab5.zip
FreeBSD-src-88c4e380c406520b75512d25ec432486acf95ab5.tar.gz
Add a VT_LOCKSWITCH ioctl that disallows vty switching. Something
like this can be emulated by VT_SETMODEing to VT_PROCESS and never releasing the vty, but this has a number of problems, most notably that a process must stay resident for the lock to be in effect. Reviewed by: roam, sheldonh
-rw-r--r--sys/dev/syscons/syscons.c14
-rw-r--r--sys/dev/syscons/syscons.h1
-rw-r--r--sys/sys/consio.h3
3 files changed, 18 insertions, 0 deletions
diff --git a/sys/dev/syscons/syscons.c b/sys/dev/syscons/syscons.c
index 02c771a..09f35bb 100644
--- a/sys/dev/syscons/syscons.c
+++ b/sys/dev/syscons/syscons.c
@@ -981,6 +981,13 @@ scioctl(dev_t dev, u_long cmd, caddr_t data, int flag, struct thread *td)
*(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)
@@ -2075,6 +2082,13 @@ sc_switch_scr(sc_softc_t *sc, u_int next_scr)
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
|| sc->blink_in_progress || sc->videoio_in_progress) {
diff --git a/sys/dev/syscons/syscons.h b/sys/dev/syscons/syscons.h
index 08e8dfc..d08df8b 100644
--- a/sys/dev/syscons/syscons.h
+++ b/sys/dev/syscons/syscons.h
@@ -194,6 +194,7 @@ typedef struct sc_softc {
#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)
diff --git a/sys/sys/consio.h b/sys/sys/consio.h
index e4a60f6..77879d1 100644
--- a/sys/sys/consio.h
+++ b/sys/sys/consio.h
@@ -335,6 +335,9 @@ typedef struct vt_mode vtmode_t;
/* 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.
*/
OpenPOWER on IntegriCloud