|
|
@ -1,4 +1,4 @@ |
|
|
|
/* © 2006-2007 Anselm R. Garbe <garbeam at gmail dot com>
|
|
|
|
/* © 2006-2008 Anselm R Garbe <garbeam at gmail dot com>
|
|
|
|
* See LICENSE file for license details. */ |
|
|
|
* See LICENSE file for license details. */ |
|
|
|
#define _XOPEN_SOURCE 500 |
|
|
|
#define _XOPEN_SOURCE 500 |
|
|
|
#if HAVE_SHADOW_H |
|
|
|
#if HAVE_SHADOW_H |
|
|
@ -16,6 +16,12 @@ |
|
|
|
#include <X11/keysym.h> |
|
|
|
#include <X11/keysym.h> |
|
|
|
#include <X11/Xlib.h> |
|
|
|
#include <X11/Xlib.h> |
|
|
|
#include <X11/Xutil.h> |
|
|
|
#include <X11/Xutil.h> |
|
|
|
|
|
|
|
#include <X11/extensions/dpms.h> |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#if HAVE_BSD_AUTH |
|
|
|
|
|
|
|
#include <login_cap.h> |
|
|
|
|
|
|
|
#include <bsd_auth.h> |
|
|
|
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
|
|
void |
|
|
|
void |
|
|
|
eprint(const char *errstr, ...) { |
|
|
|
eprint(const char *errstr, ...) { |
|
|
@ -27,6 +33,7 @@ eprint(const char *errstr, ...) { |
|
|
|
exit(EXIT_FAILURE); |
|
|
|
exit(EXIT_FAILURE); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#ifndef HAVE_BSD_AUTH |
|
|
|
const char * |
|
|
|
const char * |
|
|
|
get_password() { /* only run as root */ |
|
|
|
get_password() { /* only run as root */ |
|
|
|
const char *rval; |
|
|
|
const char *rval; |
|
|
@ -46,18 +53,23 @@ get_password() { /* only run as root */ |
|
|
|
rval = sp->sp_pwdp; |
|
|
|
rval = sp->sp_pwdp; |
|
|
|
} |
|
|
|
} |
|
|
|
#endif |
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
|
|
/* drop privileges */ |
|
|
|
/* drop privileges */ |
|
|
|
if(setgid(pw->pw_gid) < 0 || setuid(pw->pw_uid) < 0) |
|
|
|
if(setgid(pw->pw_gid) < 0 || setuid(pw->pw_uid) < 0) |
|
|
|
eprint("slock: cannot drop privileges\n"); |
|
|
|
eprint("slock: cannot drop privileges\n"); |
|
|
|
return rval; |
|
|
|
return rval; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
|
|
int |
|
|
|
int |
|
|
|
main(int argc, char **argv) { |
|
|
|
main(int argc, char **argv) { |
|
|
|
char curs[] = {0, 0, 0, 0, 0, 0, 0, 0}; |
|
|
|
char curs[] = {0, 0, 0, 0, 0, 0, 0, 0}; |
|
|
|
char buf[32], passwd[256]; |
|
|
|
char buf[32], passwd[256]; |
|
|
|
int num, screen; |
|
|
|
int num, screen; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#ifndef HAVE_BSD_AUTH |
|
|
|
const char *pws; |
|
|
|
const char *pws; |
|
|
|
|
|
|
|
#endif |
|
|
|
unsigned int len; |
|
|
|
unsigned int len; |
|
|
|
Bool running = True; |
|
|
|
Bool running = True; |
|
|
|
Cursor invisible; |
|
|
|
Cursor invisible; |
|
|
@ -70,10 +82,14 @@ main(int argc, char **argv) { |
|
|
|
XSetWindowAttributes wa; |
|
|
|
XSetWindowAttributes wa; |
|
|
|
|
|
|
|
|
|
|
|
if((argc == 2) && !strcmp("-v", argv[1])) |
|
|
|
if((argc == 2) && !strcmp("-v", argv[1])) |
|
|
|
eprint("slock-"VERSION", © 2006-2007 Anselm R. Garbe\n"); |
|
|
|
eprint("slock-"VERSION", © 2006-2008 Anselm R Garbe\n"); |
|
|
|
else if(argc != 1) |
|
|
|
else if(argc != 1) |
|
|
|
eprint("usage: slock [-v]\n"); |
|
|
|
eprint("usage: slock [-v]\n"); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#ifndef HAVE_BSD_AUTH |
|
|
|
pws = get_password(); |
|
|
|
pws = get_password(); |
|
|
|
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
|
|
if(!(dpy = XOpenDisplay(0))) |
|
|
|
if(!(dpy = XOpenDisplay(0))) |
|
|
|
eprint("slock: cannot open display\n"); |
|
|
|
eprint("slock: cannot open display\n"); |
|
|
|
screen = DefaultScreen(dpy); |
|
|
|
screen = DefaultScreen(dpy); |
|
|
@ -109,7 +125,9 @@ main(int argc, char **argv) { |
|
|
|
XSync(dpy, False); |
|
|
|
XSync(dpy, False); |
|
|
|
|
|
|
|
|
|
|
|
/* main event loop */ |
|
|
|
/* main event loop */ |
|
|
|
while(running && !XNextEvent(dpy, &ev)) |
|
|
|
while(running && !XNextEvent(dpy, &ev)) { |
|
|
|
|
|
|
|
if(len == 0)
|
|
|
|
|
|
|
|
DPMSForceLevel(dpy, DPMSModeOff); |
|
|
|
if(ev.type == KeyPress) { |
|
|
|
if(ev.type == KeyPress) { |
|
|
|
buf[0] = 0; |
|
|
|
buf[0] = 0; |
|
|
|
num = XLookupString(&ev.xkey, buf, sizeof buf, &ksym, 0); |
|
|
|
num = XLookupString(&ev.xkey, buf, sizeof buf, &ksym, 0); |
|
|
@ -120,7 +138,14 @@ main(int argc, char **argv) { |
|
|
|
switch(ksym) { |
|
|
|
switch(ksym) { |
|
|
|
case XK_Return: |
|
|
|
case XK_Return: |
|
|
|
passwd[len] = 0; |
|
|
|
passwd[len] = 0; |
|
|
|
if((running = strcmp(crypt(passwd, pws), pws)) != 0) |
|
|
|
|
|
|
|
|
|
|
|
#ifdef HAVE_BSD_AUTH |
|
|
|
|
|
|
|
running = !auth_userokay(getlogin(), NULL, "auth-xlock", passwd); |
|
|
|
|
|
|
|
#else |
|
|
|
|
|
|
|
running = strcmp(crypt(passwd, pws), pws); |
|
|
|
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (running != 0) |
|
|
|
XBell(dpy, 100); |
|
|
|
XBell(dpy, 100); |
|
|
|
len = 0; |
|
|
|
len = 0; |
|
|
|
break; |
|
|
|
break; |
|
|
@ -139,6 +164,7 @@ main(int argc, char **argv) { |
|
|
|
break; |
|
|
|
break; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
XUngrabPointer(dpy, CurrentTime); |
|
|
|
XUngrabPointer(dpy, CurrentTime); |
|
|
|
XFreePixmap(dpy, pmap); |
|
|
|
XFreePixmap(dpy, pmap); |
|
|
|
XDestroyWindow(dpy, w); |
|
|
|
XDestroyWindow(dpy, w); |
|
|
|