X-Git-Url: https://git.xinqibao.xyz/slock.git/blobdiff_plain/15a098bb27c75612fb91aac7344ad47949517fa5..597d0f27f53cf152edd1c230def4fd7983ac5919:/slock.c?ds=sidebyside diff --git a/slock.c b/slock.c index db3aae0..12c991f 100644 --- a/slock.c +++ b/slock.c @@ -1,28 +1,42 @@ /* (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 #include #include -#include #include #include #include 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; - KeySym ksym; + Cursor invisible; Display *dpy; + KeySym ksym; + Pixmap pmap; Window w; + XColor black, dummy; XEvent ev; XSetWindowAttributes wa; @@ -30,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); @@ -54,7 +74,10 @@ main(int argc, char **argv) { 0, DefaultDepth(dpy, screen), CopyFromParent, DefaultVisual(dpy, screen), CWOverrideRedirect | CWBackPixel, &wa); - XDefineCursor(dpy, w, XCreateFontCursor(dpy, XC_coffee_mug)); + XAllocNamedColor(dpy, DefaultColormap(dpy, screen), "black", &black, &dummy); + pmap = XCreateBitmapFromData(dpy, w, curs, 8, 8); + invisible = XCreatePixmapCursor(dpy, pmap, pmap, &black, &black, 0, 0); + XDefineCursor(dpy, w, invisible); XMapRaised(dpy, w); XSync(dpy, False); @@ -81,7 +104,11 @@ main(int argc, char **argv) { } 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; @@ -103,6 +130,7 @@ main(int argc, char **argv) { break; } } + XFreePixmap(dpy, pmap); XDestroyWindow(dpy, w); XCloseDisplay(dpy); return 0;