-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathlock.c
101 lines (91 loc) · 2.25 KB
/
lock.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
/* The screen locking module for splitvt */
#include <unistd.h>
#include <sys/types.h>
#include <string.h>
#include <stdio.h>
#include <pwd.h>
#include "vt100.h"
#include "splitvt.h"
#define UNLOCKED 0
#define ENTERED1 1
#define ENTERED2 2
#define LOCKED 3
static int lock_state=UNLOCKED;
/* The number of characters entered (prevent overflow) */
static int cnt=0;
static char entered1[BUFSIZ], entered2[BUFSIZ];
static char *nextbuf=entered1;
static struct passwd *pw=NULL;
/* Used to release our input when the screen is unlocked */
extern void (*do_input)(), normal_input();
/* Since this function is called as an input function, we need to handle
all state here.
*/
void lock_screen(char c)
{
char message[512];
if ( c == '\r' ) {
switch (lock_state) {
case UNLOCKED: /* No password entered, cancel lock */
vt_info("Lock cancelled.");
reset_bar(1);
do_input=normal_input;
break;
case ENTERED1: /* First password has been entered */
*nextbuf='\0';
nextbuf=entered2;
cnt=0;
vt_info("Re-enter password: ");
lock_state=ENTERED2;
break;
case ENTERED2: /* Second password has been entered */
*nextbuf='\0';
nextbuf=entered1;
cnt=0;
if (strcmp(entered1, entered2) == 0) {
sprintf(message,
"Screen locked by %s. Enter password: ",
pw?pw->pw_name:"user");
vt_info(message);
lock_state=LOCKED;
} else {
sprintf(message,
"Passwords do not match. Try again: ");
vt_info(message);
lock_state=UNLOCKED;
}
break;
case LOCKED: /* Verify password */
*nextbuf='\0';
nextbuf=entered1;
cnt=0;
if (strcmp(entered1, entered2) == 0) {
vt_info(NULL);
do_input=normal_input;
lock_state=UNLOCKED;
} else {
sprintf(message,
"Password incorrect. Try again: ");
vt_info(message);
}
break;
default: /* What?? */
break;
}
} else {
switch (lock_state) {
case UNLOCKED: /* No password entered, start lock */
pw=getpwuid(getuid()); /* Can fail */
nextbuf=entered1;
lock_state=ENTERED1;
/* Fall through */
case ENTERED1:
case ENTERED2:
case LOCKED:
++cnt;
if (cnt < BUFSIZ-1) { *(nextbuf++) = c; cnt++; }
break;
}
}
return;
}