1 /* screenlock - lock a terminal */
9 char pic[] = "/lib/bunny.bit";
16 fprint(2, "usage: %s [-d]\n", argv0);
21 readline(char *buf, int nbuf)
28 if(read(0, &c, 1) != 1 || c == '\04' || c == '\177'){
33 else if(c == '\b' && i > 0)
35 else if(c == ('u' & 037))
51 memset(buf, 0, sizeof buf);
52 readline(buf, sizeof buf);
54 border(screen, screen->r, 8, display->white, ZP);
55 flushimage(display, 1);
58 ai = auth_userpasswd(getuser(), buf);
59 if(ai != nil && ai->cap != nil)
62 rerrstr(buf, sizeof buf);
63 if(strncmp(buf, "needkey ", 8) == 0)
67 border(screen, screen->r, 8, display->black, ZP);
68 flushimage(display, 1);
71 memset(buf, 0, sizeof buf);
79 if((fd = open("/dev/mousectl", OWRITE)) < 0)
83 if(blank != 0 && ((ulong)time(0) - (ulong)blank) >= 5){
85 write(fd, "blank", 5);
95 char ibuf[256], obuf[256];
97 if((fd = open("/dev/mouse", ORDWR)) < 0)
98 sysfatal("can't open /dev/mouse: %r");
100 snprint(obuf, sizeof obuf, "m %d %d",
101 screen->r.min.x + Dx(screen->r)/2,
102 screen->r.min.y + Dy(screen->r)/2);
104 while(read(fd, ibuf, sizeof ibuf) > 0){
109 if(x != screen->r.min.x + Dx(screen->r)/2 ||
110 y != screen->r.min.y + Dy(screen->r)/2){
112 fprint(fd, "%s", obuf);
121 enum { Nfld = 5, Fldlen = 12, Cursorlen = 2*4 + 2*2*16, };
123 char buf[Nfld*Fldlen], *flds[Nfld], newcmd[128], cbuf[Cursorlen];
130 if((fd = open("/dev/screen", OREAD)) < 0)
131 sysfatal("can't open /dev/screen: %r");
132 if(read(fd, buf, Nfld*Fldlen) != Nfld*Fldlen)
133 sysfatal("can't read /dev/screen: %r");
135 buf[sizeof buf-1] = 0;
136 if(tokenize(buf, flds, Nfld) != Nfld)
137 sysfatal("can't tokenize /dev/screen header");
138 snprint(newcmd, sizeof newcmd, "-r %s %s %s %s",
139 flds[1], flds[2], flds[3], flds[4]);
142 if((fd = open("/dev/consctl", OWRITE)) >= 0)
143 write(fd, "rawon", 5);
145 if((fd = open("/dev/cons", OREAD)) < 0)
146 sysfatal("can't open cons: %r");
149 if((fd = open("/dev/cons", OWRITE)) < 0)
150 sysfatal("can't open cons: %r");
154 if(initdraw(nil, nil, "screenlock") < 0)
155 sysfatal("initdraw failed");
156 screen = _screen->image; /* fullscreen */
158 if((fd = open(pic, OREAD)) >= 0){
159 if((i = readimage(display, fd, 0)) != nil){
161 p = Pt(r.max.x / 2, r.max.y * 2 / 3);
162 dx = (Dx(screen->r) - Dx(i->r)) / 2;
165 dy = (Dy(screen->r) - Dy(i->r)) / 2;
168 draw(screen, screen->r, display->black, nil, ZP);
169 draw(screen, r, i, nil, i->r.min);
173 /* identify the user on screen, centered */
174 tm = localtime(time(&blank));
175 s = smprint("user %s at %d:%02.2d", getuser(), tm->hour, tm->min);
176 p = subpt(p, Pt(stringwidth(font, "m") * strlen(s) / 2, 0));
177 string(screen, p, screen->display->white, ZP, font, s);
179 flushimage(display, 1);
181 /* screen is now open and covered. grab mouse and hold on tight */
182 procrfork(grabmouse, nil, 8*1024, RFFDG);
183 procrfork(blanker, nil, 8*1024, RFFDG);
185 /* clear the cursor */
186 if((fd = open("/dev/cursor", OWRITE)) >= 0){
187 memset(cbuf, 0, sizeof cbuf);
188 write(fd, cbuf, sizeof cbuf);
194 threadmain(int argc, char *argv[])