Xinqi Bao's Git
1 /* © 2006-2008 Anselm R Garbe <garbeam at gmail dot com>
2 * See LICENSE file for license details. */
3 #define _XOPEN_SOURCE 500
15 #include <sys/types.h>
16 #include <X11/keysym.h>
18 #include <X11/Xutil.h>
19 #include <X11/extensions/dpms.h>
22 #include <login_cap.h>
27 eprint(const char *errstr
, ...) {
31 vfprintf(stderr
, errstr
, ap
);
38 get_password() { /* only run as root */
43 eprint("slock: cannot retrieve password entry (make sure to suid slock)\n");
44 pw
= getpwuid(getuid());
51 sp
= getspnam(getenv("USER"));
58 if(setgid(pw
->pw_gid
) < 0 || setuid(pw
->pw_uid
) < 0)
59 eprint("slock: cannot drop privileges\n");
65 main(int argc
, char **argv
) {
66 char curs
[] = {0, 0, 0, 0, 0, 0, 0, 0};
67 char buf
[32], passwd
[256];
82 XSetWindowAttributes wa
;
84 if((argc
== 2) && !strcmp("-v", argv
[1]))
85 eprint("slock-"VERSION
", © 2006-2008 Anselm R Garbe\n");
87 eprint("usage: slock [-v]\n");
93 if(!(dpy
= XOpenDisplay(0)))
94 eprint("slock: cannot open display\n");
95 screen
= DefaultScreen(dpy
);
96 root
= RootWindow(dpy
, screen
);
99 wa
.override_redirect
= 1;
100 wa
.background_pixel
= BlackPixel(dpy
, screen
);
101 w
= XCreateWindow(dpy
, root
, 0, 0, DisplayWidth(dpy
, screen
), DisplayHeight(dpy
, screen
),
102 0, DefaultDepth(dpy
, screen
), CopyFromParent
,
103 DefaultVisual(dpy
, screen
), CWOverrideRedirect
| CWBackPixel
, &wa
);
104 XAllocNamedColor(dpy
, DefaultColormap(dpy
, screen
), "black", &black
, &dummy
);
105 pmap
= XCreateBitmapFromData(dpy
, w
, curs
, 8, 8);
106 invisible
= XCreatePixmapCursor(dpy
, pmap
, pmap
, &black
, &black
, 0, 0);
107 XDefineCursor(dpy
, w
, invisible
);
109 for(len
= 1000; len
; len
--) {
110 if(XGrabPointer(dpy
, root
, False
, ButtonPressMask
| ButtonReleaseMask
| PointerMotionMask
,
111 GrabModeAsync
, GrabModeAsync
, None
, invisible
, CurrentTime
) == GrabSuccess
)
115 if((running
= running
&& (len
> 0))) {
116 for(len
= 1000; len
; len
--) {
117 if(XGrabKeyboard(dpy
, root
, True
, GrabModeAsync
, GrabModeAsync
, CurrentTime
)
127 /* main event loop */
128 while(running
&& !XNextEvent(dpy
, &ev
)) {
130 DPMSForceLevel(dpy
, DPMSModeOff
);
131 if(ev
.type
== KeyPress
) {
133 num
= XLookupString(&ev
.xkey
, buf
, sizeof buf
, &ksym
, 0);
134 if(IsFunctionKey(ksym
) || IsKeypadKey(ksym
)
135 || IsMiscFunctionKey(ksym
) || IsPFKey(ksym
)
136 || IsPrivateKeypadKey(ksym
))
143 running
= !auth_userokay(getlogin(), NULL
, "auth-xlock", passwd
);
145 running
= strcmp(crypt(passwd
, pws
), pws
);
160 if(num
&& !iscntrl((int) buf
[0]) && (len
+ num
< sizeof passwd
)) {
161 memcpy(passwd
+ len
, buf
, num
);
168 XUngrabPointer(dpy
, CurrentTime
);
169 XFreePixmap(dpy
, pmap
);
170 XDestroyWindow(dpy
, w
);