|
|
@ -94,20 +94,18 @@ getpw(void) |
|
|
|
struct passwd *pw; |
|
|
|
struct passwd *pw; |
|
|
|
|
|
|
|
|
|
|
|
errno = 0; |
|
|
|
errno = 0; |
|
|
|
pw = getpwuid(getuid()); |
|
|
|
if (!(pw = getpwuid(getuid()))) { |
|
|
|
if (!pw) { |
|
|
|
|
|
|
|
if (errno) |
|
|
|
if (errno) |
|
|
|
die("slock: getpwuid: %s\n", strerror(errno)); |
|
|
|
die("slock: getpwuid: %s\n", strerror(errno)); |
|
|
|
else |
|
|
|
else |
|
|
|
die("slock: cannot retrieve password entry\n"); |
|
|
|
die("slock: cannot retrieve password entry\n"); |
|
|
|
} |
|
|
|
} |
|
|
|
rval = pw->pw_passwd; |
|
|
|
rval = pw->pw_passwd; |
|
|
|
|
|
|
|
|
|
|
|
#if HAVE_SHADOW_H |
|
|
|
#if HAVE_SHADOW_H |
|
|
|
if (rval[0] == 'x' && rval[1] == '\0') { |
|
|
|
if (rval[0] == 'x' && rval[1] == '\0') { |
|
|
|
struct spwd *sp; |
|
|
|
struct spwd *sp; |
|
|
|
sp = getspnam(getenv("USER")); |
|
|
|
if (!(sp = getspnam(getenv("USER")))) |
|
|
|
if (!sp) |
|
|
|
|
|
|
|
die("slock: cannot retrieve shadow entry (make sure to suid or sgid slock)\n"); |
|
|
|
die("slock: cannot retrieve shadow entry (make sure to suid or sgid slock)\n"); |
|
|
|
rval = sp->sp_pwdp; |
|
|
|
rval = sp->sp_pwdp; |
|
|
|
} |
|
|
|
} |
|
|
@ -180,7 +178,7 @@ readpw(Display *dpy, const char *pws) |
|
|
|
--len; |
|
|
|
--len; |
|
|
|
break; |
|
|
|
break; |
|
|
|
default: |
|
|
|
default: |
|
|
|
if (num && !iscntrl((int) buf[0]) && (len + num < sizeof(passwd))) { |
|
|
|
if (num && !iscntrl((int)buf[0]) && (len + num < sizeof(passwd))) { |
|
|
|
memcpy(passwd + len, buf, num); |
|
|
|
memcpy(passwd + len, buf, num); |
|
|
|
len += num; |
|
|
|
len += num; |
|
|
|
} |
|
|
|
} |
|
|
@ -232,15 +230,10 @@ lockscreen(Display *dpy, int screen) |
|
|
|
XSetWindowAttributes wa; |
|
|
|
XSetWindowAttributes wa; |
|
|
|
Cursor invisible; |
|
|
|
Cursor invisible; |
|
|
|
|
|
|
|
|
|
|
|
if (dpy == NULL || screen < 0) |
|
|
|
if (dpy == NULL || screen < 0 || !(lock = malloc(sizeof(Lock)))) |
|
|
|
return NULL; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
lock = malloc(sizeof(Lock)); |
|
|
|
|
|
|
|
if (lock == NULL) |
|
|
|
|
|
|
|
return NULL; |
|
|
|
return NULL; |
|
|
|
|
|
|
|
|
|
|
|
lock->screen = screen; |
|
|
|
lock->screen = screen; |
|
|
|
|
|
|
|
|
|
|
|
lock->root = RootWindow(dpy, lock->screen); |
|
|
|
lock->root = RootWindow(dpy, lock->screen); |
|
|
|
|
|
|
|
|
|
|
|
for (i = 0; i < NUMCOLS; i++) { |
|
|
|
for (i = 0; i < NUMCOLS; i++) { |
|
|
@ -266,7 +259,7 @@ lockscreen(Display *dpy, int screen) |
|
|
|
break; |
|
|
|
break; |
|
|
|
usleep(1000); |
|
|
|
usleep(1000); |
|
|
|
} |
|
|
|
} |
|
|
|
if (running && (len > 0)) { |
|
|
|
if (running && len) { |
|
|
|
for (len = 1000; len; len--) { |
|
|
|
for (len = 1000; len; len--) { |
|
|
|
if (XGrabKeyboard(dpy, lock->root, True, GrabModeAsync, GrabModeAsync, CurrentTime) == GrabSuccess) |
|
|
|
if (XGrabKeyboard(dpy, lock->root, True, GrabModeAsync, GrabModeAsync, CurrentTime) == GrabSuccess) |
|
|
|
break; |
|
|
|
break; |
|
|
@ -278,8 +271,7 @@ lockscreen(Display *dpy, int screen) |
|
|
|
if (!running) { |
|
|
|
if (!running) { |
|
|
|
unlockscreen(dpy, lock); |
|
|
|
unlockscreen(dpy, lock); |
|
|
|
lock = NULL; |
|
|
|
lock = NULL; |
|
|
|
} |
|
|
|
} else { |
|
|
|
else { |
|
|
|
|
|
|
|
XSelectInput(dpy, lock->root, SubstructureNotifyMask); |
|
|
|
XSelectInput(dpy, lock->root, SubstructureNotifyMask); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
@ -323,12 +315,11 @@ main(int argc, char **argv) { |
|
|
|
rr = XRRQueryExtension(dpy, &rrevbase, &rrerrbase); |
|
|
|
rr = XRRQueryExtension(dpy, &rrevbase, &rrerrbase); |
|
|
|
/* Get the number of screens in display "dpy" and blank them all. */ |
|
|
|
/* Get the number of screens in display "dpy" and blank them all. */ |
|
|
|
nscreens = ScreenCount(dpy); |
|
|
|
nscreens = ScreenCount(dpy); |
|
|
|
locks = malloc(sizeof(Lock *) * nscreens); |
|
|
|
if (!(locks = malloc(sizeof(Lock*) * nscreens))) |
|
|
|
if (locks == NULL) |
|
|
|
|
|
|
|
die("slock: malloc: %s\n", strerror(errno)); |
|
|
|
die("slock: malloc: %s\n", strerror(errno)); |
|
|
|
int nlocks = 0; |
|
|
|
int nlocks = 0; |
|
|
|
for (screen = 0; screen < nscreens; screen++) { |
|
|
|
for (screen = 0; screen < nscreens; screen++) { |
|
|
|
if ( (locks[screen] = lockscreen(dpy, screen)) != NULL) |
|
|
|
if ((locks[screen] = lockscreen(dpy, screen)) != NULL) |
|
|
|
nlocks++; |
|
|
|
nlocks++; |
|
|
|
} |
|
|
|
} |
|
|
|
XSync(dpy, False); |
|
|
|
XSync(dpy, False); |
|
|
|