gorlick (03/25/83)
Lock(1) suffers from the following deficiencies: (1) it doesn't print `LOCKED' on the terminal as the manual page claims; (2) it doesn't ignore the stop signal thereby permitting any user to regain control of the terminal; (3) it doesn't timeout after a short period of time; (4) if killed it leaves the terminal in a state with echo disabled; (5) it contains a master password mechanism allowing any knowledgeable user to unlock any `locked' terminal; The following source corrects the problems listed above. -Michael Gorlick, TRW- #include <stdio.h> #include <sys/types.h> #include <stat.h> #include <signal.h> #include <sgtty.h> #define BELL '\007' #define TIMEOUT (15*60) #define MINUTES (TIMEOUT/60.) struct sgttyb Old, New; char *Whoami; int wakeup(); /* alarm and terminate signal handler */ main(argc, argv) int argc; char *argv[]; { register int i; char s[BUFSIZ], t[BUFSIZ]; Whoami = argv[0]; for (i = 1; i <= NSIG; i++) switch (i) { case SIGHUP: case SIGALRM: case SIGTERM: continue; default: signal(i, SIG_IGN); } if (gtty(0, &Old)) exit(1); New = Old; New.sg_flags &= ~ECHO; stty(0, &New); printf("Key: "); gets(s, sizeof s, stdin); printf("\nAgain: "); gets(t, sizeof t, stdin); putchar('\n'); if (strcmp(s, t)) { putchar(BELL); stty(0, &Old); exit(1); } printf("LOCKED\n"); signal(SIGALRM, wakeup); signal(SIGTERM, wakeup); alarm(TIMEOUT); for (;;) { gets(s, sizeof s, stdin); if (strcmp(s, t) == 0) break; putchar(BELL); if (gtty(0, &New)) exit(1); } stty(0, &Old); exit(0); } wakeup (which) int which; { if (which == SIGALRM) printf("%s: timed out after %.1f minutes\n", Whoami, MINUTES); else if (which == SIGTERM) printf("%s: terminated\n", Whoami); stty(0, &Old); exit(1); }