oscar@utcsrgv.UUCP (Oscar M. Nierstrasz) (11/23/83)
This program locks your keyboard until you type
your login password. It catches ^Z for csh users.
Also times out after (default) 5 minutes and logs you out.
No idea how portable it is, but shouldn't be hard to convert.
Source to follow.
------------------------------------------------------------
.TH LK 1
.UC
.SH NAME
lk \- lock a terminal
.SH SYNOPSIS
.B lk
[timeout]
.SH DESCRIPTION
.I Lk
locks your terminal until you type in your login password.
The default timeout period is 5 minutes.
This can be increased to a maximum of 15 minutes.
.PP
.I Lk
uses your real password instead of an improvised one thus
saving time and reducing embarrassment if it is forgotten.
There is no "trap-door" password.
The ^Z signal available in csh(1) is also caught by
.I lk.
.pp
In order to use
.I lk
you must have the shell variable $shellpid available in your environment.
If you are using "C" shell, put the line
.IP
setenv shellpid=$$
.PP
in your .login file.
With the Bourne shell, put the lines
.IP
shellpid=$$
.br
export shellpid
.PP
in your .profile.
.SH DIAGNOSTICS
Tells you how many minutes are left to logout time.
.br
Quits if it can't find $shellpid.
.SH BUGS
You can fool
.I lk
by providing a bogus $shellpid.
.br
Also, sigsys(2) is not very portable.
.SH AUTHOR
Oscar Nierstrasz at the University of Toronto.
.SH SEE ALSO
csh(1), sh(1), getuid(2), getpwent(3), crypt(3), environ(5), getenv(3),
ioctl(2), signal(2), sigsys(2), sigset(2), alarm(2), kill(2).
--
UUCP { ihnp4 cornell decwrl watmath uw-beaver ubc-vision sask
garfield qucis linus mcgill-vision }!utcsrgv!oscar
or { allegra decvax duke floyd }!utzoo!utcsrgv!oscaroscar@utcsrgv.UUCP (Oscar M. Nierstrasz) (11/23/83)
/* */
/* FILE: LK.C */
/* AUTHOR: Oscar Nierstrasz */
/* */
/* Usage: lk [timeout] */
/* */
/* Locks the keyboard. */
/* Prevents idle fingers from mucking with */
/* your terminal while you dash downstairs */
/* to the versatec. */
/* */
/* Lock will timeout after at most 15 minutes. */
/* (Default is 5 minutes.) */
/* If you put the line */
/* */
/* setenv shellpid=$$ */
/* */
/* in your .login (with csh), lk will */
/* automatically log you off upon a timeout. */
/* (use export with sh -- see environ(5) */
/* */
/* Compile with -ljobs. */
/* */
#include <stdio.h>
#include <sgtty.h>
#include <signal.h>
#include <pwd.h>
#define TRUE 1
#define FALSE 0
#define MAX 100
#define TIMEOUT 5 /* minutes */
#define MAXTIME 15
#define MINUTE 60
#define SHELL "shellpid"
#define BELL '\07'
struct passwd *getpwuid();
char *crypt(), *getenv();
int timeout, min=0, pid, nomsg = TRUE;
checktime(){
int t;
min++;
t = timeout - min;
if(t <= 0)
goodbye();
else fprintf(stderr, "%d minute%c to logout\n", t, (t==1)?' ':'s');
sigset(SIGALRM, checktime); /* reset SIGALRM */
alarm(MINUTE);
}
goodbye(){
echo_on();
fprintf(stderr, "Logout%c\n", BELL);
if(pid != NULL)
if(kill(pid, SIGKILL) != 0) /* shouldn't happen */
fprintf(stderr, "Can't kill process %d\n", pid);
exit(0);
}
msg(){
if(nomsg){
fprintf(stderr, "Keyboard locked; enter password to unlock\n");
nomsg = FALSE;
}
}
main(argc,argv)
int argc;
char **argv;
{
struct passwd *pwptr;
char *shell, p[MAX], pw[MAX], *try;
int nullpw, locked = TRUE;
if(argc == 1)
timeout = TIMEOUT;
else if(argc == 2){
timeout = atoi(argv[1]);
if(timeout == 0)
usage();
if(timeout > MAXTIME)
timeout = MAXTIME;
}
else usage();
if((shell = getenv(SHELL)) == NULL) {
fprintf(stderr,
"%cCan't find shell variable $%s\n\n", BELL, SHELL);
fprintf(stderr,
"In the C shell run:\n\tsetenv %s $$\n\n", SHELL);
fprintf(stderr,
"In the Bourne shell run:\n\t%s=$$\n\texport shellpid\n",
SHELL);
exit(1);
}
else pid = atoi(shell); /* process id of login shell */
sigset(SIGINT, msg);
sigset(SIGQUIT, msg);
sigset(SIGTSTP, msg);
sigset(SIGALRM, checktime);
sigset(SIGHUP, goodbye);
echo_off();
pwptr = getpwuid(getuid());
strcpy(pw,pwptr->pw_passwd); /* get encrypted password */
nullpw = strlen(pw) == 0; /* TRUE if no password */
fprintf(stderr, "Back within %d minute%c\n", timeout,
(timeout==1)?' ':'s');
alarm(MINUTE);
while(locked){
getline(p,stdin);
if(nullpw){
if(strlen(p) == 0)
locked = FALSE;
else printf("incorrect password\n");
}
else{
try = crypt(p,pw); /* test the password */
if(strcmp(try,pw) == 0)
locked = FALSE;
else printf("incorrect password\n");
}
}
echo_on();
}
getline(s,file)
char *s;
FILE *file;
{
/* get a line of input up to MAX characters */
/* return length of input or EOF or MAX */
int i=0;
char c;
while((c=fgetc(file)) != '\n'){
if(c == EOF){
rewind(file);
return(EOF);
}
s[i] = c;
i++;
if(i == MAX){
s[i-1] = '\0';
return(MAX);
}
}
s[i] = '\0';
return(i);
}
echo_off()
{
struct sgttyb ttybuf;
gtty(0, &ttybuf);
ttybuf.sg_flags &= ~ECHO;
stty(0, &ttybuf);
}
echo_on()
{
struct sgttyb ttybuf;
gtty(0, &ttybuf);
ttybuf.sg_flags |= ECHO;
stty(0, &ttybuf);
}
usage()
{
printf("Usage: lk [timeout]\n");
printf("locks keyboard until you type your password\n");
printf("quits after timeout minutes (default 5)\n");
exit(1);
}
--
UUCP { ihnp4 cornell decwrl watmath uw-beaver ubc-vision sask
garfield qucis linus mcgill-vision }!utcsrgv!oscar
or { allegra decvax duke floyd }!utzoo!utcsrgv!oscar