| initial commit - slock - simple X display locker utility | |
| git clone git://git.suckless.org/slock | |
| Log | |
| Files | |
| Refs | |
| README | |
| LICENSE | |
| --- | |
| commit 763e52878dba100e79c6f4a837a92e1df0d41ae0 | |
| Author: [email protected] <unknown> | |
| Date: Wed, 11 Oct 2006 12:35:21 +0200 | |
| initial commit | |
| Diffstat: | |
| A LICENSE | 21 +++++++++++++++++++++ | |
| A Makefile | 52 +++++++++++++++++++++++++++++… | |
| A README | 24 ++++++++++++++++++++++++ | |
| A config.mk | 25 +++++++++++++++++++++++++ | |
| A slock.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", s… | |
| + exit(EXIT_SUCCESS); | |
| + } | |
| + if(!(sp = getspnam(getenv("USER")))) { | |
| + fputs("slock: cannot retrieve password entry (make sure to sui… | |
| + 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,… | |
| + if(IsFunctionKey(ksym) || IsKeypadKey(ksym) | |
| + || IsMiscFunctionKey(ksym) || IsPFKey(… | |
| + || 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), … | |
| + 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(pa… | |
| + else | |
| + strncpy(passwd, buf, sizeof(pa… | |
| + } | |
| + break; | |
| + } | |
| + } | |
| + XCloseDisplay(dpy); | |
| + return 0; | |
| +} |