X-Git-Url: https://git.danieliu.xyz/?a=blobdiff_plain;ds=sidebyside;f=slock.c;h=164a464d2174a73b627dc87527a2db77ba9e879b;hb=8a7a68c4c09cbc8b03cb2765ac83e99ca1cc808b;hp=836de453a335109409f107bc39f9a4252d0e35d2;hpb=2fa12210c9b6795f51a3227aaf417afe7f94fbce;p=slock.git diff --git a/slock.c b/slock.c index 836de45..164a464 100644 --- a/slock.c +++ b/slock.c @@ -1,8 +1,15 @@ /* (C)opyright MMIV-MMV Anselm R. Garbe * See LICENSE file for license details. */ -#define _XOPEN_SOURCE +#define _XOPEN_SOURCE 500 + +#if HAVE_SHADOW_H #include +#else +#include +#endif + +#include #include #include #include @@ -16,9 +23,13 @@ int main(int argc, char **argv) { char curs[] = {0, 0, 0, 0, 0, 0, 0, 0}; char buf[32], passwd[256]; - int num, prev_nitem, screen; + int num, screen; +#if HAVE_SHADOW_H struct spwd *sp; - unsigned int i, len; +#else + struct passwd *pw; +#endif + unsigned int len; Bool running = True; Cursor invisible; Display *dpy; @@ -33,11 +44,17 @@ main(int argc, char **argv) { fputs("slock-"VERSION", (C)opyright MMVI Anselm R. Garbe\n", stdout); exit(EXIT_SUCCESS); } - if(!(sp = getspnam(getenv("USER")))) { + if(geteuid() != 0) { fputs("slock: cannot retrieve password entry (make sure to suid slock)\n", stderr); exit(EXIT_FAILURE); } +#if HAVE_SHADOW_H + sp = getspnam(getenv("USER")); endspent(); +#else + pw = getpwuid(getuid()); + endpwent(); +#endif if(!(dpy = XOpenDisplay(0))) { fputs("slock: cannot open display\n", stderr); exit(EXIT_FAILURE); @@ -46,9 +63,6 @@ main(int argc, char **argv) { /* init */ passwd[0] = 0; - while(XGrabKeyboard(dpy, RootWindow(dpy, screen), True, GrabModeAsync, - GrabModeAsync, CurrentTime) != GrabSuccess) - usleep(1000); wa.override_redirect = 1; wa.background_pixel = BlackPixel(dpy, screen); @@ -61,6 +75,14 @@ main(int argc, char **argv) { pmap = XCreateBitmapFromData(dpy, w, curs, 8, 8); invisible = XCreatePixmapCursor(dpy, pmap, pmap, &black, &black, 0, 0); XDefineCursor(dpy, w, invisible); + running = XGrabPointer(dpy, RootWindow(dpy, screen), False, + ButtonPressMask | ButtonReleaseMask | PointerMotionMask, + GrabModeAsync, GrabModeSync, None, invisible, CurrentTime) == GrabSuccess; + len = 10; + for(len = 10; len && (XGrabKeyboard(dpy, RootWindow(dpy, screen), True, GrabModeAsync, + GrabModeAsync, CurrentTime) != GrabSuccess); len--) + usleep(1000); + running = running && (len > 0); XMapRaised(dpy, w); XSync(dpy, False); @@ -74,20 +96,13 @@ main(int argc, char **argv) { || IsMiscFunctionKey(ksym) || IsPFKey(ksym) || IsPrivateKeypadKey(ksym)) continue; - /* first check if a control mask is omitted */ - if(ev.xkey.state & ControlMask) { - switch (ksym) { - case XK_h: - case XK_H: ksym = XK_BackSpace; - break; - case XK_u: - case XK_U: passwd[0] = 0; - continue; - } - } switch(ksym) { case XK_Return: +#if HAVE_SHADOW_H if((running = strncmp(crypt(passwd, sp->sp_pwdp), sp->sp_pwdp, sizeof(passwd)))) +#else + if((running = strncmp(crypt(passwd, pw->pw_passwd), pw->pw_passwd, sizeof(passwd)))) +#endif XBell(dpy, 100); passwd[0] = 0; break; @@ -109,6 +124,7 @@ main(int argc, char **argv) { break; } } + XUngrabPointer(dpy, CurrentTime); XFreePixmap(dpy, pmap); XDestroyWindow(dpy, w); XCloseDisplay(dpy);