slock

simple X display locker utility
git clone git://git.suckless.org/slock
Log | Files | Refs | README | LICENSE

commit 763e52878dba100e79c6f4a837a92e1df0d41ae0
Author: arg@suckless.org <unknown>
Date:   Wed, 11 Oct 2006 12:35:21 +0200

initial commit

Diffstat:
ALICENSE | 21+++++++++++++++++++++
AMakefile | 52++++++++++++++++++++++++++++++++++++++++++++++++++++
AREADME | 24++++++++++++++++++++++++
Aconfig.mk | 25+++++++++++++++++++++++++
Aslock.c | 92+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
5 files changed, 214 insertions(+), 0 deletions(-)

diff --git a/LICENSE b/LICENSE @@ -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 @@ -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 diff --git a/README b/README @@ -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 @@ -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} diff --git a/slock.c b/slock.c @@ -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; +}