|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - downloadIndex: ┃ T t ┃
Length: 5278 (0x149e) Types: TextFile Names: »tlock.c«
└─⟦a0efdde77⟧ Bits:30001252 EUUGD11 Tape, 1987 Spring Conference Helsinki └─ ⟦this⟧ »EUUGD11/euug-87hel/sec1/tlock/tlock.c«
/* ** Program: TLOCK ** ** Function: VT200 terminal lock program. ** ** Author: Grenville Whelan 1986, (gdw@uk.co.ssl-macc) ** ** Description: TLOCK is basically another 'lock' program, but with screen ** layout designed to look like a VT200 set-up screen. When ** called, the user is prompted for a key, (or password), and ** verification of that key; the terminal then "locks" up ** until the same key is re-entered. A prompt for this "unlock" ** key will appear once "CONTROL-C" is entered. If the key is ** incorrect, the screen will be re-drawn, and will continue ** to "lock" until the correct key is given. If the key has been ** forgotten, the "tlock" process must be "killed" from another ** terminal. On a successful key, the terminal will be reset, ** and the user can continue what he was doing prior to the lock. ** ** Arguments: None read. ** ** Compile: cc tlock.c -o tlock -lcurses -ltermlib ** ** Notes: This utility will also work on VT100 compatibles and probably ** most other VT100 compatible terminals as well, although the ** Set-up feature that this is designed to immitate will be ** inaccurate. ** */ #include <stdio.h> #include <signal.h> #include <curses.h> #define MAXNAMELEN 256 /* Max name length */ #define CLEAR "\33[H\33[J" /* DEC ESC to clear screen */ #define BELL "\7" /* DEC ESC to ring bell */ #define PROMPTLINE "\33[24;28f" /* Cursor position for prompt line */ #define CLETOEOL "\33[K" /* Clear to end of line escape */ #define ATTOFF "\33[0m" /* Turn video attributes off */ #define BOLDON "\33[1m" /* Turn bold attribute on */ #define CURSON "\33[?25h" /* Make cursor visible */ #define CURSOFF "\33[?25l" /* Make cursor invisible */ long random(); /* Random number generator */ char key[MAXNAMELEN]; /* User-input lock-key */ int ok; /* Set-up options */ char *ops[] = { "\33[7m Display \33[0m", "\33[7m General \33[0m", "\33[7m Comm \33[0m", "\33[7m Printer \33[0m", "\33[7m Keyboard \33[0m", "\33[7m Tab \33[0m", "\33[7m On Line \33[0m", "\33[7m Clear Display \33[0m", "\33[7m Clear Comm \33[0m", "\33[7m Reset Terminal \33[0m", "\33[7m Recall \33[0m", "\33[7m Save \33[0m", "\33[7m Set-Up=English \33[0m", "\33[7m North American Keyboard \33[0m", "\33[7m Default \33[0m", "\33[7m Exit \33[0m" }; /* Cursor positions for Set-up options */ char *ps[] = { "\33[18;1f", "\33[18;11f", "\33[18;21f", "\33[18;28f", "\33[18;38f", "\33[18;49f", "\33[20;1f", "\33[20;11f", "\33[20;27f", "\33[20;40f", "\33[20;57f", "\33[20;66f", "\33[22;1f", "\33[22;18f", "\33[22;46f", "\33[22;56f" }; main() { int i=0, sig, sig_trap(), n=0; char again[MAXNAMELEN]; initscr(); /* Initialise interrupt routine */ for(sig=0; sig<NSIG; sig++) signal(sig,sig_trap); /* Draw VT200 set-up screen */ printf("\33[H\33[J\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n"); printf("\33#6\33[1m\33[5mSet-up Directory\33[0m "); printf(" \33[4mVT220 V2.0\33[0m\n"); printf("\n\n\n\n\n----------------------------------------"); printf("----------------------------------------\n"); printf(" Replace Mode"); for(i=0; i<16; ++i) { printf("%s\33[1m%s\33[0m\n",ps[i],ops[i]); printf("%s%s\n",ps[i],ops[i]); } /* Turn off terminal echo */ noecho(); /* Get lock key */ printf("%s%s%sKey: ",ATTOFF,PROMPTLINE,CURSON); gets(key); /* Get verificational key */ printf("%s%s%sAgain :",ATTOFF,PROMPTLINE,CURSON); gets(again); /* Verify */ if(strcmp(key,again)) { printf("%s%s",BELL,CLEAR); echo(); endwin(); exit(); } /* Re-draw upset screen */ printf("%sPrinter: None%s",PROMPTLINE,CURSOFF); fflush(stdout); /* Continuously light up a random block on the screen */ while(1) { n=(random() % 16); printf("%s%s%s%s\n",ps[n],BOLDON,ops[n],ATTOFF); ok = 1; sleep(1); ok = 0; printf("%s%s\n",ps[n],ops[n]); } } sig_trap(sig) /* Interrupt handler */ int sig; /* Signal number */ { char try[MAXNAMELEN]; if(sig!=SIGINT) /* Ignore anything but Control-C interrupt */ return(0); if(!ok) return(0); /* Get key to unlock terminal from user */ printf("%s%sKey :%s%s",ATTOFF,PROMPTLINE,CLETOEOL,CURSON); gets(try); /* If key is incorrect, relock screen and return */ if(strcmp(try,key)) { printf("%s%sPrinter: None%s",BELL,PROMPTLINE,CURSOFF); fflush(stdout); return(0); } /* Otherwise, clear screen and reset terminal and finally exit */ else { printf("%s%s\n",CLEAR,CURSON); echo(); endwin(); exit(); } }