applied Dimitris' style patch from Dec'14, with some minor modifications
This commit is contained in:
		
							parent
							
								
									66e31556db
								
							
						
					
					
						commit
						a31b919111
					
				
							
								
								
									
										106
									
								
								slock.c
									
									
									
									
									
								
							
							
						
						
									
										106
									
								
								slock.c
									
									
									
									
									
								
							| @ -1,4 +1,3 @@ | |||||||
| 
 |  | ||||||
| /* 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 | ||||||
| @ -37,20 +36,22 @@ static int nscreens; | |||||||
| static Bool running = True; | static Bool running = True; | ||||||
| 
 | 
 | ||||||
| static void | static void | ||||||
| die(const char *errstr, ...) { | die(const char *errstr, ...) | ||||||
|  | { | ||||||
| 	va_list ap; | 	va_list ap; | ||||||
| 
 | 
 | ||||||
| 	va_start(ap, errstr); | 	va_start(ap, errstr); | ||||||
| 	vfprintf(stderr, errstr, ap); | 	vfprintf(stderr, errstr, ap); | ||||||
| 	va_end(ap); | 	va_end(ap); | ||||||
| 	exit(EXIT_FAILURE); | 	exit(1); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| #ifdef __linux__ | #ifdef __linux__ | ||||||
| #include <fcntl.h> | #include <fcntl.h> | ||||||
| 
 | 
 | ||||||
| static void | static void | ||||||
| dontkillme(void) { | dontkillme(void) | ||||||
|  | { | ||||||
| 	int fd; | 	int fd; | ||||||
| 
 | 
 | ||||||
| 	fd = open("/proc/self/oom_score_adj", O_WRONLY); | 	fd = open("/proc/self/oom_score_adj", O_WRONLY); | ||||||
| @ -62,8 +63,10 @@ dontkillme(void) { | |||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
| #ifndef HAVE_BSD_AUTH | #ifndef HAVE_BSD_AUTH | ||||||
|  | /* only run as root */ | ||||||
| static const char * | static const char * | ||||||
| getpw(void) { /* only run as root */ | getpw(void) | ||||||
|  | { | ||||||
| 	const char *rval; | 	const char *rval; | ||||||
| 	struct passwd *pw; | 	struct passwd *pw; | ||||||
| 
 | 
 | ||||||
| @ -73,7 +76,7 @@ getpw(void) { /* only run as root */ | |||||||
| 		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 (make sure to suid or sgid slock)\n"); | 			die("slock: cannot retrieve password entry\n"); | ||||||
| 	} | 	} | ||||||
| 	rval =  pw->pw_passwd; | 	rval =  pw->pw_passwd; | ||||||
| 
 | 
 | ||||||
| @ -81,15 +84,15 @@ getpw(void) { /* only run as root */ | |||||||
| 	if (rval[0] == 'x' && rval[1] == '\0') { | 	if (rval[0] == 'x' && rval[1] == '\0') { | ||||||
| 		struct spwd *sp; | 		struct spwd *sp; | ||||||
| 		sp = getspnam(getenv("USER")); | 		sp = getspnam(getenv("USER")); | ||||||
| 		if(!sp) | 		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; | ||||||
| 	} | 	} | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
| 	/* drop privileges */ | 	/* drop privileges */ | ||||||
| 	if (geteuid() == 0 | 	if (geteuid() == 0 && | ||||||
| 	   && ((getegid() != pw->pw_gid && setgid(pw->pw_gid) < 0) || setuid(pw->pw_uid) < 0)) | 	    ((getegid() != pw->pw_gid && setgid(pw->pw_gid) < 0) || setuid(pw->pw_uid) < 0)) | ||||||
| 		die("slock: cannot drop privileges\n"); | 		die("slock: cannot drop privileges\n"); | ||||||
| 	return rval; | 	return rval; | ||||||
| } | } | ||||||
| @ -115,21 +118,23 @@ readpw(Display *dpy, const char *pws) | |||||||
| 	 * had been removed and you can set it with "xset" or some other | 	 * had been removed and you can set it with "xset" or some other | ||||||
| 	 * utility. This way the user can easily set a customized DPMS | 	 * utility. This way the user can easily set a customized DPMS | ||||||
| 	 * timeout. */ | 	 * timeout. */ | ||||||
| 	while(running && !XNextEvent(dpy, &ev)) { | 	while (running && !XNextEvent(dpy, &ev)) { | ||||||
| 		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); | ||||||
| 			if(IsKeypadKey(ksym)) { | 			if (IsKeypadKey(ksym)) { | ||||||
| 				if(ksym == XK_KP_Enter) | 				if (ksym == XK_KP_Enter) | ||||||
| 					ksym = XK_Return; | 					ksym = XK_Return; | ||||||
| 				else if(ksym >= XK_KP_0 && ksym <= XK_KP_9) | 				else if (ksym >= XK_KP_0 && ksym <= XK_KP_9) | ||||||
| 					ksym = (ksym - XK_KP_0) + XK_0; | 					ksym = (ksym - XK_KP_0) + XK_0; | ||||||
| 			} | 			} | ||||||
| 			if(IsFunctionKey(ksym) || IsKeypadKey(ksym) | 			if (IsFunctionKey(ksym) || | ||||||
| 					|| IsMiscFunctionKey(ksym) || IsPFKey(ksym) | 			    IsKeypadKey(ksym) || | ||||||
| 					|| IsPrivateKeypadKey(ksym)) | 			    IsMiscFunctionKey(ksym) || | ||||||
|  | 			    IsPFKey(ksym) || | ||||||
|  | 			    IsPrivateKeypadKey(ksym)) | ||||||
| 				continue; | 				continue; | ||||||
| 			switch(ksym) { | 			switch (ksym) { | ||||||
| 			case XK_Return: | 			case XK_Return: | ||||||
| 				passwd[len] = 0; | 				passwd[len] = 0; | ||||||
| #ifdef HAVE_BSD_AUTH | #ifdef HAVE_BSD_AUTH | ||||||
| @ -137,7 +142,7 @@ readpw(Display *dpy, const char *pws) | |||||||
| #else | #else | ||||||
| 				running = !!strcmp(crypt(passwd, pws), pws); | 				running = !!strcmp(crypt(passwd, pws), pws); | ||||||
| #endif | #endif | ||||||
| 				if(running) | 				if (running) | ||||||
| 					XBell(dpy, 100); | 					XBell(dpy, 100); | ||||||
| 				len = 0; | 				len = 0; | ||||||
| 				break; | 				break; | ||||||
| @ -145,36 +150,37 @@ readpw(Display *dpy, const char *pws) | |||||||
| 				len = 0; | 				len = 0; | ||||||
| 				break; | 				break; | ||||||
| 			case XK_BackSpace: | 			case XK_BackSpace: | ||||||
| 				if(len) | 				if (len) | ||||||
| 					--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; | ||||||
| 				} | 				} | ||||||
| 				break; | 				break; | ||||||
| 			} | 			} | ||||||
| 			if(llen == 0 && len != 0) { | 			if (llen == 0 && len != 0) { | ||||||
| 				for(screen = 0; screen < nscreens; screen++) { | 				for (screen = 0; screen < nscreens; screen++) { | ||||||
| 					XSetWindowBackground(dpy, locks[screen]->win, locks[screen]->colors[1]); | 					XSetWindowBackground(dpy, locks[screen]->win, locks[screen]->colors[1]); | ||||||
| 					XClearWindow(dpy, locks[screen]->win); | 					XClearWindow(dpy, locks[screen]->win); | ||||||
| 				} | 				} | ||||||
| 			} else if(llen != 0 && len == 0) { | 			} else if (llen != 0 && len == 0) { | ||||||
| 				for(screen = 0; screen < nscreens; screen++) { | 				for (screen = 0; screen < nscreens; screen++) { | ||||||
| 					XSetWindowBackground(dpy, locks[screen]->win, locks[screen]->colors[0]); | 					XSetWindowBackground(dpy, locks[screen]->win, locks[screen]->colors[0]); | ||||||
| 					XClearWindow(dpy, locks[screen]->win); | 					XClearWindow(dpy, locks[screen]->win); | ||||||
| 				} | 				} | ||||||
| 			} | 			} | ||||||
| 			llen = len; | 			llen = len; | ||||||
| 		} | 		} | ||||||
| 		else for(screen = 0; screen < nscreens; screen++) | 		else for (screen = 0; screen < nscreens; screen++) | ||||||
| 			XRaiseWindow(dpy, locks[screen]->win); | 			XRaiseWindow(dpy, locks[screen]->win); | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| static void | static void | ||||||
| unlockscreen(Display *dpy, Lock *lock) { | unlockscreen(Display *dpy, Lock *lock) | ||||||
|  | { | ||||||
| 	if(dpy == NULL || lock == NULL) | 	if(dpy == NULL || lock == NULL) | ||||||
| 		return; | 		return; | ||||||
| 
 | 
 | ||||||
| @ -187,7 +193,8 @@ unlockscreen(Display *dpy, Lock *lock) { | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| static Lock * | static Lock * | ||||||
| lockscreen(Display *dpy, int screen) { | lockscreen(Display *dpy, int screen) | ||||||
|  | { | ||||||
| 	char curs[] = {0, 0, 0, 0, 0, 0, 0, 0}; | 	char curs[] = {0, 0, 0, 0, 0, 0, 0, 0}; | ||||||
| 	unsigned int len; | 	unsigned int len; | ||||||
| 	Lock *lock; | 	Lock *lock; | ||||||
| @ -195,11 +202,11 @@ lockscreen(Display *dpy, int screen) { | |||||||
| 	XSetWindowAttributes wa; | 	XSetWindowAttributes wa; | ||||||
| 	Cursor invisible; | 	Cursor invisible; | ||||||
| 
 | 
 | ||||||
| 	if(dpy == NULL || screen < 0) | 	if (dpy == NULL || screen < 0) | ||||||
| 		return NULL; | 		return NULL; | ||||||
| 
 | 
 | ||||||
| 	lock = malloc(sizeof(Lock)); | 	lock = malloc(sizeof(Lock)); | ||||||
| 	if(lock == NULL) | 	if (lock == NULL) | ||||||
| 		return NULL; | 		return NULL; | ||||||
| 
 | 
 | ||||||
| 	lock->screen = screen; | 	lock->screen = screen; | ||||||
| @ -220,36 +227,37 @@ lockscreen(Display *dpy, int screen) { | |||||||
| 	invisible = XCreatePixmapCursor(dpy, lock->pmap, lock->pmap, &color, &color, 0, 0); | 	invisible = XCreatePixmapCursor(dpy, lock->pmap, lock->pmap, &color, &color, 0, 0); | ||||||
| 	XDefineCursor(dpy, lock->win, invisible); | 	XDefineCursor(dpy, lock->win, invisible); | ||||||
| 	XMapRaised(dpy, lock->win); | 	XMapRaised(dpy, lock->win); | ||||||
| 	for(len = 1000; len; len--) { | 	for (len = 1000; len; len--) { | ||||||
| 		if(XGrabPointer(dpy, lock->root, False, ButtonPressMask | ButtonReleaseMask | PointerMotionMask, | 		if (XGrabPointer(dpy, lock->root, False, ButtonPressMask | ButtonReleaseMask | PointerMotionMask, | ||||||
| 		    GrabModeAsync, GrabModeAsync, None, invisible, CurrentTime) == GrabSuccess) | 		    GrabModeAsync, GrabModeAsync, None, invisible, CurrentTime) == GrabSuccess) | ||||||
| 			break; | 			break; | ||||||
| 		usleep(1000); | 		usleep(1000); | ||||||
| 	} | 	} | ||||||
| 	if(running && (len > 0)) { | 	if (running && (len > 0)) { | ||||||
| 		for(len = 1000; len; len--) { | 		for (len = 1000; len; len--) { | ||||||
| 			if(XGrabKeyboard(dpy, lock->root, True, GrabModeAsync, GrabModeAsync, CurrentTime) | 			if (XGrabKeyboard(dpy, lock->root, True, GrabModeAsync, GrabModeAsync, CurrentTime) == GrabSuccess) | ||||||
| 				== GrabSuccess) |  | ||||||
| 				break; | 				break; | ||||||
| 			usleep(1000); | 			usleep(1000); | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	running &= (len > 0); | 	running &= (len > 0); | ||||||
| 	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); | ||||||
|  | 	} | ||||||
| 
 | 
 | ||||||
| 	return lock; | 	return lock; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| static void | static void | ||||||
| usage(void) { | usage(void) | ||||||
|  | { | ||||||
| 	fprintf(stderr, "usage: slock [-v]\n"); | 	fprintf(stderr, "usage: slock [-v]\n"); | ||||||
| 	exit(EXIT_FAILURE); | 	exit(1); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| int | int | ||||||
| @ -260,38 +268,38 @@ main(int argc, char **argv) { | |||||||
| 	Display *dpy; | 	Display *dpy; | ||||||
| 	int screen; | 	int screen; | ||||||
| 
 | 
 | ||||||
| 	if((argc == 2) && !strcmp("-v", argv[1])) | 	if ((argc == 2) && !strcmp("-v", argv[1])) | ||||||
| 		die("slock-%s, © 2006-2014 slock engineers\n", VERSION); | 		die("slock-%s, © 2006-2015 slock engineers\n", VERSION); | ||||||
| 	else if(argc != 1) | 	else if (argc != 1) | ||||||
| 		usage(); | 		usage(); | ||||||
| 
 | 
 | ||||||
| #ifdef __linux__ | #ifdef __linux__ | ||||||
| 	dontkillme(); | 	dontkillme(); | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
| 	if(!getpwuid(getuid())) | 	if (!getpwuid(getuid())) | ||||||
| 		die("slock: no passwd entry for you\n"); | 		die("slock: no passwd entry for you\n"); | ||||||
| 
 | 
 | ||||||
| #ifndef HAVE_BSD_AUTH | #ifndef HAVE_BSD_AUTH | ||||||
| 	pws = getpw(); | 	pws = getpw(); | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
| 	if(!(dpy = XOpenDisplay(0))) | 	if (!(dpy = XOpenDisplay(0))) | ||||||
| 		die("slock: cannot open display\n"); | 		die("slock: cannot open display\n"); | ||||||
| 	/* 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); | 	locks = malloc(sizeof(Lock *) * nscreens); | ||||||
| 	if(locks == NULL) | 	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); | ||||||
| 
 | 
 | ||||||
| 	/* Did we actually manage to lock something? */ | 	/* Did we actually manage to lock something? */ | ||||||
| 	if (nlocks == 0) { // nothing to protect
 | 	if (nlocks == 0) { /* nothing to protect */ | ||||||
| 		free(locks); | 		free(locks); | ||||||
| 		XCloseDisplay(dpy); | 		XCloseDisplay(dpy); | ||||||
| 		return 1; | 		return 1; | ||||||
| @ -305,7 +313,7 @@ main(int argc, char **argv) { | |||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
| 	/* Password ok, unlock everything and quit. */ | 	/* Password ok, unlock everything and quit. */ | ||||||
| 	for(screen = 0; screen < nscreens; screen++) | 	for (screen = 0; screen < nscreens; screen++) | ||||||
| 		unlockscreen(dpy, locks[screen]); | 		unlockscreen(dpy, locks[screen]); | ||||||
| 
 | 
 | ||||||
| 	free(locks); | 	free(locks); | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Anselm R Garbe
						Anselm R Garbe