aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--config.mk5
-rw-r--r--slock.c22
2 files changed, 25 insertions, 2 deletions
diff --git a/config.mk b/config.mk
index 48eef1f..0333587 100644
--- a/config.mk
+++ b/config.mk
@@ -15,11 +15,14 @@ INCS = -I. -I/usr/include -I${X11INC}
15LIBS = -L/usr/lib -lc -lcrypt -L${X11LIB} -lX11 15LIBS = -L/usr/lib -lc -lcrypt -L${X11LIB} -lX11
16 16
17# flags 17# flags
18CFLAGS = -Os ${INCS} -DVERSION=\"${VERSION}\" 18CFLAGS = -Os ${INCS} -DVERSION=\"${VERSION}\" -DHAVE_SHADOW_H
19LDFLAGS = ${LIBS} 19LDFLAGS = ${LIBS}
20#CFLAGS = -g -Wall -O2 ${INCS} -DVERSION=\"${VERSION}\" 20#CFLAGS = -g -Wall -O2 ${INCS} -DVERSION=\"${VERSION}\"
21#LDFLAGS = -g ${LIBS} 21#LDFLAGS = -g ${LIBS}
22 22
23# On *BSD remove -DHAVE_SHADOW_H from CFLAGS
24# On OpenBSD remove -lcrypt from LIBS
25
23# compiler and linker 26# compiler and linker
24CC = cc 27CC = cc
25LD = ${CC} 28LD = ${CC}
diff --git a/slock.c b/slock.c
index 836de45..866400d 100644
--- a/slock.c
+++ b/slock.c
@@ -2,7 +2,13 @@
2 * See LICENSE file for license details. 2 * See LICENSE file for license details.
3 */ 3 */
4#define _XOPEN_SOURCE 4#define _XOPEN_SOURCE
5
6#if HAVE_SHADOW_H
5#include <shadow.h> 7#include <shadow.h>
8#else
9#include <pwd.h>
10#endif
11
6#include <stdlib.h> 12#include <stdlib.h>
7#include <stdio.h> 13#include <stdio.h>
8#include <string.h> 14#include <string.h>
@@ -17,7 +23,11 @@ main(int argc, char **argv) {
17 char curs[] = {0, 0, 0, 0, 0, 0, 0, 0}; 23 char curs[] = {0, 0, 0, 0, 0, 0, 0, 0};
18 char buf[32], passwd[256]; 24 char buf[32], passwd[256];
19 int num, prev_nitem, screen; 25 int num, prev_nitem, screen;
26#if HAVE_SHADOW_H
20 struct spwd *sp; 27 struct spwd *sp;
28#else
29 struct passwd *pw;
30#endif
21 unsigned int i, len; 31 unsigned int i, len;
22 Bool running = True; 32 Bool running = True;
23 Cursor invisible; 33 Cursor invisible;
@@ -33,11 +43,17 @@ main(int argc, char **argv) {
33 fputs("slock-"VERSION", (C)opyright MMVI Anselm R. Garbe\n", stdout); 43 fputs("slock-"VERSION", (C)opyright MMVI Anselm R. Garbe\n", stdout);
34 exit(EXIT_SUCCESS); 44 exit(EXIT_SUCCESS);
35 } 45 }
36 if(!(sp = getspnam(getenv("USER")))) { 46 if(geteuid() != 0) {
37 fputs("slock: cannot retrieve password entry (make sure to suid slock)\n", stderr); 47 fputs("slock: cannot retrieve password entry (make sure to suid slock)\n", stderr);
38 exit(EXIT_FAILURE); 48 exit(EXIT_FAILURE);
39 } 49 }
50#if HAVE_SHADOW_H
51 sp = getspnam(getenv("USER"));
40 endspent(); 52 endspent();
53#else
54 pw = getpwuid(getuid());
55 endpwent();
56#endif
41 if(!(dpy = XOpenDisplay(0))) { 57 if(!(dpy = XOpenDisplay(0))) {
42 fputs("slock: cannot open display\n", stderr); 58 fputs("slock: cannot open display\n", stderr);
43 exit(EXIT_FAILURE); 59 exit(EXIT_FAILURE);
@@ -87,7 +103,11 @@ main(int argc, char **argv) {
87 } 103 }
88 switch(ksym) { 104 switch(ksym) {
89 case XK_Return: 105 case XK_Return:
106#if HAVE_SHADOW_H
90 if((running = strncmp(crypt(passwd, sp->sp_pwdp), sp->sp_pwdp, sizeof(passwd)))) 107 if((running = strncmp(crypt(passwd, sp->sp_pwdp), sp->sp_pwdp, sizeof(passwd))))
108#else
109 if((running = strncmp(crypt(passwd, pw->pw_passwd), pw->pw_passwd, sizeof(passwd))))
110#endif
91 XBell(dpy, 100); 111 XBell(dpy, 100);
92 passwd[0] = 0; 112 passwd[0] = 0;
93 break; 113 break;