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; +} |