1 /* screenlock - lock a terminal */
9 char pic[] = "/lib/bunny.bit";
16 fprint(2, "usage: %s [-d]\n", argv0);
20 /* ^D, Delete, Enter, Backspace, ^U */
22 readline(char *buf, int nbuf)
29 if(read(0, &c, 1) != 1 || c == '\04' || c == '\177'){
34 else if(c == '\b' && i > 0)
36 else if(c == ('u' & 037))
52 memset(buf, 0, sizeof buf);
53 readline(buf, sizeof buf);
55 border(screen, screen->r, 8, display->white, ZP);
56 flushimage(display, 1);
59 ai = auth_userpasswd(getuser(), buf);
60 if(ai != nil && ai->cap != nil)
63 rerrstr(buf, sizeof buf);
64 if(strncmp(buf, "needkey ", 8) == 0)
68 border(screen, screen->r, 8, display->black, ZP);
69 flushimage(display, 1);
72 memset(buf, 0, sizeof buf);
80 if((fd = open("/dev/mousectl", OWRITE)) < 0)
84 if(blank != 0 && ((ulong)time(0) - (ulong)blank) >= 5){
86 write(fd, "blank", 5);
96 char ibuf[256], obuf[256];
98 if((fd = open("/dev/mouse", ORDWR)) < 0)
99 sysfatal("can't open /dev/mouse: %r");
101 snprint(obuf, sizeof obuf, "m %d %d",
102 screen->r.min.x + Dx(screen->r)/2,
103 screen->r.min.y + Dy(screen->r)/2);
105 while(read(fd, ibuf, sizeof ibuf) > 0){
110 if(x != screen->r.min.x + Dx(screen->r)/2 ||
111 y != screen->r.min.y + Dy(screen->r)/2){
113 fprint(fd, "%s", obuf);
125 if((fd = open("/dev/wctl", ORDWR)) < 0)
129 n = read(fd, buf, sizeof buf-1);
132 if(strstr(buf+48, "notcurrent"))
133 write(fd, "current", 7);
141 enum { Cursorlen = 2*4 + 2*2*16 };
143 char newcmd[128], cbuf[Cursorlen];
150 display = initdisplay(nil, nil, nil);
152 sysfatal("can't open /dev/draw: %r");
153 r = display->image->r;
154 snprint(newcmd, sizeof newcmd, "-r %d %d %d %d",
155 r.min.x, r.min.y, r.max.x, r.max.y);
156 closedisplay(display);
159 if((fd = open("/dev/consctl", OWRITE)) >= 0)
160 write(fd, "rawon", 5);
162 if((fd = open("/dev/cons", OREAD)) < 0)
163 sysfatal("can't open cons: %r");
166 if((fd = open("/dev/cons", OWRITE)) < 0)
167 sysfatal("can't open cons: %r");
171 if(initdraw(nil, nil, "screenlock") < 0)
172 sysfatal("initdraw failed");
173 screen = _screen->image; /* fullscreen */
175 if((fd = open(pic, OREAD)) >= 0){
176 if((i = readimage(display, fd, 0)) != nil){
178 p = Pt(r.max.x / 2, r.max.y * 2 / 3);
179 dx = (Dx(screen->r) - Dx(i->r)) / 2;
182 dy = (Dy(screen->r) - Dy(i->r)) / 2;
185 draw(screen, screen->r, display->black, nil, ZP);
186 draw(screen, r, i, nil, i->r.min);
190 /* identify the user on screen, centered */
191 tm = localtime(time(&blank));
192 s = smprint("user %s at %d:%02.2d", getuser(), tm->hour, tm->min);
193 p = subpt(p, Pt(stringwidth(font, "m") * strlen(s) / 2, 0));
194 stringbg(screen, p, display->white, ZP, font, s, display->black, ZP);
196 flushimage(display, 1);
198 /* screen is now open and covered. grab mouse and hold on tight */
199 procrfork(top, nil, 8*1024, RFFDG);
200 procrfork(grabmouse, nil, 8*1024, RFFDG);
201 procrfork(blanker, nil, 8*1024, RFFDG);
203 /* clear the cursor */
204 if((fd = open("/dev/cursor", OWRITE)) >= 0){
205 memset(cbuf, 0, sizeof cbuf);
206 write(fd, cbuf, sizeof cbuf);
212 threadmain(int argc, char *argv[])