diff options
| author | arg@suckless.org <unknown> | 2006-10-11 12:35:21 +0200 | 
|---|---|---|
| committer | arg@suckless.org <unknown> | 2006-10-11 12:35:21 +0200 | 
| commit | 763e52878dba100e79c6f4a837a92e1df0d41ae0 (patch) | |
| tree | 7cad40c95b64e52358bb5ddc3aec3589aa6c77b8 | |
| download | slock-763e52878dba100e79c6f4a837a92e1df0d41ae0.tar.gz slock-763e52878dba100e79c6f4a837a92e1df0d41ae0.tar.xz | |
initial commit
| -rw-r--r-- | LICENSE | 21 | ||||
| -rw-r--r-- | Makefile | 52 | ||||
| -rw-r--r-- | README | 24 | ||||
| -rw-r--r-- | config.mk | 25 | ||||
| -rw-r--r-- | slock.c | 92 | 
5 files changed, 214 insertions, 0 deletions
| @@ -0,0 +1,21 @@ +MIT/X Consortium License + +(C)opyright MMVI Anselm R. Garbe <garbeam at gmail dot com> + +Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and associated documentation files (the "Software"), +to deal in the Software without restriction, including without limitation +the rights to use, copy, modify, merge, publish, distribute, sublicense, +and/or sell copies of the Software, and to permit persons to whom the  +Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in  +all copies or substantial portions of the Software.  + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR  +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,  +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL  +THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER  +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING  +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER  +DEALINGS IN THE SOFTWARE. diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..a84e889 --- /dev/null +++ b/Makefile @@ -0,0 +1,52 @@ +# slock - simple screen locker +#   (C)opyright MMVI Anselm R. Garbe + +include config.mk + +SRC = slock.c +OBJ = ${SRC:.c=.o} + +all: options slock + +options: +	@echo slock build options: +	@echo "CFLAGS   = ${CFLAGS}" +	@echo "LDFLAGS  = ${LDFLAGS}" +	@echo "CC       = ${CC}" +	@echo "LD       = ${LD}" + +.c.o: +	@echo CC $< +	@${CC} -c ${CFLAGS} $< + +${OBJ}: config.mk + +slock: ${OBJ} +	@echo LD $@ +	@${LD} -o $@ ${OBJ} ${LDFLAGS} +	@strip $@ + +clean: +	@echo cleaning +	@rm -f slock ${OBJ} slock-${VERSION}.tar.gz + +dist: clean +	@echo creating dist tarball +	@mkdir -p slock-${VERSION} +	@cp -R LICENSE Makefile README config.mk ${SRC} slock-${VERSION} +	@tar -cf slock-${VERSION}.tar slock-${VERSION} +	@gzip slock-${VERSION}.tar +	@rm -rf slock-${VERSION} + +install: all +	@echo installing executable file to ${DESTDIR}${PREFIX}/bin +	@mkdir -p ${DESTDIR}${PREFIX}/bin +	@cp -f slock ${DESTDIR}${PREFIX}/bin +	@chmod 755 ${DESTDIR}${PREFIX}/bin/slock +	@chmod u+s ${DESTDIR}${PREFIX}/bin/slock + +uninstall: +	@echo removing executable file from ${DESTDIR}${PREFIX}/bin +	@rm -f ${DESTDIR}${PREFIX}/bin/slock + +.PHONY: all options clean dist install uninstall @@ -0,0 +1,24 @@ +slock - simple screen locker +============================ +simple screen locker utility for X.  + + +Requirements +------------ +In order to build slock you need the Xlib header files. + + +Installation +------------ +Edit config.mk to match your local setup (slock is installed into +the /usr/local namespace by default). + +Afterwards enter the following command to build and install slock (if +necessary as root): + +    make clean install + + +Running slock +------------- +Simply invoke the 'slock' command. diff --git a/config.mk b/config.mk new file mode 100644 index 0000000..48eef1f --- /dev/null +++ b/config.mk @@ -0,0 +1,25 @@ +# slock version +VERSION = 0.1 + +# Customize below to fit your system + +# paths +PREFIX = /usr/local +MANPREFIX = ${PREFIX}/share/man + +X11INC = /usr/X11R6/include +X11LIB = /usr/X11R6/lib + +# includes and libs +INCS = -I. -I/usr/include -I${X11INC} +LIBS = -L/usr/lib -lc -lcrypt -L${X11LIB} -lX11 + +# flags +CFLAGS = -Os ${INCS} -DVERSION=\"${VERSION}\" +LDFLAGS = ${LIBS} +#CFLAGS = -g -Wall -O2 ${INCS} -DVERSION=\"${VERSION}\" +#LDFLAGS = -g ${LIBS} + +# compiler and linker +CC = cc +LD = ${CC} @@ -0,0 +1,92 @@ +/* (C)opyright MMIV-MMV Anselm R. Garbe <garbeam at gmail dot com> + * See LICENSE file for license details. + */ +#define _XOPEN_SOURCE +#include <shadow.h> +#include <stdlib.h> +#include <stdio.h> +#include <string.h> +#include <unistd.h> +#include <sys/types.h> +#include <X11/keysym.h> +#include <X11/Xlib.h> +#include <X11/Xutil.h> + +int +main(int argc, char **argv) { +	char buf[32], passwd[256]; +	int num, prev_nitem; +	struct spwd *sp; +	unsigned int i, len; +	Bool running = True; +	KeySym ksym; +	Display *dpy; +	XEvent ev; + +	if((argc > 1) && !strncmp(argv[1], "-v", 3)) { +		fputs("slock-"VERSION", (C)opyright MMVI Anselm R. Garbe\n", stdout); +		exit(EXIT_SUCCESS); +	} +	if(!(sp = getspnam(getenv("USER")))) { +		fputs("slock: cannot retrieve password entry (make sure to suid slock)\n", stderr); +		exit(EXIT_FAILURE); +	} +	endspent(); +	if(!(dpy = XOpenDisplay(0))) { +		fputs("slock: cannot open display\n", stderr); +		exit(EXIT_FAILURE); +	} + +	/* init */ +	passwd[0] = 0; +	while(XGrabKeyboard(dpy, DefaultRootWindow(dpy), True, GrabModeAsync, +			 GrabModeAsync, CurrentTime) != GrabSuccess) +		usleep(1000); + +	/* 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, 0); +			if(IsFunctionKey(ksym) || IsKeypadKey(ksym) +					|| IsMiscFunctionKey(ksym) || IsPFKey(ksym) +					|| IsPrivateKeypadKey(ksym)) +				continue; +			/* first check if a control mask is omitted */ +			if(ev.xkey.state & ControlMask) { +				switch (ksym) { +				case XK_h: +				case XK_H: ksym = XK_BackSpace; +					break; +				case XK_u: +				case XK_U: passwd[0] = 0; +					continue; +				} +			} +			switch(ksym) { +			case XK_Return: +				running = strncmp(crypt(passwd, sp->sp_pwdp), sp->sp_pwdp, sizeof(passwd)); +				passwd[0] = 0; +				break; +			case XK_Escape: +				passwd[0] = 0; +				break; +			case XK_BackSpace: +				if(len) +					passwd[--len] = 0; +				break; +			default: +				if(num && !iscntrl((int) buf[0])) { +					buf[num] = 0; +					if(len) +						strncat(passwd, buf, sizeof(passwd)); +					else +						strncpy(passwd, buf, sizeof(passwd)); +				} +				break; +			} +		} +	XCloseDisplay(dpy); +	return 0; +} | 
