Introduction
Introduction Statistics Contact Development Disclaimer Help
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;
}
You are viewing proxied material from suckless.org. The copyright of proxied material belongs to its original authors. Any comments or complaints in relation to proxied material should be directed to the original authors of the content concerned. Please see the disclaimer for more details.