| applied Vincent's path with some modifications - slock - simple X display locke… | |
| git clone git://git.suckless.org/slock | |
| Log | |
| Files | |
| Refs | |
| README | |
| LICENSE | |
| --- | |
| commit 27d8d248275ca3eb63882202dcc21ecf2f81e72a | |
| parent 8a7a68c4c09cbc8b03cb2765ac83e99ca1cc808b | |
| Author: arg@mig29 <unknown> | |
| Date: Tue, 31 Oct 2006 08:35:54 +0100 | |
| applied Vincent's path with some modifications | |
| Diffstat: | |
| M slock.c | 80 +++++++++++++++++------------… | |
| 1 file changed, 43 insertions(+), 37 deletions(-) | |
| --- | |
| diff --git a/slock.c b/slock.c | |
| @@ -3,32 +3,55 @@ | |
| */ | |
| #define _XOPEN_SOURCE 500 | |
| -#if HAVE_SHADOW_H | |
| -#include <shadow.h> | |
| -#else | |
| -#include <pwd.h> | |
| -#endif | |
| - | |
| #include <ctype.h> | |
| +#include <pwd.h> | |
| #include <stdlib.h> | |
| #include <stdio.h> | |
| #include <string.h> | |
| #include <unistd.h> | |
| +#if HAVE_SHADOW_H | |
| +#include <shadow.h> | |
| +#endif | |
| #include <sys/types.h> | |
| #include <X11/keysym.h> | |
| #include <X11/Xlib.h> | |
| #include <X11/Xutil.h> | |
| +const char * | |
| +get_password() { /* only run as root */ | |
| + const char *rval; | |
| + struct passwd *pw; | |
| + | |
| + if(geteuid() != 0) { | |
| + fputs("slock: cannot retrieve password entry (make sure to sui… | |
| + exit(EXIT_FAILURE); | |
| + } | |
| + pw = getpwuid(getuid()); | |
| + endpwent(); | |
| + rval = pw->pw_passwd; | |
| + | |
| +#if HAVE_SHADOW_H | |
| + { | |
| + struct spwd *sp; | |
| + sp = getspnam(getenv("USER")); | |
| + endspent(); | |
| + rval = sp->sp_pwdp; | |
| + } | |
| +#endif | |
| + /* drop privileges */ | |
| + if(setgid(pw->pw_gid) < 0 || setuid(pw->pw_uid) < 0) { | |
| + fputs("slock: cannot drop privileges\n",stdout); | |
| + exit(EXIT_FAILURE); | |
| + } | |
| + return rval; | |
| +} | |
| + | |
| int | |
| main(int argc, char **argv) { | |
| char curs[] = {0, 0, 0, 0, 0, 0, 0, 0}; | |
| char buf[32], passwd[256]; | |
| int num, screen; | |
| -#if HAVE_SHADOW_H | |
| - struct spwd *sp; | |
| -#else | |
| - struct passwd *pw; | |
| -#endif | |
| + const char *pws; | |
| unsigned int len; | |
| Bool running = True; | |
| Cursor invisible; | |
| @@ -44,17 +67,7 @@ main(int argc, char **argv) { | |
| fputs("slock-"VERSION", (C)opyright MMVI Anselm R. Garbe\n", s… | |
| exit(EXIT_SUCCESS); | |
| } | |
| - if(geteuid() != 0) { | |
| - fputs("slock: cannot retrieve password entry (make sure to sui… | |
| - exit(EXIT_FAILURE); | |
| - } | |
| -#if HAVE_SHADOW_H | |
| - sp = getspnam(getenv("USER")); | |
| - endspent(); | |
| -#else | |
| - pw = getpwuid(getuid()); | |
| - endpwent(); | |
| -#endif | |
| + pws = get_password(); | |
| if(!(dpy = XOpenDisplay(0))) { | |
| fputs("slock: cannot open display\n", stderr); | |
| exit(EXIT_FAILURE); | |
| @@ -62,7 +75,7 @@ main(int argc, char **argv) { | |
| screen = DefaultScreen(dpy); | |
| /* init */ | |
| - passwd[0] = 0; | |
| + len = 0; | |
| wa.override_redirect = 1; | |
| wa.background_pixel = BlackPixel(dpy, screen); | |
| @@ -89,7 +102,6 @@ main(int argc, char **argv) { | |
| /* main event loop */ | |
| while(running && !XNextEvent(dpy, &ev)) | |
| if(ev.type == KeyPress) { | |
| - len = strlen(passwd); | |
| buf[0] = 0; | |
| num = XLookupString(&ev.xkey, buf, sizeof(buf), &ksym,… | |
| if(IsFunctionKey(ksym) || IsKeypadKey(ksym) | |
| @@ -98,28 +110,22 @@ main(int argc, char **argv) { | |
| continue; | |
| switch(ksym) { | |
| case XK_Return: | |
| -#if HAVE_SHADOW_H | |
| - if((running = strncmp(crypt(passwd, sp->sp_pwd… | |
| -#else | |
| - if((running = strncmp(crypt(passwd, pw->pw_pas… | |
| -#endif | |
| + passwd[len] = 0; | |
| + if((running = strcmp(crypt(passwd, pws), pws))… | |
| XBell(dpy, 100); | |
| - passwd[0] = 0; | |
| + len = 0; | |
| break; | |
| case XK_Escape: | |
| - passwd[0] = 0; | |
| + len = 0; | |
| break; | |
| case XK_BackSpace: | |
| if(len) | |
| - passwd[--len] = 0; | |
| + --len; | |
| break; | |
| default: | |
| if(num && !iscntrl((int) buf[0])) { | |
| - buf[num] = 0; | |
| - if(len) | |
| - strncat(passwd, buf, sizeof(pa… | |
| - else | |
| - strncpy(passwd, buf, sizeof(pa… | |
| + memcpy(passwd + len,buf,num); | |
| + len += num; | |
| } | |
| break; | |
| } |