Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 15 Jul 2002 02:34:56 +0000
From:      Dima Dorfman <dima@trit.org>
To:        audit@freebsd.org
Subject:   lock(1) -v (was: VT_LOCKSWITCH)
Message-ID:  <20020715023456.483403E1A@turbine.trit.org>

next in thread | raw e-mail | index | archive | help
Anybody care to review this patch?  I'd rather not commit unreviewed
changes to a setuid root program.

Thanks.

I wrote:
> Sheldon Hearn <sheldonh@starjuice.net> wrote:
> > 
> > 
> > On Tue, 28 May 2002 08:54:20 GMT, Dima Dorfman wrote:
> > 
> > > 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.
> > 
> > Ooo!  Ooo!  This is nice.
> > 
> > If you're up to it, I'd love to see the same functionality available as
> > an extension to lock(1).  Imagine the convenience of being able to type
> > 
> > 	lock -npS
> > 
> > on just one terminal and not have to worry about the rest!
> 
> Sounds nice.  How about the following patch?  I really tried to keep
> the not-directly-related changes to a minimum, but it was difficult
> (lock(1) is so small and simple, but so lacking in polish!) (I did
> refrain from fixing anything that I wasn't already going to change,
> though, so the diff shouldn't be significantly harder to read).
> 
> Note also that lock(1) is installed setuid root (for -p), so please
> review accordingly (even though none of the new code runs as root).
> 
> Thanks,
> 
> Dima.

Index: lock.1
===================================================================
RCS file: /home/ncvs/src/usr.bin/lock/lock.1,v
retrieving revision 1.7
diff -u -r1.7 lock.1
--- lock.1	20 Apr 2002 12:15:20 -0000	1.7
+++ lock.1	10 Jul 2002 04:54:50 -0000
@@ -32,7 +32,7 @@
 .\"	@(#)lock.1	8.1 (Berkeley) 6/6/93
 .\" $FreeBSD$
 .\"
-.Dd June 6, 1993
+.Dd July 10, 2002
 .Dt LOCK 1
 .Os
 .Sh NAME
@@ -40,8 +40,7 @@
 .Nd reserve a terminal
 .Sh SYNOPSIS
 .Nm
-.Op Fl n
-.Op Fl p
+.Op Fl npv
 .Op Fl t Ar timeout
 .Sh DESCRIPTION
 The
@@ -65,6 +64,15 @@
 The time limit (default 15 minutes) is changed to
 .Ar timeout
 minutes.
+.It Fl v
+Disable switching virtual terminals while this terminal is locked.
+This option is implemented in a way similar to the
+.Fl S
+option of
+.Xr vidcontrol 1 ,
+and is only available if the terminal in question is a
+.Xr syscons 4
+virtual terminal.
 .El
 .Sh HISTORY
 The
Index: lock.c
===================================================================
RCS file: /home/ncvs/src/usr.bin/lock/lock.c,v
retrieving revision 1.13
diff -u -r1.13 lock.c
--- lock.c	10 Jul 2002 04:05:33 -0000	1.13
+++ lock.c	10 Jul 2002 04:54:50 -0000
@@ -60,6 +60,7 @@
 #include <sys/stat.h>
 #include <sys/time.h>
 #include <sys/signal.h>
+#include <sys/consio.h>
 #include <err.h>
 #include <ctype.h>
 #include <pwd.h>
@@ -83,6 +84,7 @@
 struct sgttyb	tty, ntty;
 long	nexttime;			/* keep the timeout time */
 int            no_timeout;                     /* lock terminal forever */
+int	vtyunlock;			/* Unlock flag and code. */
 
 /*ARGSUSED*/
 int
@@ -95,7 +97,7 @@
 	time_t timval_sec;
 	struct itimerval ntimer, otimer;
 	struct tm *timp;
-	int ch, failures, sectimeout, usemine;
+	int ch, failures, sectimeout, usemine, vtylock;
 	char *ap, *mypw, *ttynam, *tzn;
 	char hostname[MAXHOSTNAMELEN], s[BUFSIZ], s1[BUFSIZ];
 
@@ -105,7 +107,8 @@
 	mypw = NULL;
 	usemine = 0;
 	no_timeout = 0;
-	while ((ch = getopt(argc, argv, "npt:")) != -1)
+	vtylock = 0;
+	while ((ch = getopt(argc, argv, "npt:v")) != -1)
 		switch((char)ch) {
 		case 't':
 			if ((sectimeout = atoi(optarg)) <= 0)
@@ -120,6 +123,9 @@
 		case 'n':
 			no_timeout = 1;
 			break;
+		case 'v':
+			vtylock = 1;
+			break;
 		case '?':
 		default:
 			usage();
@@ -177,15 +183,31 @@
 	ntimer.it_value = timeout;
 	if (!no_timeout)
 		setitimer(ITIMER_REAL, &ntimer, &otimer);
+	if (vtylock) {
+		/*
+		 * If this failed, we want to err out; warn isn't good
+		 * enough, since we don't want the user to think that
+		 * everything is nice and locked because they got a
+		 * "Key:" prompt.
+		 */
+		if (ioctl(0, VT_LOCKSWITCH, &vtylock) == -1) {
+			(void)ioctl(0, TIOCSETP, &tty);
+			err(1, "locking vty");
+		}
+		vtyunlock = 0x2;
+	}
 
 	/* header info */
-	if (no_timeout) {
-(void)printf("lock: %s on %s. no timeout\ntime now is %.20s%s%s",
-	    ttynam, hostname, ap, tzn, ap + 19);
-	} else {
-(void)printf("lock: %s on %s. timeout in %d minutes\ntime now is %.20s%s%s",
-	    ttynam, hostname, sectimeout, ap, tzn, ap + 19);
-	}
+	(void)printf("lock: %s on %s.", ttynam, hostname);
+	if (no_timeout)
+		(void)printf(" no timeout.");
+	else
+		(void)printf(" timeout in %d minute%s.", sectimeout,
+		    sectimeout != 1 ? "s" : "");
+	if (vtylock)
+		(void)printf(" vty locked.");
+	(void)printf("\ntime now is %.20s%s%s", ap, tzn, ap + 19);
+
 	failures = 0;
 
 	for (;;) {
@@ -222,7 +244,7 @@
 static void
 usage()
 {
-	(void)fprintf(stderr, "usage: lock [-n] [-p] [-t timeout]\n");
+	(void)fprintf(stderr, "usage: lock [-npv] [-t timeout]\n");
 	exit(1);
 }
 
@@ -248,6 +270,8 @@
 {
 	(void)putchar('\n');
 	(void)ioctl(0, TIOCSETP, &tty);
+	if (vtyunlock)
+		(void)ioctl(0, VT_LOCKSWITCH, &vtyunlock);
 	exit(0);
 }
 
@@ -256,6 +280,8 @@
 {
 	if (!no_timeout) {
 		(void)ioctl(0, TIOCSETP, &tty);
+		if (vtyunlock)
+			(void)ioctl(0, VT_LOCKSWITCH, &vtyunlock);
 		(void)printf("lock: timeout\n");
 		exit(1);
 	}

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?20020715023456.483403E1A>